如何让SCCM识别Powershell脚本完成的返回码?

我正在使用SCCM 2012应用程序部署来安装软件。 特定的安装types是脚本安装程序,因为SCCM不能正常执行exevalidation错误。 该脚本是powershell,并成功安装该软件,即使由SCCM执行。

问题是SCCM只能看到脚本完成时返回0。 我已经尝试了write-hostreturnwrite-output ,只是一个与软重启代码的行项目。 由于应用程序执行日志捕获返回值为0,SCCM似乎没有人读取它们。

你如何从PowerShell输出返回代码,以便SCCM可以解释它们?

PowerShell退出代码存在一个已知问题(请参阅本答复的结尾),这些问题可能会在使用SCCM使用PowerShell安装脚本时出现。 为了解决这个问题,我采取了两个措施:

  1. 我总是通过显式调用powershell.exe调用一个运行powershell脚本的batch file。
  2. 我确保安装脚本中的每个代码path都以对[System.Environment]::Exit()的显式调用结束。

有了这两个措施,我还没有遇到与退出代码有关的问题。 这是一个巨大的胜利,因为解决安装脚本的退出代码是一个缓慢的过程,因为您必须等待SCCM客户端为每次故障排除调用脚本。

以下是batch file和PowerShell脚本的样子:

Install-Application.bat

 powershell.exe .\Install-Application.ps1 exit /b %errorlevel% 

Install-Application.ps1

 try { # do a bunch of installation stuff if ( $rebootNeeded ) { [System.Environment]::Exit(3010) } [System.Environment]::Exit(0) } catch { [System.Environment]::Exit(1) } 

为什么SCCM直接调用PowerShell脚本时退出代码不可靠?

以下是我们如何知道退出代码不可靠:

  • 至less有一个已知的错误,当以某种方式启动时,powershell总是返回0退出代码。
  • 因此, 如果您确定如何启动脚本, 只能依赖脚本的退出代码
  • 您永远无法确定SCCM如何启动PowerShell脚本 – 特别是在SCCM,Windows和WMF版本中。