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

10 浏览
0 Comments

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

我有一个批处理文件,只要我启动它(以管理员身份运行),它就会立即退出,并且不执行其中的命令,但如果我在命令行中指定它,它会正常运行并执行所有命令。

以下是其中的内容:

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

0
0 Comments

Windows批处理文件不等待命令完成的原因可能是使用了`start /wait`命令导致。解决方法可以是将`start /wait`命令移除,或者创建两个额外的批处理文件,一个叫做`uninstall.bat`,另一个叫做`install.bat`,然后使用`call`命令按顺序执行它们。

以下是相应的代码示例:

:: uninstall.bat

msiexec /x {ProductCode} /qn

:: install.bat

msiexec /i {ProductCode} /qn

:: main.bat

call uninstall.bat

call install.bat

以上是一种解决该问题的直接方法。

0
0 Comments

问题的原因是批处理文件在执行命令时不等待命令完成。解决方法是在启动.exe文件的时候,在批处理文件中添加"call"前缀。这样可以确保批处理文件等待命令完成。另一种可能的解决方法是使用"start"命令,但在这种简单的情况下不是必要的。

你提到命令没有被执行,所以显然你遇到了"不等待命令完成"的问题。根据你提供的示例,这似乎是个问题。在管理员模式下,你必须提供完整的路径。使用"%~dp0"这个小技巧(包括反斜杠),你仍然可以在批处理文件中使用当前目录。

大多数情况下,如果在管理员权限下出现这样的问题,这是与"当前目录"路径有关的问题。拥有管理员权限的批处理文件不会以与我们习惯的相同方式使用当前目录(但通常在System32目录中启动)。不依赖于CD命令是编写防弹批处理文件的重要事项。

一个很好的示例批处理文件,结合了这里其他答案的内容,并解决了你的情况下可能出现的一些问题:

call msiexec /i "%~dp0MySetup.msi" /qb /L*v "%~dp0MySetup.log"
echo Returncode: %ERRORLEVEL%
pause

它正确使用了当前目录,并假定安装命令行包括一个日志文件(仅在当前目录具有写访问权限时有效,否则请使用具有写访问权限的路径,例如"%TEMP%\MySetup.log")。

请注意:请确保以管理员权限真正启动批处理文件(右键菜单或在管理员命令提示符中打开)。

感谢你所提供的帮助!欢迎继续阅读我在下面的第二个回答中对此问题的扩展,以及有关如何在不需要用户(通常没有经验的用户)"以管理员身份启动"的情况下自动以管理员权限(UAC)重新启动批处理文件的相关提示:stackoverflow.com/questions/4051883/…。这与这里的问题相关,因为显然安装需要管理员权限,而问题包含了两个子问题。

0
0 Comments

Windows批处理文件不等待命令完成的原因是因为默认情况下,批处理文件会继续执行下一条命令而不管上一条命令是否完成。这可能会导致问题,特别是在需要先完成某个命令后才能执行下一个命令的情况下。

为了解决这个问题,可以使用PowerShell来执行命令并等待其完成。以下是两种解决方法:

方法1:使用PowerShell的Start-Process命令执行命令,并使用-Wait参数等待命令完成。

Start-Process -Wait -FilePath msiexec -ArgumentList /i, "setup.msi", /qn, /l*v, "install.log"

方法2:在批处理文件中使用PowerShell命令,通过在命令前加上"PowerShell;"来直接从CMD中调用PowerShell。

PowerShell; Start-Process -Wait -FilePath msiexec -ArgumentList /i, "setup.msi", /qn, /l*v, "install.log"

以上方法都不需要使用任何技巧或者hack,是解决这个问题的正确方式。

0