Windows批处理文件不等待命令完成

Ost*_*ati 5 command-line msiexec

我有一个批处理文件,它一旦启动就存在(以管理员身份运行)并且不执行其中的命令,但如果我在命令行指定它,它运行正常并执行所有命令.

这是它的内容:

start /wait msiexec /x SetupServices.msi /qn /l* "SetupServices.uninstall.log"

start /wait msiexec /i SetupServices.msi /qn /l* "SetupServices.install.log"
Run Code Online (Sandbox Code Playgroud)

Phi*_*ilm 11

(更正的答案)

首先,如果您批量启动.exe文件,则以"call"为前缀更安全.有时这是必要的,以确保批处理等待完成.

使用"start"是另一种可能性,但对于这个简单的用例来说并非必要.

你写的命令没有执行.所以,显然,你有另一个问题,而不是"不等待......完成"的问题.看一下你新提供的例子,就是这种情况.在管理员模式下,您必须提供完整路径.使用下面的小技巧("%~dp0",包括已经反斜杠),您仍然可以在批处理文件中使用当前目录.

大多数情况下,如果管理员权限出现此类问题,则这是"当前目录"路径的问题.具有管理员权限的批处理文件没有像我们习惯的那样使用它,它不会在它自己的目录中启动(但主要在System32中).不依赖CD是编写防弹批处理文件的重要事项.

一个很好的示例批处理,在这里结合其他答案,并在您的情况下解决许多可能的问题是:

call msiexec /i "%~dp0MySetup.msi" /qb /L*v "%~dp0MySetup.log"
echo Returncode: %ERRORLEVEL%
pause
Run Code Online (Sandbox Code Playgroud)

它正确使用当前目录,并假设包含日志文件的安装命令行(仅在当前目录中具有写访问权限时才有效,如果没有为具有写访问权限的日志文件指定路径,如"%TEMP%\ MySetup.log") .

注意:记得要真正启动具有管理员权限的批处理文件(鼠标右键菜单或打开管理命令shell :)


Ost*_*ati 5

回到这个问题,我认为“正确的方法”是通过PowerShell

Start-Process -Wait -FilePath msiexec -ArgumentList /i, "setup.msi", /qn, /l*v, "install.log"   
Run Code Online (Sandbox Code Playgroud)

或者只是加上前缀PowerShell;以直接从CMD调用

PowerShell; Start-Process -Wait -FilePath msiexec -ArgumentList /i, "setup.msi", /qn, /l*v, "install.log"
Run Code Online (Sandbox Code Playgroud)

没有技巧,也没有技巧:-)