Normalnie byłoby użyć $?
do skontrolować stan ostatniego oświadczenia wykonane:
PS C:\> Write-Output 123 | Out-Null; $?
True
PS C:\> Non-ExistingCmdlet 123 | Out-Null; $?
False
Jednak to nie będzie działać z Invoke-Expression
, bo choć oświadczenie wewnątrz wyrazu przekazywane Invoke-Expression
może zakończyć się niepowodzeniem, Invoke-Expression
nazywają to samo będzie się udało (np. wyrażenie, choć nieważne/niefunkcjonalne został wywołany nie mniej)
z Invoke-Expression
będziesz trzeba użyć try:
try {
Invoke-Expression "Do-ErrorProneAction -Parameter $argument"
} catch {
# error handling go here, $_ contains the error record
}
lub pułapka:
trap {
# error handling goes here, $_ contains the error record
}
Invoke-Expression "More-ErrorProneActions"
Alternatywą jest Dołącz ";$?"
do wyrażenia chcesz wywołać:
$Expr = "Write-Host $SomeValue"
$Expr += ';$?'
$Success = Invoke-Expression $Expr
if(-not $Success){
# seems to have failed
}
ale opiera się na nie ma żadnego wyjścia potoku
Ten jest świetny –
Druga linia ostatniego przykładu musi być '$ Expr + = '; $?'', Aby uniknąć natychmiastowej interpretacji '$?'. – letmaik
@letmaik ładnie zauważył, całkowicie przeoczyłem to –