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