批处理脚本在for循环后结束

时间:2015-06-16 00:43:31

标签: windows batch-file

我有一个批处理文件,它与顺序(编号)宏一起执行程序,并调用另一个批处理文件,该文件在开始下一次迭代之前监视它何时完成。我不能使用开始/等待或其他"订购"启动程序时的命令,因为它是以批处理文件和语法启动的,我无法避免使用。一旦完成这个循环(在程序打开并关闭典型使用模式约120次之后),我需要再次打开它并运行一个不同的非顺序宏,但是一旦循环完成它就会失败。 / p>

for /l %%x in (1,1,120) do (
echo %%x

"C:\File Path\ProgramStart.bat" -macro "C:\File Path\MyScript%%x.txt"
timeout 3
start /wait OpenChecker.bat )

"C:\File Path\ProgramStart.bat" -macro "C:\File Path\AnotherScript.txt"

为了完整起见,这里是OpenChecker.bat:

:check
tasklist /FI "IMAGENAME eq Program.exe" 2>NUL | find /I /N "Program.exe">NUL
if "%ERRORLEVEL%" NEQ "0" exit
TIMEOUT 5
goto check

尽管我已经尝试了所有的变化(在寻找适用于额外挑战程序的方法和每个批处理文件中的语法更改),我似乎无法获得实例程序运行AnotherScript(或其他任何事情)来运行。感谢。

3 个答案:

答案 0 :(得分:3)

通常,当批处理文件调用另一个批处理文件时,流程执行将转移到被调用的批处理,并且不会返回给调用者。要允许调用者检索执行流,必须使用call命令。

for /l %%x in (1,1,120) do (
    echo %%x
    call "C:\File Path\ProgramStart.bat" -macro "C:\File Path\MyScript%%x.txt"
    timeout 3
    call OpenChecker.bat 
)

call "C:\File Path\ProgramStart.bat" -macro "C:\File Path\AnotherScript.txt"  

注意:这解决了问题,但仍有一个问题。如果流被转移并且它没有返回给调用者,为什么循环用原始代码迭代120次?

for循环已被解析并正在执行中。发生的情况是,当调用ProgramStart.bat时,会生成一个新的批处理“context”,它会替换调用者“context”,但for命令仍然在执行内存中。它被解析并开始执行只有一个命令。当ProgramStart.bat结束时,“context”被丢弃,但内存中的for命令仍在执行中,但现在它不在批处理“context”中(原始和被叫“context”) “被丢弃了”,但是在命令行上下文中。

答案 1 :(得分:0)

您是否曾阅读过有关命令致电的内容?

不,打开命令提示符窗口,键入EXPLAIN SELECT * FROM measurements FORCE INDEX (date_from_epoch) WHERE date_from_epoch >= 20150615 AND date_from_epoch <= 20150615 AND unix_epoch >= 1434423478 AND unix_epoch <= 1434430678 AND BINARY application_name = 'all' AND BINARY environment = 'prod' AND BINARY metric_name = 'Internet availability' AND BINARY host_name = 'kitkat' ORDER BY unix_epoch ASC; ,按键 RETURN 并立即将帮助输出读入该命令的控制台窗口。

另请参阅我在How to call a batch file in the parent folder of current batch file?上的答案,解释了在批处理文件中运行另一个批处理文件或控制台或GUI应用程序的可能性。

我建议使用:

call /?

答案 2 :(得分:0)

你可以这样做

cmd /k "for /l %%x in (1,1,120) do  (echo %%x & call "C:\FilePath\ProgramStart.bat" -macro "C:\File Path\MyScript%%x.txt & timeout 3" & call OpenChecker.bat)"

call "C:\File Path\ProgramStart.bat" -macro "C:\File Path\AnotherScript.txt"