Powershell
如何讓 SCCM 辨識來自 Powershell 腳本完成的返回碼?
我正在使用 SCCM 2012 應用程序部署來安裝軟體。特定的安裝類型是腳本安裝程序,因為 SCCM 一直因 exe 驗證錯誤而失敗。該腳本是 powershell,即使由 SCCM 執行,也能成功安裝軟體。
問題是 SCCM 僅從腳本的完成中看到返回 0。我試過
write-host
,return
,write-output
, 和只是一個帶有軟重啟程式碼的行項目。SCCM 似乎沒有讀取它們,因為應用程序執行日誌擷取返回 0。如何從 powershell 輸出返回碼以便 SCCM 可以解釋它們?
將 powershell 安裝腳本與 SCCM 一起使用時,powershell 退出程式碼存在一個已知問題(請參閱此答案的末尾)。為了解決這個問題,我採取了兩種措施:
- 我總是讓 SCCM 呼叫一個批處理文件,該批處理文件通過
powershell.exe
顯式呼叫來執行 powershell 腳本。- 我確保安裝腳本中的每個程式碼路徑都以顯式呼叫
[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 版本。