Opdater :
if ($LASTEXITCODE -eq 0) ...tilgang vil fortsætte med at arbejde robust med eksterne programmer.- Men hvis og når præ-v7.2 eksperimentel funktion
navngivet
PSNotApplyErrorActionToStderrbliver en officiel funktion,if ($?) ...vil også fungere robust - se dette svar for mere information.
Brug $LASTEXITCODE -eq 0 i stedet for $? for pålideligt at detektere en udgangskode, der ikke er nul (typisk signaleringsfejl) rapporteret af et eksternt program.
Du kan derefter bruge *> $null for kategorisk at undertrykke alt output uden at skulle bekymre dig om virkningen af den omdirigering på $? :
mysql -u root --password=mypass -e "show databases" *>$null
if ($LASTEXITCODE -eq 0) {
"Hooray!"
} else {
"Boo!"
}
Brug af en omdirigering, der involverer PowerShells fejlstrøm - enten eksplicit via 2> eller implicit via *> - betyder, at hvis nogen data modtages via den strøm - hvilket i tilfælde af opkald til et eksternt program betyder enhver udgang fra stderr - PowerShell sætter $? til $false .
Men i området for eksterne konsol-/terminalprogrammer bruges stderr ikke kun til at udsende fejl information, men enhver information, der ikke er data , såsom statusoplysninger. Derfor du kan ikke udlede fejl fra tilstedeværelsen af stderr-output .
Eksterne konsol-/terminalprogrammer kommunikerer deres successtatus udelukkende via deres afgangskode , som PowerShell afspejler i den automatiske $LASTEXITCODE variabel.
Det følger af ovenstående, at $? kan være $false også selvom udgangskoden er 0 , så det er ikke en pålidelig succesindikator - i modsætning til $LASTEXITCODE .