Bijwerken :
- De
if ($LASTEXITCODE -eq 0) ...
aanpak zal robuust blijven werken met externe programma's. - Echter, als en wanneer de pre-v7.2 experimentele functie
met de naam
PSNotApplyErrorActionToStderr
wordt een officiële functie,if ($?) ...
zal ook robuust werken - zie dit antwoord voor meer informatie.
Gebruik $LASTEXITCODE -eq 0
in plaats van $?
om op betrouwbare wijze een afsluitcode te detecteren die niet nul is (meestal signaleringsfout) gemeld door een extern programma.
U kunt dan gebruik *> $null
om alle uitvoer categorisch te onderdrukken zonder je zorgen te hoeven maken over de impact van die omleiding op $?
:
mysql -u root --password=mypass -e "show databases" *>$null
if ($LASTEXITCODE -eq 0) {
"Hooray!"
} else {
"Boo!"
}
een omleiding gebruiken die de foutstroom van PowerShell omvat - ofwel expliciet via 2>
of impliciet via *>
- betekent dat als er gegevens worden ontvangen via die stream - wat in het geval van het aanroepen van een extern programma elke uitvoer van stderr betekent - PowerShell stelt $?
in naar $false
.
Op het gebied van externe console- / terminalprogramma's wordt stderr echter niet alleen gebruikt om fout uit te voeren informatie, maar alle informatie die geen gegevens is , zoals statusinformatie. Daarom u kunt een fout niet afleiden uit de aanwezigheid van stderr-uitvoer .
Externe console-/terminalprogramma's communiceren hun successtatus uitsluitend via hun exitcode , die PowerShell weerspiegelt in de automatische $LASTEXITCODE
variabel.
Uit het bovenstaande volgt dat $?
kan $false
zijn zelfs als de afsluitcode 0
is , dus het is geen betrouwbare succesindicator - in tegenstelling tot $LASTEXITCODE
.