我正在使用 SCCM 2012 应用程序部署来安装软件。由于 SCCM 不断因 exe 验证错误而失败,因此特定安装类型是脚本安装程序。该脚本是 powershell,即使由 SCCM 执行也能成功安装软件。
问题是 SCCM 只能看到脚本完成时返回的 0。我尝试过write-host
、、和带有软重启代码的一行项目。SCCM 似乎都没有读取它们,因为应用程序执行日志捕获了 0 的返回值return
。write-output
如何从 powershell 输出返回代码以便 SCCM 可以解释它们?
答案1
已知 powershell 退出代码存在一个问题(请参阅此答案的结尾),在将 powershell 安装脚本与 SCCM 结合使用时可能会出现此问题。为了解决这个问题,我采取了两项措施:
- 我总是让 SCCM 调用一个批处理文件,该文件通过显式调用来运行 powershell 脚本
powershell.exe
。 - 我确保安装脚本中的每个代码路径都以对的明确调用结束
[System.Environment]::Exit()
。
有了这两项措施,我再也没有遇到过与退出代码相关的问题。这是一个巨大的胜利,因为排除安装脚本退出代码故障是一个缓慢的过程,因为您必须等待 SCCM 客户端在每次故障排除迭代中调用您的脚本。
批处理文件和 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 脚本时退出代码不可靠?
我们知道退出代码不可靠的原因如下:
- 至少有一个已知的错误,当以某种方式启动时,powershell 总是返回退出代码 0。
- 因此你只能依赖脚本的退出代码如果你确定它是如何启动的。
- 您永远无法确切知道 SCCM 如何启动 powershell 脚本 — — 特别是在 SCCM、Windows 和 WMF 版本中。