【问题标题】:Run MsiExec from PowerShell and get Return Code从 PowerShell 运行 MsiExec 并获取返回码
【发布时间】:2011-05-06 16:21:34
【问题描述】:

使用BAT/CMD 脚本,我可以简单地使用"msiexec /i <whatever.msi> /quiet /norestart",然后检查%errorlevel% 的结果。

有了VBScript,使用Wscript.Shell对象Run()方法,我可以得到这样的结果:

"result = oShell.Run("msiexec /i ...", 1, True)"

如何使用 PowerShell 做到这一点?

【问题讨论】:

  • 任何带有完整源代码的示例?

标签: powershell return-value exit-code windows-installer


【解决方案1】:

我会将它包装在 Start-Process 中并使用生成的进程对象的 ExitCode 属性。例如

(Start-Process -FilePath "msiexec.exe" -ArgumentList "<<whatever>>" -Wait -Passthru).ExitCode

【讨论】:

  • 这就是我想要的!但是,它是“ArgumentList”而不是“ArgumentsList”,但无论如何你回答了这个问题 - 谢谢!
  • 注释; 1.在带引号的 -ArgumentList 中,参数以空格分隔,单引号可用于保存项目,例如名称中带有空格的路径。 2.ExitCode 仅在所有生成的窗口都关闭时才可用; 3.我在 PS v4.0 上。
  • 如果你不能使用引用的-ArgumentList " '$arg1\ with spaces\' arg2",你可以用逗号分隔多个参数-ArgumentList "$arg1\ with spaces\", arg2,一旦它停止查找逗号,PowerShell 假定下一个是另一个位置参数,或者类似-Wait 它将继续处理命名参数。
【解决方案2】:
$LastExitCode

$?

取决于你的追求。前者是一个整数,后者只是一个布尔值。此外,$LastExitCode 仅针对正在运行的本机程序填充,而$? 通常会告知上次命令运行是否成功 - 因此也会为 cmdlet 设置它。

PS Home:\> cmd /c "echo foo"; $?,$LASTEXITCODE
foo
True
0
PS Home:\> cmd /c "ech foo"; $?,$LASTEXITCODE
'ech' is not recognized as an internal or external command,
operable program or batch file.
False
1

【讨论】:

    【解决方案3】:

    您还可以使用提供多种功能的 powershell 应用程序部署工具包。

    那么你可以使用例如

    Execute-MSI -Action 'Install' -Path "$dirFiles\your.msi" -AddParameters "INSTALLFOLDER=C:\$appFolder"
    

    信息http://psappdeploytoolkit.com/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-11
      • 1970-01-01
      • 1970-01-01
      • 2018-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多