如何在批处理文件中等待 exe 完成?

如何在批处理文件中等待 exe 完成?

我正在尝试创建一个脚本以在关机时执行一个 exe 来安装 sp1。我的脚本类似于(不是实际的 bat 脚本)。

If installed GOTO END
    Install.exe
END:

我的问题是,当它运行时,它会启动安装程序,然后完成脚本,因为安装程序是一个不同的过程,然后关闭安装过程,因为计算机正在关闭并关闭系统(至少,这是我认为它正在做的事情。)

有什么办法可以告诉它等到它启动的进程完成后再关闭?

答案1

尝试运行

START /WAIT Install.exe

答案2

一个更短的方法:

Install.exe|more

install|rem

可以使用,但more最终您将能够捕获一些控制台输出。这就是它起作用的原因 - 管道命令等待输入,直到 .exe 完成。

更新

对于 Windows 8 和 Windows 10,有一个名为的新工具scriptrunner,也可以用于此目的:

ScriptRunner.exe -appvscript Install.exe -appvscriptrunnerparameters -wait

答案3

无论是直接从批处理文件调用 exe,还是使用start /wait都可以,但有一个警告。

如果您调用的 exe 随后创建其他进程(例如调用另一个 exe),然后退出批处理文件,则在被调用的 exe 终止后将继续处理,因为它不知道它启动的其他进程。

就您而言,这是一个真正的问题,因为安装程序通常会从某种形式的压缩容器中提取文件,这些文件可能嵌入在 exe 本身中,然后启动其中一个提取的文件并退出。某些安装程序提供命令行参数,告诉原始 exe 在整个安装完成之前不要退出,因此您可能需要调查这一点。除此之外,仅使用批处理文件无法真正解决这个问题,需要采用编程解决方案来解决。

答案4

我遇到了 @John Gardeniers 遇到或描述的问题,我的 exe 调用了另一个 exe 并终止,因此 start /wait 不起作用。我创建了一个“while 循环”来检查它是否正在运行,然后在它完成后继续。时间可以根据您的需要进行调整。

TIMEOUT /T 60

SETLOCAL EnableExtensions
set EXE=MYEXETOCHECK.exe
:LOOPSTART
FOR /F %%x IN ('tasklist /NH /FI "IMAGENAME eq %EXE%"') DO IF %%x == %EXE% goto FOUND
goto FIN
:FOUND
TIMEOUT /T 30
goto LOOPSTART
:FIN

相关内容