Invoke-Expression
將返回被調用的命令的所有文本。如何獲取「Invoke-Expression」的狀態,成功還是失敗?
但是我怎樣才能得到這個命令是否已經成功執行或失敗的系統返回值?在CMD中,我可以使用%errorlevel%
來獲得外部命令執行狀態。那麼PowerShell呢?
Invoke-Expression
將返回被調用的命令的所有文本。如何獲取「Invoke-Expression」的狀態,成功還是失敗?
但是我怎樣才能得到這個命令是否已經成功執行或失敗的系統返回值?在CMD中,我可以使用%errorlevel%
來獲得外部命令執行狀態。那麼PowerShell呢?
通常你會使用$?
檢查的最後一條語句的執行狀態:
PS C:\> Write-Output 123 | Out-Null; $?
True
PS C:\> Non-ExistingCmdlet 123 | Out-Null; $?
False
但是,這不會與Invoke-Expression
工作,因爲即使傳遞給Invoke-Expression
表達內聲明可能會失敗,在Invoke-Expression
調用它自會成功(即表達,雖然無效/非功能被調用沒有少)
隨着Invoke-Expression
你會必須使用try:
try {
Invoke-Expression "Do-ErrorProneAction -Parameter $argument"
} catch {
# error handling go here, $_ contains the error record
}
還是陷阱:
trap {
# error handling goes here, $_ contains the error record
}
Invoke-Expression "More-ErrorProneActions"
另一種方法是你要調用的追加";$?"
表達式:
$Expr = "Write-Host $SomeValue"
$Expr += ';$?'
$Success = Invoke-Expression $Expr
if(-not $Success){
# seems to have failed
}
而是依靠沒有任何流水線輸出
在PowerShell中可以通過檢查automatic variables
$?
Contains True if last operation succeeded and False otherwise.
和/或
$LASTEXITCODE
Contains the exit code of the last Win32 executable execution.
前者用於PowerShell命令,後者爲外部命令(如%errorlevel%
在評估執行狀態批處理腳本)。
這對你有幫助嗎?
這一個很好 –
最後一個例子的第二行必須是'$ Expr + ='; $?''以避免直接解釋'$?'。 – letmaik
@letmaik很好地發現,完全忽略了 –