0

コマンドラインで、あるファイルの出力を別のファイルにフォーマットしようとしています。

FOR /F %i IN (list.txt) DO set num=%i && echo %num:~0,2% %num:~2,2% %num:~4,4% _  _____ >>temp.txt

list.txt の内容

41460729
41640140

望ましい出力:

41 46 0729 _ ____
41 64 0140 _ ____

初めて実行すると、次のようになります。

%num:~0,2% %num:~2,2% %num:~4,4% _  _____
%num:~0,2% %num:~2,2% %num:~4,4% _  _____ 

二度目に私が得る:

41 64 0140 _ ______ 
41 64 0140 _ ______

なぜ%num%正しく動作しないのかわかりません。

4

1 に答える 1

1

これは、行が解析されるときにパーセントを使用した通常の展開が発生し、ループが実行される前に 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 つのリダイレクトのみを強制する方が高速です。

于 2013-11-06T22:29:33.250 に答える