【问题标题】:Find exit code for executing a cmd command through PowerShell查找通过 PowerShell 执行 cmd 命令的退出代码
【发布时间】:2023-03-27 00:53:01
【问题描述】:

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

【问题讨论】:

标签: powershell powershell-3.0


【解决方案1】:

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

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

否则这通常有效 -

& <path> <args>
$LASTEXITCODE

或者有时这个 -

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

【讨论】:

  • $LASTEXITCODE 是我在不采用 Start-Process 方法时所需要的。
  • +1 用于 cmd.exe /c 技巧 - 这是运行 VC++ 安装程序时获得退出代码的唯一方法。
【解决方案2】:

您似乎正在运行 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

【讨论】:

  • 非常感谢,这真的很有帮助。这就是我一直在寻找的。我可以找到正在运行的 msiexec 进程,但我不知道如何获取退出代码(以查找安装是否成功。)
【解决方案3】:

您不需要使用 Invoke-Expression:

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

【讨论】:

  • 这应该是公认的答案。开箱即用,包括通过$? 检索错误代码。
  • 请注意,某些 setup.exe 文件(例如由 Inno Setup 生成的文件)在使用 &amp; 运行时会立即返回。由于某种原因,我不得不使用Start-Process -Wait -PassThru...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-18
  • 1970-01-01
  • 1970-01-01
  • 2010-12-30
  • 1970-01-01
  • 2015-01-23
  • 2011-09-19
相关资源
最近更新 更多