Existe um problema conhecido com os códigos de saída do PowerShell (consulte o final desta resposta) que podem se manifestar ao usar os scripts de instalação do PowerShell com o SCCM. Para solucionar o problema, tomo duas medidas:
- Eu sempre tenho o SCCM invocar um arquivo em lote que executa o script powershell invocando
powershell.exe
explicitamente. - Asseguro que cada caminho de código no script de instalação termine em uma chamada explícita para
[System.Environment]::Exit()
.
Com essas duas medidas, não tive um problema relacionado aos códigos de saída. Essa é uma grande vantagem, pois a solução dos códigos de saída dos scripts de instalação é um processo lento, porque você precisa aguardar o cliente SCCM invocar seu script para cada iteração de solução de problemas.
Veja a aparência do script em lote e do 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 que códigos de saída não são confiáveis quando o SCCM invoca scripts de powershell diretamente?
Veja como sabemos que os códigos de saída não são confiáveis:
- Há pelo menos um bug conhecido em que o powershell sempre retorna um código de saída 0 quando lançado de uma determinada maneira.
- Portanto, você só pode confiar no código de saída de um script se tiver certeza de como ele é iniciado.
- Você nunca pode ter certeza de como exatamente o SCCM está lançando um script PowerShell - particularmente nas versões SCCM, Windows e WMF.