約1000枚の画像があり、「IMG-12223」のような名前が付いています。それらの名前を1 2 3 4 ... 1000に変更したいと思います。ファイルを一覧表示するバッチスクリプトを作成しましたが、各ファイルの名前を変更する方法がわかりません。例えば「IMG-12223」という名前の最初の画像の名前を1に、「IMG-23441」という名前の2番目の画像の名前を2などに変更します。
for /r %%i in (*) do (
echo %c%
)
これがスクリプトです。スクリプトをフォルダーに入れて実行するだけです。
_@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ファイル? をご覧ください。
バッチスクリプトは必要ありません。コマンドラインからの簡単なワンライナーで仕事をすることができます:-)
DIR/Bを使用してファイルのリストを生成し、FINDSTRにパイプしてファイルに番号を付けます。すべてをFOR/Fで囲んで結果を解析し、名前を変更します。
for /f "delims=: tokens=1*" %A in ('dir /b *.jpg^|findstr /n "^"') do @ren "%B" "%A%~xB"
コマンドをバッチスクリプトに入れる場合は、パーセントを2倍にします。
これを試してください。テキストファイルに名前と値のペアがあり、値をループして魔法をかけます。名前と値は空のスペースで区切られます。これにより、古いファイル名から新しいファイル名へのマッピングが可能になります。または、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