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
PSNotApplyErrorActionToStderrdiventa 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 .