HOWTO · PowerShell

Como obter o código de saída do Start-Process no PowerShell

Este artigo explicará como obter o código de saída após executar um script com o cmdlet start-process.

Nesta página

Para obter o código de saída de um processo com Start-Process no PowerShell, capture o objeto do processo com -PassThru e aguarde a conclusão usando -Wait. Em seguida, leia a propriedade ExitCode:

$pwshPath = (Get-Process -Id $PID).Path
$workingDirectory = [System.IO.Path]::GetTempPath()
$process = Start-Process -FilePath $pwshPath -ArgumentList @('-NoProfile', '-Command', 'exit 7') -WorkingDirectory $workingDirectory -Wait -PassThru
"Exit code: $($process.ExitCode)"
Exit code: 7

Este exemplo inicia o executável atual do PowerShell em um diretório de trabalho temporário e solicita que o processo filho retorne o código de saída 7. Usar o executável atual evita depender de programas exclusivos do Windows, como cmd.exe; o diretório de trabalho explícito também evita depender do diretório atual de quem executa o comando. Substitua o executável e os argumentos pelo programa que você precisa executar. -Wait faz o PowerShell aguardar a conclusão, e -PassThru retorna o objeto do processo para que seja possível ler ExitCode. O exemplo exibe Exit code: 7; esse rótulo permanece em inglês porque o bloco de saída é preservado sem alterações. Convencionalmente, o código de saída 0 indica sucesso; o significado de qualquer valor diferente de zero é definido pelo programa.

Obter o código de saída com -Wait e -PassThru

Use os dois parâmetros quando a próxima etapa do script depender do resultado do programa iniciado. -Wait determina quando o PowerShell continuará, enquanto -PassThru fornece o objeto do processo. Leia ExitCode depois que o processo terminar para obter o resultado final.

Atribua $process.ExitCode a $exitCode e compare o valor com 0 antes de decidir o que o script deve fazer. Adapte a condição aos códigos de saída documentados pelo programa. Um valor diferente de zero não tem um significado universal: pode indicar um erro ou outro resultado documentado.

Por que $LastExitCode não informa o código de saída de Start-Process

Start-Process não preenche $LastExitCode. Essa variável informa o código de saída do programa nativo executado mais recentemente por invocação direta na sessão atual do PowerShell. Iniciar um processo separado com Start-Process não torna o código de saída desse processo disponível por meio de $LastExitCode.

Em vez disso, use a propriedade ExitCode do objeto de processo retornado por Start-Process -PassThru. Quando você invoca diretamente um programa nativo, o PowerShell atualiza $LastExitCode ao término desse programa. Esse é um caminho de invocação diferente e não recupera o resultado de um processo iniciado com Start-Process.

Obter o código de saída de um objeto de processo com WaitForExit()

Outra opção é omitir -Wait, manter o objeto do processo e chamar o método WaitForExit() antes de ler ExitCode. Isso é útil quando você precisa realizar outras tarefas antes de aguardar. O método bloqueia a execução até que esse processo termine.

A sequência equivalente é: iniciar o processo com -PassThru, chamar WaitForExit() e, então, ler $process.ExitCode. Mantenha o objeto de processo associado ao processo cujo resultado você precisa; não use $LastExitCode nesse caso. Esta alternativa é descrita sem uma transcrição de saída própria, pois o pacote não contém evidências de execução para ela.

Conclusão

Para um processo iniciado com Start-Process, combine -PassThru com -Wait e leia a propriedade ExitCode do objeto retornado. Como alternativa, chame WaitForExit() nesse objeto antes de ler a propriedade. $LastExitCode se aplica a programas nativos invocados diretamente pelo PowerShell, não a um processo iniciado por meio de Start-Process.