こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

バッチファイル 2ファイルをfor /f処理したい

バッチファイルで別の2つのファイルを読み込んでfor /f処理するには

変換前のファイルのファイル名と
変換後のファイルのファイル名が
それぞれ別のファイルに書かれていて
この2つのファイルを読み込んで
リネームするバッチファイルを
記述したいのですが
2つのfor /fを使った場合、
一方が他方にネストされてしまうのですが
このような場合は
どのように記述するのでしょうか。

例えば、
変換前のファイル名が書かれたファイル(s.txt)と
変換後のファイル名が書かれたファイル(d.txt)
がある場合、
abc.txtをqrs.txt
d f.txtをtuw.txt
ghi.txtをx z.txt
 :
にリネームしたいのですが
もちろんtest1.batではうまくいきません。

---test1.bat-------------------
for /f %%a in (s.txt) do
for /f %%b in (d.txt) do
ren "%%a" "%%b"
------------------------------

---s.txt----------------------
abc.txt
d f.txt
ghi.txt
:
---d.txt----------------------
qrs.txt
tuw.txt
x z.txt
:
------------------------------

以下の sd.txt のように1つのファイルにして
test2.bat のようにすればできますが
s.txt と d.txt の2つのファイルのままで処理するには
どのように記述すればよいのでしょうか。

---test2.bat-------------------
for /f "tokens=1,2 delims=," %%a in (sd.txt) do ren "%%a" "%%b"
---sd.txt----------------------
abc.txt,qrs.txt
d f.txt,tuw.txt
ghi.txt,x z.txt
:
-------------------------------

よろしくお願いします。(Windows7)

投稿日時 - 2017-08-20 11:24:45

QNo.9365112

困ってます

質問者が選んだベストアンサー

配列に覚える感じですね。

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

投稿日時 - 2017-08-21 22:01:02

お礼

教えて頂きましたコードでは、
私の環境ではうまくいきませんでしたが、
コードの一部を修正して
-----------------------------------
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%の部分を参照するには、
  どのように表記すればよいのでしょうか。

よろしくお願いします。

投稿日時 - 2017-08-26 17:00:40

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

1.遅延評価を使ったので、call は不要でした。
2.遅延評価を使ったのはforとは関係ないです。
まず%による変数展開をしてから、その結果を使って!による変数展開をするという、2段階の展開をするためです。
echo !FOO%N%!
または、
call echo %%FOO%N%%%
と、callによって2段階の展開が出来ます。

投稿日時 - 2017-08-26 20:59:10

お礼

ren "!FOO%N%!" "%~1"
の部分を2段階に展開するために、
遅延評価を使っていたというわけですね。
この部分を、
call ren "%%FOO%N%%%" "%~1"
というように記述すると、
同様に2段階に展開されるため、
遅延評価を使わなくてもよいということですね。
とても参考になりました。
大変分かりやすい回答ありがとうございました。

投稿日時 - 2017-08-27 11:31:44

あなたにオススメの質問