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

1ce*_*ham 4 windows batch-file

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

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"
Run Code Online (Sandbox Code Playgroud)

为了完整起见,这里是 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
Run Code Online (Sandbox Code Playgroud)

尽管我尝试过所有的变体(无论是寻找适用于额外挑剔的程序的方法还是每个批处理文件中语法的更改),我似乎无法获取运行 AnotherScript 的程序的实例(或其他任何内容)就此而言)运行。谢谢。

MC *_* ND 5

一般来说,当一个批处理文件调用另一个批处理文件时,流程执行将转移到被调用的批处理,并且不会返回到调用者。为了让调用者检索执行流程,需要使用命令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"  
Run Code Online (Sandbox Code Playgroud)

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

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