2012-03-30 24 views

Trả lời

182

$ErrorActionPreference = "Stop" sẽ giúp bạn trở thành một phần của cách đó (tức là điều này rất hữu ích cho các lệnh ghép ngắn).

Tuy nhiên đối với EXE, bạn sẽ cần phải tự mình kiểm tra $LastExitCode sau mỗi lần gọi exe và xác định xem điều đó có thất bại hay không. Rất tiếc, tôi không nghĩ PowerShell có thể trợ giúp ở đây vì trên Windows, EXE không nhất quán về những gì cấu thành mã thoát "thành công" hoặc "không thành công". Hầu hết theo tiêu chuẩn UNIX của 0 cho thấy thành công nhưng không phải tất cả đều làm. Hãy xem CheckLastExitCode function in this blog post. Bạn có thể thấy nó hữu ích.

+2

'$ ErrorActionPreference =" Stop "' có hoạt động cho các chương trình được xử lý tốt (trả về 0 thành công) không? –

+10

Không, nó hoàn toàn không hoạt động đối với EXE. Nó chỉ hoạt động cho các lệnh ghép ngắn PowerShell chạy trong tiến trình. Đó là loại đau nhưng bạn phải kiểm tra $ LastExitCode sau mỗi lần gọi EXE, kiểm tra xem mã thoát dự kiến ​​và nếu thử nghiệm đó cho biết lỗi, bạn phải ném để chấm dứt thực thi tập lệnh, ví dụ: 'ném '$ exe không thành công với mã thoát $ LastExitCode" 'trong đó $ exe chỉ là đường dẫn đến EXE. –

+2

Được chấp nhận vì nó bao gồm thông tin về cách làm cho nó hoạt động với các chương trình bên ngoài. –

51

Bạn sẽ có thể thực hiện việc này bằng cách sử dụng câu lệnh $ErrorActionPreference = "Stop" khi bắt đầu tập lệnh.

Cài đặt mặc định là $ErrorActionPreferenceContinue, đó là lý do tại sao bạn thấy tập lệnh của mình tiếp tục xảy ra sau khi xảy ra lỗi.

+12

Điều này không ảnh hưởng đến các chương trình, chỉ các lệnh ghép ngắn. – Joey

4

Đáng buồn thay, due to buggy cmdlets like New-RegKey and Clear-Disk, không có câu trả lời nào trong số này là đủ. Tôi hiện đang giải quyết trên các dòng sau ở trên cùng của bất kỳ kịch bản PowerShell để duy trì sự tỉnh táo của tôi.

Set-StrictMode -Version Latest 
$ErrorActionPreference = "Stop" 
$PSDefaultParameterValues['*:ErrorAction']='Stop' 

và sau đó bất kỳ cuộc gọi có nguồn gốc được điều trị này:

native_call.exe 
$native_call_success = $? 
if (-not $native_call_success) 
{ 
    throw 'error making native call' 
} 

Đó mẫu gọi bản địa đang dần trở nên phổ biến đủ cho tôi rằng tôi có lẽ nên xem xét các tùy chọn để làm cho nó ngắn gọn hơn. Tôi vẫn là một newbie của powerhell, vì vậy đề xuất được hoan nghênh.

1

Tôi đến đây để tìm kiếm điều tương tự. $ ErrorActionPreference = "Stop" giết chết shell của tôi ngay lập tức khi tôi muốn nhìn thấy thông báo lỗi (tạm dừng) trước khi nó kết thúc. Rơi trở lại vào sự nhạy cảm lô của tôi:

IF %ERRORLEVEL% NEQ 0 pause & GOTO EOF 

tôi thấy rằng điều này làm việc khá nhiều như nhau đối với kịch bản ps1 đặc biệt của tôi:

Import-PSSession $Session 
If ($? -ne "True") {Pause; Exit} 
0

Bạn cần lỗi hơi khác nhau xử lý cho các chức năng PowerShell và cho gọi exe của, và bạn cần phải chắc chắn thông báo cho người gọi biết rằng tập lệnh của bạn đã bị lỗi. Xây dựng trên đầu trang của Exec từ thư viện Psake, một tập lệnh có cấu trúc bên dưới sẽ dừng trên tất cả các lỗi và có thể sử dụng làm mẫu cơ sở cho hầu hết các tập lệnh.

Set-StrictMode -Version latest 
$ErrorActionPreference = "Stop" 


# Taken from psake https://github.com/psake/psake 
<# 
.SYNOPSIS 
    This is a helper function that runs a scriptblock and checks the PS variable $lastexitcode 
    to see if an error occcured. If an error is detected then an exception is thrown. 
    This function allows you to run command-line programs without having to 
    explicitly check the $lastexitcode variable. 
.EXAMPLE 
    exec { svn info $repository_trunk } "Error executing SVN. Please verify SVN command-line client is installed" 
#> 
function Exec 
{ 
    [CmdletBinding()] 
    param(
     [Parameter(Position=0,Mandatory=1)][scriptblock]$cmd, 
     [Parameter(Position=1,Mandatory=0)][string]$errorMessage = ("Error executing command {0}" -f $cmd) 
    ) 
    & $cmd 
    if ($lastexitcode -ne 0) { 
     throw ("Exec: " + $errorMessage) 
    } 
} 

Try { 

    # Put all your stuff inside here! 

    # powershell functions called as normal and try..catch reports errors 
    New-Object System.Net.WebClient 

    # call exe's and check their exit code using Exec 
    Exec { setup.exe } 

} Catch { 
    # tell the caller it has all gone wrong 
    $host.SetShouldExit(-1) 
    throw 
} 
Các vấn đề liên quan