Назад | Перейти на главную страницу

Как заставить SCCM распознавать коды возврата после завершения сценария Powershell?

Я использую развертывание приложения SCCM 2012 для установки программного обеспечения. Конкретный тип установки - это установщик по сценарию, поскольку SCCM продолжал отказывать из-за ошибок проверки exe. Сценарий представляет собой PowerShell и успешно устанавливает программное обеспечение, даже когда выполняется SCCM.

Проблема в том, что SCCM видит только возврат 0 после завершения сценария. я пробовал write-host, return, write-output, и просто строка с кодом для мягкой перезагрузки. Кажется, что ни один из них не читается SCCM, поскольку журнал выполнения приложения фиксирует возврат 0.

Как вы выводите коды возврата из PowerShell, чтобы SCCM мог их интерпретировать?

Существует известная проблема с кодами выхода PowerShell (см. Конец этого ответа), которая может проявляться при использовании сценариев установки PowerShell с SCCM. Чтобы обойти проблему, я принимаю две меры:

  1. У меня всегда SCCM вызывает командный файл, который запускает сценарий PowerShell, вызывая powershell.exe явно.
  2. Я гарантирую, что каждый путь кода в сценарии установки заканчивается явным вызовом [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?

Вот как мы узнаем, что коды выхода ненадежны: