2017-09-04 37 views
1

我需要在PowerShell腳本來處理非終止錯誤的區別。什麼是最有效的方法呢?

要設置$ErrorActionPreference可變停止和使用try/catch語句

$ErrorActionPreference = 'stop' 
try{ 
    functionThatCanFail 
}catch{ 
    #Do Stuff 
} 

或清除$Error變量,然後評估它是否被填充

$Error.Clear() 
functionThatCanFail 
if($Error.Count -ne 0){ 
    #Do Stuff 
} 

回答

0

最簡單的方法是使用-ErrorVariable/-ev通用參數,它記錄由在指定的變量的給定小命令中報告的所有的非終止錯誤。

但是請注意,這只有的cmdlet先進功能 /腳本的作品,因爲只有他們支持common parameters - 看Patrick's helpful answer如何定義自己的函數作爲先進功能。

# Provoke a non-terminating error and silence it, 
# but store it in custom variable $err via common parameter -ErrorVariable 
Get-Item /NoSuchFile -ErrorAction SilentlyContinue -ErrorVariable err 

if ($err) { # if a/a least one non-terminating error was reported, handle it. 
    "The following non-terminating error(s) occurred:`n$err" 
} 

這樣一來,誤差分析是命令作用域,而無需記錄的狀態或改變會話級$Error收集的狀態。

但是,請注意,你不能處理終止錯誤這種方式。 有關PowerShell錯誤處理的全面概述,請參閱here

2

我想補充[CmdletBinding()]給你的函數,並把它在一個try/catch中。
由於列出CmdletBinding的,你現在可以打電話給你的函數參數-ErrorAction Stop
其他建議與$ErrorAction$Error.Clear()也將工作,但不是「乾淨」的方式。


function functionThatCanFail 
{ 
    [CmdletBinding()] 
    param 
    (
     $Param1 
    ) 

    #Do stuff 
} 

try 
{ 
    functionThatCanFail -ErrorAction Stop 
} 
catch 
{ 
    #Error case 
} 
+1

你能給爲什麼使用'$ Error.clear()'是不是「乾淨」的更詳細的解釋? –

+1

您將重置先前的錯誤消息,並且您必須添加其他if語句。這意味着更多的代碼,也許你想要處理$ Error變量中的錯誤以進一步操作。 – Patrick