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
PSNotApplyErrorActionToStderr
bliver 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
.