2017-02-21 34 views
3

運行下列批處理文件時,我希望程序從func例程中返回並顯示「結束程序」消息。相反,在for循環中執行暫停命令後,按下某個鍵後程序似乎會掛起。替換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 

什麼是使用無限循環程序內,仍然可以返回給調用者的適當方法?

+0

我不確定我是否遵循,術語無限是特定的,如果它是連續的,它將如何返回? – Compo

+0

@Compo:'exit/b' *假設*結束循環,但似乎不適用於'/ L'循環 – abelenky

+2

這個想法是在特定條件爲滿足。在批處理文件腳本中,您不能從其內部影響for循環的條件。我還發現,沒有直接的方式來擺脫死循環,同時避免使用goto-label。請參閱以下DosTips主題以獲取更多信息:http://www.dostips.com/forum/viewtopic.php?f=3&t=2707 – treintje

回答

2

在鏈接的DosTips主題的回覆#7中,您可以閱讀以下短語:「在同一個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話題讀了這一點的進一步描述。