FOR コマンドは、括弧または行継続を使用しない限り、複数の行にまたがることはできません^
。最初の開き括弧は IN と同じ行に、2 番目の開き括弧は DO と同じ行になければなりません。
値を設定するかっこで囲まれたコード ブロック内で通常の展開を使用することはできません。これは、展開が解析時に発生し、ブロック全体が一度に解析されるためです。したがって、値は、設定する前に存在していた値になります! 解決策は、遅延展開を使用することです。これは、行が実行されたときに発生します。で有効にする必要がありますsetlocal enableDelayedExpansion
。
!
はファイル名内で有効であり、遅延展開が有効になっている場合に FOR 変数の展開が破損するため、遅延展開は問題を引き起こします!
。解決策は、ループ内で遅延展開のオンとオフを切り替えることです。
オプションなしの単純な FOR が必要です。この/D
オプションは、ファイルではなくディレクトリを探します。
SET /A
ステートメント内で数値変数を展開する必要はありません。
最後にもう 1 つ -@
使用後は必要ありませんECHO OFF
。
@echo off
setlocal disableDelayedExpansion
set "n=0"
set "pref=document"
for %%F in (c:\*.txt) do (
set "file=%%F"
set /a n+=1
setlocal enableDelayedExpansion
ren "!file!" "%pref%!n!.txt"
endlocal
)
このタスクを実行するためのより簡単な方法があります。DIR /B
すべての.txt
ファイルを一覧表示し、結果を にパイプするために使用しますFINSTDR /N "^"
。FINDSTR はすべてのファイルに一致し、各値の前に連番とそれに続くコロンを付けます。FOR /F を使用して結果を数値とファイル名に解析し、RENAME できるようにします。
@echo off
setlocal
set "pref=document"
for /f "tokens=1* delims=:" %%A in ('dir /b /a-d *.txt^|findstr /n "^"') do (
ren "%%B" "%pref%%%A.txt"
)