通过PowerShell查找用于执行cmd命令的退出代码

时间:2014-08-12 23:55:36

标签: powershell powershell-v3.0

我使用静默安装命令来安装软件。我从PowerShell 3.0运行此命令。

$silentInstall = C:\Users\Admin\Documents\Setup-2.0.exe exe /s /v"EULAACCEPTED=\"Yes\" /l*v c:\install.log /qn"

Invoke-Expression $silentInstall

这会运行安装软件的命令,但它不会等待它完成并继续执行下一行代码。我想控制安装,以便我知道它是否已经完成。

如何获取Invoke-Expression cmdlet的错误代码,以便我可以了解cmd是否成功执行?

3 个答案:

答案 0 :(得分:18)

这取决于EXE文件的运行方式 - 有时它会启动一个单独的进程并立即返回,在这种情况下,这通常有效 -

$p = Start-Process -FilePath <path> -ArgumentList <args> -Wait -NoNewWindow -PassThru
$p.ExitCode

否则这通常有效 -

& <path> <args>
$LASTEXITCODE

或者有时这个 -

& cmd.exe /c <path> <args>
$LASTEXITCODE

答案 1 :(得分:3)

您好像正在运行MSI安装程序。从控制台运行时,会立即返回控制权,而MSI会分叉一个新进程来运行安装程序。没有办法改变这种行为。

您可能需要做的是使用Get-Process查找名为msiexec的进程,并等待它完成。始终会运行msiexec进程,该进程处理启动新安装程序,因此您需要找到安装开始后启动的msiexec进程。

$msiexecd = Get-Process -Name 'msiexec'
C:\Users\Admin\Documents\Setup-2.0.exe exe `
                                       /s `
                                       /v"EULAACCEPTED=\"Yes\" /l*v c:\install.log /qn"
$myMsi = Get-Process -Name 'msiexec' | 
             Where-Object { $_.Id -ne $msiexecd.Id }
$myMsi.WaitForExit()
Write-Verbose $myMsi.ExitCode

答案 2 :(得分:2)

您不需要使用Invoke-Expression:

& C:\Users\Admin\Documents\Setup-2.0.exe /s /vEULAACCEPTED=Yes /l*v C:\install.log /qn