- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:バッチファイル 2ファイルをfor /f処理したい)
バッチファイルで2つのファイルをfor /f処理する方法
このQ&Aのポイント
- バッチファイルで2つのファイルをfor /f処理する方法について教えてください。
- 変換前のファイル名と変換後のファイル名が別のファイルに書かれており、これらのファイルを読み込んでリネームするバッチファイルを作成したいです。
- 2つのfor /fを使って処理を行おうとするとネストされてしまいますが、この場合はどのように記述すれば良いでしょうか。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
配列に覚える感じですね。 setlocal enabledelayedexpansion set N=0 for /f %%A in (s.txt) do call :set "%%A" set N=0 for /f %%A in (d.txt) do call :ren "%%A" goto :EOF :set set /a N+=1 set FOO%N%=%~1 goto :EOF :ren set /a N+=1 call ren !FOO%N%! %~1 goto :EOF
その他の回答 (1)
- notnot
- ベストアンサー率47% (4900/10358)
回答No.2
1.遅延評価を使ったので、call は不要でした。 2.遅延評価を使ったのはforとは関係ないです。 まず%による変数展開をしてから、その結果を使って!による変数展開をするという、2段階の展開をするためです。 echo !FOO%N%! または、 call echo %%FOO%N%%% と、callによって2段階の展開が出来ます。
質問者
お礼
ren "!FOO%N%!" "%~1" の部分を2段階に展開するために、 遅延評価を使っていたというわけですね。 この部分を、 call ren "%%FOO%N%%%" "%~1" というように記述すると、 同様に2段階に展開されるため、 遅延評価を使わなくてもよいということですね。 とても参考になりました。 大変分かりやすい回答ありがとうございました。
お礼
教えて頂きましたコードでは、 私の環境ではうまくいきませんでしたが、 コードの一部を修正して ----------------------------------- setlocal enabledelayedexpansion set N=0 for /f "delims=," %%A in (s.txt) do call :set "%%A" set N=0 for /f "delims=," %%A in (d.txt) do call :ren "%%A" goto :EOF :set set /a N+=1 set FOO%N%=%~1 goto :EOF :ren set /a N+=1 call ren "!FOO%N%!" "%~1" goto :EOF ----------------------------------- のようにするとうまくいくようになりました。 ありがとうございました。 教えて頂きましたコードには、 いろいろなノウハウが込められていて 大変参考になりましたが まだ分からないこともあります。 もし教えていただけるのであれば、 以下のことが分からないので、 教えていただけないでしょうか。 1) call ren !FOO%N%! %~1 の部分のcallをなくして ren !FOO%N%! %~1 だけにしてもうまくいくのですが、 callがある場合とない場合とでは、 なにか違いがあるのでしょうか。 2) for文の中なので遅延環境変数を使っていますが、 もし、for文の中ではなく遅延環境変数を使わなくてもよい時は、 !FOO%N%!の部分の!は%になりますが、 %FOO%N%%としてもうまくいきません。 例えば、 ---test3.txt--- set N=1 set FOO%N%=abc set N=2 set FOO%N%=def set N=1 echo %FOO%N%% <-- abcを期待したがならない set N=2 echo %FOO%N%% <-- defを期待したがならない --------------- このような場合、FOO%N%の部分を参照するには、 どのように表記すればよいのでしょうか。 よろしくお願いします。