HOWTO · PowerShell

Come ottenere il codice di uscita da Start-Process in PowerShell

Questo articolo spiegherà come ottenere il codice di uscita dopo aver eseguito uno script con il cmdlet start-process.

In questa pagina

Per leggere il codice di uscita di un processo avviato con PowerShell Start-Process, acquisisci l’oggetto processo con -PassThru e attendi che termini con -Wait. Poi leggi la proprietà 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

Questo esempio avvia l’eseguibile PowerShell corrente in una directory di lavoro temporanea e chiede al processo figlio di restituire il codice di uscita 7. Usare l’eseguibile corrente evita di dipendere da programmi disponibili solo su Windows, come cmd.exe; specificare la directory di lavoro evita inoltre di fare affidamento sulla directory corrente del chiamante. Sostituisci l’eseguibile e gli argomenti con quelli del programma che vuoi avviare. -Wait fa attendere a PowerShell il completamento, mentre -PassThru restituisce l’oggetto processo da cui leggere ExitCode. Il risultato fornito mostra Exit code: 7: l’etichetta Exit code resta in inglese perché il blocco di output è mantenuto identico. Convenzionalmente, il codice 0 indica un esito positivo; il significato di ogni valore diverso da zero dipende dal programma.

Ottenere il codice di uscita con -Wait e -PassThru

Usa entrambi i parametri quando il seguito dello script dipende dal risultato del programma avviato. -Wait stabilisce quando PowerShell prosegue, mentre -PassThru restituisce l’oggetto processo. Leggi ExitCode dopo la conclusione del processo per ottenerne il risultato finale.

Assegna $process.ExitCode a $exitCode e confrontalo con 0 prima di decidere come deve comportarsi lo script. Adatta la condizione ai codici di uscita documentati dal programma. Un valore diverso da zero non ha un significato universale: può indicare un errore oppure un altro esito documentato.

Perché $LastExitCode non restituisce il codice di uscita di Start-Process

Start-Process non valorizza $LastExitCode. Questa variabile contiene il codice di uscita dell’ultimo programma nativo eseguito direttamente nella sessione PowerShell corrente. Avviare un processo separato con Start-Process non rende disponibile il relativo codice di uscita tramite $LastExitCode.

Usa invece la proprietà ExitCode dell’oggetto processo restituito da Start-Process -PassThru. Se esegui direttamente un programma nativo, PowerShell aggiorna $LastExitCode al termine del programma; si tratta di un percorso di esecuzione distinto, che non recupera il risultato di un processo avviato con Start-Process.

Ottenere il codice di uscita da un oggetto processo con WaitForExit()

Puoi anche omettere -Wait, conservare l’oggetto processo e chiamare il relativo metodo WaitForExit() prima di leggere ExitCode. Questa soluzione è utile quando devi svolgere altre attività prima di attendere. Il metodo blocca l’esecuzione finché il processo non termina.

La sequenza equivalente è: avvia il processo con -PassThru, chiama WaitForExit() e poi leggi $process.ExitCode. Conserva l’oggetto processo associato al processo di cui ti serve il risultato; per questo metodo non usare $LastExitCode. Questa alternativa è descritta senza una trascrizione separata dell’output perché il pacchetto non contiene prove di esecuzione per essa.

Conclusione

Per un processo avviato con Start-Process, combina -PassThru e -Wait, quindi leggi la proprietà ExitCode dell’oggetto restituito. In alternativa, chiama WaitForExit() su quell’oggetto prima di leggere la proprietà. $LastExitCode si applica ai programmi nativi eseguiti direttamente da PowerShell, non a un processo avviato tramite Start-Process.