2015-09-02 20 views
7

Invoke-Expression sẽ trả về tất cả văn bản của lệnh được gọi.Cách nhận trạng thái "Gọi biểu thức", thành công hay thất bại?

Nhưng làm cách nào tôi có thể nhận được giá trị trả về của hệ thống cho dù lệnh này đã được thực thi thành công hay bị lỗi? Trong CMD, tôi có thể sử dụng %errorlevel% để nhận trạng thái thực thi lệnh bên ngoài. Còn PowerShell thì sao?

Trả lời

10

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

+0

Điều này là tuyệt vời –

+0

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

+0

@letmaik được phát hiện độc đáo, hoàn toàn bị bỏ qua –

6

Trong PowerShell bạn có thể đánh giá tình trạng thực hiện bằng cách kiểm tra các automatic variables

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

và/hoặc

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

Điều thứ nhất là cho PowerShell cmdlets, sau này cho các lệnh bên ngoài (như %errorlevel% trong tập lệnh batch).

Điều này có giúp ích cho bạn không?

+1

'Invoke-Expression' luôn đặt' $? 'Thành' $ true' bất kể cái gì, vì vậy '$?' Sẽ không giúp ích gì trong trường hợp đó. – ForNeVeR

+0

$ LASTEXITCODE hoạt động. Cảm ơn! – Nicholas

Các vấn đề liên quan