Thông thường bạn sẽ sử dụng $?
để kiểm tra tình trạng của báo cáo kết quả cuối cùng thực hiện:
PS C:\> Write-Output 123 | Out-Null; $?
True
PS C:\> Non-ExistingCmdlet 123 | Out-Null; $?
False
Tuy nhiên, điều này sẽ không làm việc với Invoke-Expression
, bởi vì mặc dù một tuyên bố bên trong biểu hiện thông qua với Invoke-Expression
có thể thất bại, các Invoke-Expression
gọi nó tự sẽ đã thành công (ví dụ. các biểu hiện, mặc dù không hợp lệ/không hoạt động được gọi không ít)
với Invoke-Expression
bạn sẽ phải sử dụng thử:
try {
Invoke-Expression "Do-ErrorProneAction -Parameter $argument"
} catch {
# error handling go here, $_ contains the error record
}
hay một cái bẫy:
trap {
# error handling goes here, $_ contains the error record
}
Invoke-Expression "More-ErrorProneActions"
Cách khác là các append ";$?"
đến sự biểu hiện bạn muốn gọi:
$Expr = "Write-Host $SomeValue"
$Expr += ';$?'
$Success = Invoke-Expression $Expr
if(-not $Success){
# seems to have failed
}
nhưng dựa vào không có bất kỳ đầu ra đường ống nào
Nguồn
2015-09-02 09:09:08
Điều này là tuyệt vời –
Dòng thứ hai của ví dụ cuối cùng phải là '$ Expr + = '; $?'' Để tránh giải thích ngay lập tức '$?'. – letmaik
@letmaik được phát hiện độc đáo, hoàn toàn bị bỏ qua –