2017-02-21 5 views
3

次のバッチファイルを実行すると、プログラムがfuncルーチンから復帰し、 'プログラムの終了'メッセージが表示されます。代わりに、forループでpauseコマンドが実行された後にキーを押すと、プログラムがハングしているように見えます。 exit/bgoto:eofと置き換えても同じ効果があるようです。ルーチン内で無限ループから戻ることができません

@echo off 

echo start program 
call :func 
echo end program 
pause 
exit /b 

:func 
echo start func 
for /l %%l in() do (
    echo start loop 
    pause 
    exit /b 
    echo end loop 
) 
echo end func 
exit /b 

予想される出力:

start program 
start func 
start loop 
Press any key to continue... 
end program 
Press any key to continue... 

私は無限ループとしてのgotoラベルを使用しないようにしたいと思います。次のループでは、反復メッセージは一度だけ表示されます。

:test 
for /l %%l in (1,1,3) do (
    echo iteration: %%l 
    exit /b 
) 
exit /b 

を何がルーチン内で無限ループを使用して、まだ、呼び出し元に戻ることができるようにする適切な方法でしょうか?

あなたはこのフレーズを読んでもリンクされDosTipsトピックに返信#7で
+0

私はそれに続くのかどうかわかりません。 – Compo

+0

@Compo: 'exit/b'はループを終了すると仮定されていますが、'/L'ループでは動作しないようです。 – abelenky

+2

考えられるのは、特定の条件が満たされているときにforループ内の関数呼び出しから戻ることです会ったバッチファイルスクリプティングでは、本体内からのforループの状態に影響を与えることはできません。私は、goto-labelの使用を避けながら、無限ループから抜け出すための直接的な方法がないことも発見しました。詳細については、次のDosTipsのトピックを参照してください。http://www.dostips.com/forum/viewtopic.php?f=3&t=2707 – treintje

答えて

2

は「同じCMDの文脈におけるFOR/Lループを破る方法はありませんので、私はに周期をエクスポートするためにトリックを使用新しいCMDはEXITコマンドで切断され、実行は呼び出し元コード ""に戻ります。それは次のとおりです。

@echo off 
if "%~1" neq "" goto %1 

echo start program 
cmd /C "%~F0" :func 
echo end program 
pause 
exit /b 

:func 
echo start func 
for /l %%l in() do (
    echo start loop 
    pause 
    exit 
    echo end loop 
) 
echo end func 
exit /b 

あなたはThe ultimate while loop DosTipsトピックで、この時点のさらなる説明を読むことができます。

関連する問題