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

时间:2011-08-04 18:29:21

标签: 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"

6 个答案:

答案 0 :(得分:9)

(更正的答案)

首先,如果批量启动.exe文件,则以“call”为前缀更安全。 有时需要确保批次等待完成。

使用“start”是另一种可能性,但对于这个简单的用例不是必需的。

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

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

一个很好的示例批处理,在这里结合其他答案,并解决您案例中的一些可能的问题:

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

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

注意:请记住使用管理员权限(右键菜单或在以下情况下打开管理命令shell)真正启动批处理文件:)

答案 1 :(得分:5)

回到这个问题,我认为"正确的方式"要做到这一点是通过PowerShell

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

或者只是用PowerShell;作为前缀,直接从CMD调用

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

没有黑客也没有技巧: - )

答案 2 :(得分:1)

尝试启动/等待msiexec行,如果不起作用再创建两个bat文件,一个名为uninstall.bat,另一个名为uninstall.bat,并使用call来串行执行它们。

答案 3 :(得分:1)

pause语句添加到批处理的末尾,这将阻止控制台窗口关闭,您将能够看到错误消息(如果有)。错误可能是它退出而没有实际运行任何东西的原因。可能是什么样的错误?找不到SetupServices.msi - 这就是我想到的。

答案 4 :(得分:1)

这有点超出了问题,但是我对处理当前目录的答案的扩展:以下是每个批处理文件的建议开头,保留了它自己的路径。其特点是它也适用于UNC路径。如果需要,“Pushd”会自动创建一个新的驱动器号(假设您有一个26的免费驱动器号)。当然你也可以立即在批处理文件的末尾使用“popd”,但稳定的命令不依赖于我提到的当前目录,所以最好总是提供完整的路径。

@echo off
cls
pushd %~dp0
popd
set MYDIR=%CD%
echo Directory of this batch fil: %MYDIR%

然后,您可以添加其他答案中的msi行,如下所示:

call msiexec /i "%MYDIR%\MySetup.msi" /qb /L*v "%MYDIR%\MySetup.log"
echo Returncode: %ERRORLEVEL%
pause

(注意:对于日志文件路径当然是免费的,它不一定在同一个目录中。但是对于测试/调试很有用。在每种情况下你都必须具有对目录/文件的写访问权限。给MSI。)

虽然对于普通的MSI文件,并不总是需要从一开始就使用管理员权限启动批处理,但这种技术更安全(启动MSI就像管理员权限一样),而不是依赖MSI UAC来以后(也许)。 它也适用于msiexec ... / qn,这很重要(静默安装)。

答案 5 :(得分:0)

如果您使用参数,则需要 “窗口标题”

start /wait "Window Title" "MsiExec.exe" /i SetupServices.msi /qn /l* SetupServices.uninstall.log
start /wait "Window Title" "MsiExec.exe" /i SetupServices.msi /qn /l* SetupServices.install.log