Wie kann SCCM Rückkehrcodes nach Abschluss des Powershell-Skripts erkennen?

9

Ich verwende eine SCCM 2012-Anwendungsbereitstellung, um Software zu installieren. Der spezifische Installationstyp ist ein Skriptinstallationsprogramm, da SCCM aufgrund von Exe-Validierungsfehlern immer wieder fehlschlug. Das Skript ist Powershell und installiert die Software erfolgreich, auch wenn sie von SCCM ausgeführt wird.

Das Problem ist, dass SCCM nur die Rückgabe von 0 nach Abschluss des Skripts sieht. Ich habe versucht write-host, return, write-output, und nur eine Position mit dem Code für einen weichen Neustart. Keiner von ihnen scheint von SCCM gelesen zu werden, da das App-Ausführungsprotokoll eine Rückgabe von 0 erfasst.

Wie geben Sie Rückkehrcodes von Powershell aus, damit SCCM sie interpretieren kann?

Colyn1337
quelle
Haben Sie so etwas wie exit 1am Ende des PowerShell-Skripts versucht ?
Jscott
In diesem Fall exitist ein cmdeingebauter. In anderen Bereitstellungssystemen habe ich gesehen, dass .ps1-Dateien mit startoder ausgeführt werden cmd /c powershell.exe somefile.ps1. Entschuldigung für das Spitballing ohne Zugriff auf einen SCCM-Test.
Jscott

Antworten:

9

Es gibt ein bekanntes Problem mit Powershell-Exit-Codes (siehe Ende dieser Antwort), das sich bei Verwendung von Powershell-Installationsskripten mit SCCM manifestieren kann. Um das Problem zu umgehen, ergreife ich zwei Maßnahmen:

  1. Ich habe immer SCCM eine Batch-Datei aufrufen lassen, die das Powershell-Skript durch powershell.exeexpliziten Aufruf ausführt .
  2. Ich stelle sicher, dass jeder Codepfad im Installationsskript mit einem expliziten Aufruf von endet [System.Environment]::Exit().

Mit diesen beiden Maßnahmen hatte ich kein Problem mit Exit-Codes. Dies ist ein großer Gewinn, da die Fehlerbehebung bei Exit-Codes von Installationsskripten ein langsamer Prozess ist, da Sie warten müssen, bis der SCCM-Client Ihr Skript für jede Iteration der Fehlerbehebung aufruft.

So sehen die Batchdatei und das Powershell-Skript aus:

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)
}

Warum sind Exit-Codes unzuverlässig, wenn SCCM Powershell-Skripte direkt aufruft?

Wir wissen, dass Exit-Codes unzuverlässig sind:

alx9r
quelle