我使用静默安装命令来安装软件。我从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是否成功执行?
答案 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