2015-09-02 10 views

Odpowiedz

10

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

+0

Ten jest świetny –

+0

Druga linia ostatniego przykładu musi być '$ Expr + = '; $?'', Aby uniknąć natychmiastowej interpretacji '$?'. – letmaik

+0

@letmaik ładnie zauważył, całkowicie przeoczyłem to –

6

W PowerShell można ocenić stan realizacji sprawdzając automatic variables

$? 
    Contains True if last operation succeeded and False otherwise. 

i/lub

$LASTEXITCODE 
    Contains the exit code of the last Win32 executable execution. 

pierwsza jest dla apletów poleceń PowerShell, drugi dla poleceń zewnętrznych (jak %errorlevel% w skrypty wsadowe).

Czy to pomaga?

+1

'Wyrażenie-Wyrażenie' zawsze ustawia' $? 'Na' $ true' bez względu na to, więc '$?' Nie pomoże w tym przypadku. – ForNeVeR

+0

$ LASTEXITCODE działa. Dzięki! – Nicholas

Powiązane problemy