Aggiorna :
- Il
if ($LASTEXITCODE -eq 0) ...
l'approccio continuerà a funzionare in modo solido con programmi esterni. - Tuttavia, se e quando la versione precedente alla v7.2 funzione sperimentale
denominato
PSNotApplyErrorActionToStderr
diventa una funzionalità ufficiale,if ($?) ...
funzionerà anche in modo robusto - vedi questa risposta per ulteriori informazioni.
Usa $LASTEXITCODE -eq 0
anziché $?
per rilevare in modo affidabile un codice di uscita diverso da zero (tipicamente segnalazione di guasto) segnalato da un programma esterno.
Puoi quindi utilizzare *> $null
per sopprimere categoricamente tutto l'output senza doversi preoccupare dell'impatto di quel reindirizzamento su $?
:
mysql -u root --password=mypass -e "show databases" *>$null
if ($LASTEXITCODE -eq 0) {
"Hooray!"
} else {
"Boo!"
}
Utilizzo di un reindirizzamento che coinvolge il flusso di errori di PowerShell, in modo esplicito tramite 2>
o implicitamente tramite *>
- significa che se dei dati vengono ricevuti tramite quel flusso - che nel caso di chiamare un programma esterno significa qualsiasi output da stderr - PowerShell imposta $?
a $false
.
Tuttavia, nel regno dei programmi console/terminali esterni, stderr non viene utilizzato solo per generare errore informazioni, ma qualsiasi informazione che non sia dati , come le informazioni sullo stato. Pertanto, non puoi dedurre il fallimento dalla presenza di output stderr .
I programmi console/terminali esterni comunicano il loro stato di successo esclusivamente tramite il loro codice di uscita , che PowerShell riflette nel $LASTEXITCODE
automatico variabile.
Ne consegue da quanto sopra che $?
può essere $false
anche se il codice di uscita è 0
, quindi non è un indicatore di successo affidabile, a differenza di $LASTEXITCODE
.