¿Cómo hacer que SCCM reconozca los códigos de retorno de la finalización del script Powershell?

9

Estoy usando una implementación de aplicación SCCM 2012 para instalar software. El tipo de instalación específico es un instalador programado, ya que SCCM seguía fallando por errores de validación de exe. El script es PowerShell e instala con éxito el software incluso cuando lo ejecuta SCCM.

El problema es que SCCM solo ve el retorno de 0 desde la finalización del script. He intentado write-host, return, write-output, y sólo un elemento de línea con el código para un reinicio suave. Ninguno de ellos parece ser leído por SCCM ya que el registro de ejecución de la aplicación captura un retorno de 0.

¿Cómo emites códigos de retorno de powershell para que SCCM pueda interpretarlos?

Colyn1337
fuente
¿Has probado algo como exit 1al final del script de PowerShell?
jscott
En este caso exites un cmdincorporado. En otros sistemas de implementación, vi archivos .ps1 ejecutados con starto cmd /c powershell.exe somefile.ps1. Perdón por el spitballing sin acceso a una prueba SCCM.
jscott

Respuestas:

9

Existe un problema conocido con los códigos de salida de PowerShell (consulte el final de esta respuesta) que puede manifestarse cuando se utilizan secuencias de comandos de instalación de PowerShell con SCCM. Para solucionar el problema, tomo dos medidas:

  1. Siempre hago que SCCM invoque un archivo por lotes que ejecuta el script de PowerShell invocando powershell.exeexplícitamente.
  2. Me aseguro de que cada ruta de código en el script de instalación finalice en una llamada explícita a [System.Environment]::Exit().

Con estas dos medidas, no he tenido un problema relacionado con los códigos de salida. Esa es una gran victoria porque la resolución de problemas de los códigos de salida de los scripts de instalación es un proceso lento porque tiene que esperar a que el cliente SCCM invoque su script para cada iteración de solución de problemas.

Este es el aspecto del archivo por lotes y el script de 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)
}

¿Por qué los códigos de salida no son confiables cuando SCCM invoca scripts de PowerShell directamente?

Así es como sabemos que los códigos de salida no son confiables:

alx9r
fuente