web-dev-qa-db-ja.com

バッチスクリプトを使用してディレクトリ内の複数のファイルの名前を変更する

約1000枚の画像があり、「IMG-12223」のような名前が付いています。それらの名前を1 2 3 4 ... 1000に変更したいと思います。ファイルを一覧表示するバッチスクリプトを作成しましたが、各ファイルの名前を変更する方法がわかりません。例えば「IMG-12223」という名前の最初の画像の名前を1に、「IMG-23441」という名前の2番目の画像の名前を2などに変更します。

for /r %%i in (*) do (
    echo %c% 
)
8
Jack Mc Lauren

これがスクリプトです。スクリプトをフォルダーに入れて実行するだけです。

_@echo off & setlocal EnableDelayedExpansion 

set a=1
for /f "delims=" %%i in ('dir /b *') do (
  if not "%%~nxi"=="%~nx0" (
    ren "%%i" "!a!" 
    set /a a+=1
 ) 
) 
_

拡張機能を保持する場合、つまり「IMG-12223.jpg」、「IMG-12224.jpg」などの名前を「1.jpg」、「2.jpg」などに変更するには、次のスクリプトを使用できます。

_@echo off & setlocal EnableDelayedExpansion 

set a=1
for /f "delims=" %%i in ('dir /b *.jpg') do (
  ren "%%i" "!a!.jpg" 
  set /a a+=1
) 
_

[Update]ジャックのコメントで言及されている行の説明は次のとおりです。

  • _setlocal EnableDelayedExpansion_

一般に、変数aは実行時に展開が遅延されますが、行は読み取られません。それがないと、変数aは増加した値を取得できませんが、常に1になります。

EnableDelayedExpansionの詳細については、回答 https://stackoverflow.com/a/18464353/2749114 を参照してください。

  • for /f "delims=" %%i in ('dir /b *.jpg')

ここでdirと_/b_オプションを使用すると、すべてのjpgファイルのファイル名のみがリストされます。

forループは、すべてのjpgファイルを走査して名前を変更します。

delimsオプションの場合、デフォルトの区切り文字はスペースであるため、オプション_delims=_を使用しないと、ファイル名にスペースが含まれるイメージファイルでは失敗します。 I.E.オプションなしの「img with space.jpg」という名前の画像ファイルの場合、_%%i_の値は「img」ですが、名前全体「img with space.jpg」ではなく、これは正しくありません。

forループについては、ページ http://ss64.com/nt/for_f.html を参照してください。

  • _if not "%%~ni"=="%~n0"_

より正確にするために、これを_if not "%%~nxi"=="%~nx0"_に変更しました。そして、添付されているコードが更新されました。

実際には、batファイル自体の名前変更を回避するために使用されます。 「jpg」ファイルのみの名前変更を制限する場合、行は不要です。

_%%~nxi_は、通過した各ファイルの拡張子付きのファイル名です。また、_%~nx0_は、拡張子が付いた実行中のbatファイルです。詳しくは、ページ nix basenameコマンドに相当するDOS BATファイル? をご覧ください。

12
Landys

バッチスクリプトは必要ありません。コマンドラインからの簡単なワンライナーで仕事をすることができます:-)

DIR/Bを使用してファイルのリストを生成し、FINDSTRにパイプしてファイルに番号を付けます。すべてをFOR/Fで囲んで結果を解析し、名前を変更します。

for /f "delims=: tokens=1*" %A in ('dir /b *.jpg^|findstr /n "^"') do @ren "%B" "%A%~xB"

コマンドをバッチスクリプトに入れる場合は、パーセントを2倍にします。

7
dbenham

これを試してください。テキストファイルに名前と値のペアがあり、値をループして魔法をかけます。名前と値は空のスペースで区切られます。これにより、古いファイル名から新しいファイル名へのマッピングが可能になります。または、idx + 1カウンターを保持し、それを新しいファイル名に使用します。

keyvalue.bat

@echo off
set idx=0
for /F "tokens=1,2" %%A in (keyvalue.txt) do call :PROCESS "%%A"  "%%B"
GOTO :END

:PROCESS
set var1=%~1
set var2=%~2
set /A idx=%idx%+1
echo %var1% goes to %var2% (%idx%)
GOTO :EOF

:END
pause

keyvalue.txt

file888.dat  newfile1.dat
file333.dat  newfile2.dat
file9.dat    newfile3.dat
file01.dat   newfile4.dat
0
Whome