これは、行が解析されるときにパーセントを使用した通常の展開が発生し、ループが実行される前に FOR ステートメント全体が解析されるため、num
変数がまだ設定されていないためです。
2 回目に実行すると、num
変数は前回の実行の最後の繰り返しから既に定義されています。したがって、反復ごとに同じ値が得られます。
コマンドラインには便利な解決策が 1 つあります。
CALL は、反復ごとに発生する別のレベルの解析を導入します。^
初期の解析段階で既存の値が展開されるのを防ぐために、各変数展開内にキャレット ( ) が含まれています。最初の解析でキャレットが削除され、反復ごとに値が適切に展開されます。
FOR /F %i IN (list.txt) DO set num=%i & call echo %^num:~0,2% %^num:~2,2% %^num:~4,4% _ _____ >>temp.txt
バッチ ファイルを使用すると状況が変わります。2 つの便利なバッチ ソリューションがあります。
1) 以前と同様に CALL を使用しますが、構文が変わります。バッチでは、最初の解析段階で値が拡大しないように、パーセントを 2 倍にする必要があります。
FOR /F %%i IN (list.txt) DO set num=%%i & call echo %%num:~0,2%% %%num:~2,2%% %%num:~4,4%% _ _____ >>temp.txt
2) 実行時に発生する遅延展開を使用します。これは非常に高速で、一般的に CALL メソッドよりも優先されます。
setlocal enableDelayedExpansion
FOR /F %%i IN (list.txt) DO set num=%%i & call echo !num:~0,2! !num:~2,2! !num:~4,4! _ _____ >>temp.txt
注 - どの方法を使用する場合でも、リダイレクトを 1 回実行するだけでパフォーマンスを向上させることができます。上記のコードは、反復ごとにリダイレクトを実行するため、プロセスが遅くなります。リダイレクトを 1 回だけ行う>
と、ファイルが空で始まるように使用することもできます。以下の遅延展開方法を使用しますが、どれでも機能します。
setlocal enableDelayedExpansion
(FOR /F %%i IN (list.txt) DO set num=%%i & call echo !num:~0,2! !num:~2,2! !num:~4,4! _ _____ ) >temp.txt
ループの前に存在する可能性のある既存のデータに本当に追加したい場合は、使用>>
に戻すことができますが、括弧を追加して 1 つのリダイレクトのみを強制する方が高速です。