- PR -

バッチファイルのfor文による多重ループについて

1
投稿者投稿内容
ナゾゲウム
会議室デビュー日: 2008/05/28
投稿数: 13
投稿日時: 2008-05-28 14:52
初歩的な質問で大変恐縮なのですが、Windowsバッチファイルに関する
下記不具合についてお分かりになられる方がいましたらご教授頂けないでしょうか。

data01.txtには以下の内容が記載されています。
TEST001
TEST002

data02.txtには以下の内容が記載されています。
200
201
202

これをマージしてresult.txtというファイルに出力するのですが、
マージした結果が以下のようになっている必要があります。
TEST001 200
TEST001 201
TEST001 202
TEST002 200
TEST002 201
TEST002 202

上記のような出力を実現すべく、下記コードのバッチファイル(work.bat)を
作成しました。
================<work.bat>===========================
@echo off

set TEXT1=C:\work\data01.txt
set TEXT2=C:\work\data02.txt

for /f %%z in (%TEXT1%) do call :add1 %%z

:exit
exit /b

:add1
set DATA01=%1
for /f %%y in (%TEXT2%) do call :add2 %%y

:add2
set DATA02=%1
echo %DATA01% %DATA02% >> C:\work\result.txt
=======================================================

これを実行すると、result.txtの内容が以下のようになってしまいます。
TEST001 200
TEST001 201
TEST001 202
TEST001 TEST001
TEST002 200
TEST002 201
TEST002 202
TEST002 TEST002

for文による多重ループで実現しようとしたのですが、何故かTEXT2読み込みの最後に
TEXT1の値が入ってしまいます。

原因がさっぱり分からないのでお分かりになる方、教えて頂けますでしょうか。

以上宜しくお願いします。
rain
ぬし
会議室デビュー日: 2006/10/19
投稿数: 549
投稿日時: 2008-05-28 15:06
なぜそのような結果になるかというと、:add1 でおこなっている処理の後、:add2 の内容が実行されているからです。

コード:

:add1
set DATA01=%1
for /f %%y in (%TEXT2%) do call :add2 %%y

exit /b

:add2
set DATA02=%1
echo %DATA01% %DATA02% >> C:\temp\result.txt



こんな感じでいけると思います。

※\記号が増えていたのを修正

[ メッセージ編集済み 編集者: rain 編集日時 2008-05-28 15:15 ]
ナゾゲウム
会議室デビュー日: 2008/05/28
投稿数: 13
投稿日時: 2008-05-28 17:01
rainさん
早速のご回答ありがとうございます。
exitのタイミングなんですね〜
exitを二つ用意するとは思いもつきませんでした。
早速試した結果、下記の通り想定通りの結果を出してくれました!
TEST001 200
TEST001 201
TEST001 202
TEST002 200
TEST002 201
TEST002 202

ありがとうございます。本当に助かりました。
また何かありましたら宜しくお願いします。
rain
ぬし
会議室デビュー日: 2006/10/19
投稿数: 549
投稿日時: 2008-05-28 17:23
exit命令が複数あるのが気持ち悪い場合は、こんな感じですかねぇ。
gotoも気持ち悪いという向きもあるかもしれませんが、そこは我慢してもらうとして。

コード:

for /f %%z in (%TEXT1%) do call :add1 %%z

goto :exit

:add1
set DATA01=%1
for /f %%y in (%TEXT2%) do call :add2 %%y

goto :exit

:add2
set DATA02=%1
echo %DATA01% %DATA02% >> C:\temp\result.txt

:exit
exit /b



このようなcall命令の使い方は知らなかったので、参考になりました。

[ メッセージ編集済み 編集者: rain 編集日時 2008-05-28 17:24 ]
ナゾゲウム
会議室デビュー日: 2008/05/28
投稿数: 13
投稿日時: 2008-05-28 18:52
rainさん
またまた補足ありがとうございます。
こちらこそ大変勉強になりました。

上記for文を使用してまた別のことをやろうとしたのですが
ちょっと問題が起きました。
これは別スレッドに記載します。
情報ありがとうございました。本当に助かりました。
1

スキルアップ/キャリアアップ(JOB@IT)