[前の記事]« バッチファイルにFOR文を追加したら動かなくなってしまった
[次の記事]テキストファイル各行の末尾のスペースのみ削除する方法 »

関連オンラインソフト配布サイト:
Vector>ダウンロード(top) |>MS-DOSまたは汎用 | >WindowsVista/XP/2000/NT

▲カテゴリー「FOR .. IN ( ) DO..」索引へ

FOR文中のFORがループしてくれない

1552.
FORの中のFOR
2006年12月28日(木) 11時24分
くま
LOOPの中にLOOPを作るとき、以下の文ですとLOOPせずに、1回で抜けてしまいます。
どこがおかしいのか分からなくなってしまい。投稿しました。
ご指導宜しくお願いします。


copy TestA.dat TestB.dat
for /L %%z in (1,1,30) do ping 127.0.0.1 -n 2 >nul
FOR /L %%i IN (1,1,5) DO CALL :aaa
CALL :ddd

:aaa
copy TestB.dat TestC.dat
FOR /L %%i IN (1,1,10) DO CALL :bbb
:EOF

:bbb
for /L %%z in (1,1,10) do ping 127.0.0.1 -n 2 >nul
find "*" TestC.dat
IF ERRORLEVEL== 0 GOTO ccc
:EOF

:ccc
echo END

:ddd
echo ERR

環境は、XPです。
1555.
Re:FORの中のFOR
2006年12月30日(土) 15時33分
YanaKen◆c0rnJ1Q=
くまさん

>LOOPの中にLOOPを作るとき、以下の文ですとLOOPせずに、1回で抜けてしまいます。
>どこがおかしいのか分からなくなってしまい。投稿しました。
(中略)
>:aaa
>copy TestB.dat TestC.dat
>FOR /L %%i IN (1,1,10) DO CALL :bbb
>:EOF
>
>:bbb
>for /L %%z in (1,1,10) do ping 127.0.0.1 -n 2 >nul
(後略)

 目に付くのは2回出現する :EOF というラベルです。
「ここでサブルーチン終了」という意図でお使いなのかと思いますが、
 GOTO :EOF
 ……と書くべきところをお間違えのようです。
 なお、CALLで呼ばれたサブルーチンから脱出する方法として、GOTO :EOFのほかに EXIT /B も使えます。

 ……と、どうも説明しづらいのでサンプルを作ってみました。

@ECHO OFF
ECHO 同一ファイル内のCALL、GOTO :EOF、EXIT /Bのサンプルです。
FOR %%I IN (1 2) DO CALL :AAA
ECHO サブルーチンAAAから戻りました。
CALL :BBB
ECHO サブルーチンBBBから戻りました。
GOTO :EOF

:AAA
ECHO AAAが呼ばれました。
GOTO :EOF
REM EXIT /Bでも実用上同じです。

:BBB
ECHO BBBが呼ばれました。
EXIT /B

 質問の趣旨とは離れますが、
>IF ERRORLEVEL== 0 GOTO ccc
 ……の部分もちょっとヘンです。環境変数(文字列)ERRORLEVELを参照したい、ということであれば、
 IF %ERRORLEVEL%==0 GOTO ccc
 のようにします。
 数値としての環境変数を参照する場合は等号(==)は不要、かつ常に「XX以上なら」という意味になるため、
  IF ERRORLEVEL 0
 の結果は常にTRUEです。エラーが発生したら分岐したい場合は、
  IF ERRORLEVEL 1 GOTO err
 ……のようなかたちに直す必要があります。

YanaKen
1569.
Re:FORの中のFOR
2007年01月05日(金) 10時43分
くま
遅くなりました。
ご返答ありがとうございます。

ひょんな事からDOSバッチを作ることになって、
四苦八苦してたのですが、なんとか光が見えました。
基本的な構文の使い方で違ってたのですね。

古い言語なのに、新しく勉強しなおすつらさ、
忘れていた感覚が思い出されます。。。^^;

なんとかソースは完成しました。ありがとうございます。

あと・・・どこか、細かな説明があるサイトとか、ありましたら、教えていただきたいです。
ぐぐってみると、どうも、リファレンスサイトしかなく・・
中級・上級的な使い方が、いまいち書かれていなくて、
応用が大変なもので・・・

>くまさん
>
>>LOOPの中にLOOPを作るとき、以下の文ですとLOOPせずに、1回で抜けてしまいます。
>>どこがおかしいのか分からなくなってしまい。投稿しました。
>(中略)
>>:aaa
>>copy TestB.dat TestC.dat
>>FOR /L %%i IN (1,1,10) DO CALL :bbb
>>:EOF
>>
>>:bbb
>>for /L %%z in (1,1,10) do ping 127.0.0.1 -n 2 >nul
>(後略)
>
> 目に付くのは2回出現する :EOF というラベルです。
>「ここでサブルーチン終了」という意図でお使いなのかと思いますが、
> GOTO :EOF
> ……と書くべきところをお間違えのようです。
> なお、CALLで呼ばれたサブルーチンから脱出する方法として、GOTO :EOFのほかに EXIT /B も使えます。
>
> ……と、どうも説明しづらいのでサンプルを作ってみました。
>
>@ECHO OFF
>ECHO 同一ファイル内のCALL、GOTO :EOF、EXIT /Bのサンプルです。
>FOR %%I IN (1 2) DO CALL :AAA
>ECHO サブルーチンAAAから戻りました。
>CALL :BBB
>ECHO サブルーチンBBBから戻りました。
>GOTO :EOF
>
>:AAA
>ECHO AAAが呼ばれました。
>GOTO :EOF
>REM EXIT /Bでも実用上同じです。
>
>:BBB
>ECHO BBBが呼ばれました。
>EXIT /B
>
> 質問の趣旨とは離れますが、
>>IF ERRORLEVEL== 0 GOTO ccc
> ……の部分もちょっとヘンです。環境変数(文字列)ERRORLEVELを参照したい、ということであれば、
> IF %ERRORLEVEL%==0 GOTO ccc
> のようにします。
> 数値としての環境変数を参照する場合は等号(==)は不要、かつ常に「XX以上なら」という意味になるため、
>  IF ERRORLEVEL 0
> の結果は常にTRUEです。エラーが発生したら分岐したい場合は、
>  IF ERRORLEVEL 1 GOTO err
> ……のようなかたちに直す必要があります。
>
>YanaKen


1570.
Re:FORの中のFOR
2007年01月05日(金) 11時05分
YanaKen◆c0rnJ1Q=
>遅くなりました。
>ご返答ありがとうございます。
>
>ひょんな事からDOSバッチを作ることになって、
>四苦八苦してたのですが、なんとか光が見えました。
>基本的な構文の使い方で違ってたのですね。
>
>古い言語なのに、新しく勉強しなおすつらさ、
>忘れていた感覚が思い出されます。。。^^;
>
>なんとかソースは完成しました。ありがとうございます。
>
>あと・・・どこか、細かな説明があるサイトとか、ありましたら、教えていただきたいです。
>ぐぐってみると、どうも、リファレンスサイトしかなく・・
>中級・上級的な使い方が、いまいち書かれていなくて、
>応用が大変なもので・・・

 活発にアドバイス発言をしてくださる皆さんのおかげで、うちのこの掲示板の「過去ログ」は、そういった情報の宝庫として多くの皆さんにご活用いただいているもの……と、運営者としては認識しております(^^;。
 目下ブログ化(ブログの機能を取り入れた形での過去ログの準データベース化)に取り組んでおり、従来よりは多少目指す情報が見つけやすくなっているのではないかと思っています。
http://fpcu.on.coocan.jp/dosvcmd/bbs/log/

 むろん整理された解説書とは違って「過去の質疑の記録」ですから、自分の知りたいことがスムーズには抽出しにくいケースもあるかと思いますが、そこのところはちょっと辛抱していただいて、活きた情報源として適宜ご活用いただければ幸いです。

YanaKen
 
 


カテゴリー「FOR .. IN ( ) DO..」索引へ

 

カテゴリー一覧

FPCU/FPCDIY QUICK LINK online
この上の各ジャンル名をクリックすると、下のウィンドウが切り替わります▼


=リンク集のインデックスはこちら=

資料書籍

About

2006年12月28日 15:23に投稿されたエントリーのページです。

ひとつ前の投稿は「バッチファイルにFOR文を追加したら動かなくなってしまった」です。

次の投稿は「テキストファイル各行の末尾のスペースのみ削除する方法」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

This site is powered by Six Apart
Movable Type 3.33-ja
このブログについて | 運営:有限会社メディアポート