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"
)