2016-08-04 95 views
1

如何正確使用ErrorAction參數與我的高級功能?比如我有這樣的功能:如何處理PowerShell高級函數ErrorAction參數?

function test1 { 
[CmdletBinding()] 
param([string]$path = "c:\temp") 

$src = Join-Path $path "src" 
$dest = Join-Path $path "dest" 

Copy-Item -Path $src $dest -Recurse -Verbose 
write "SomeText" 
} 

讓我們假設源路徑$ SRC不存在。而且我在執行此功能與ErrorAction =停止

test1 -ea stop 

我想到的是,錯誤將被拋出,我會看到「SomeText」的消息。但我得到了它:

Copy-Item : Cannot find path 'C:\temp\src' because it does not exist. 
At line:5 char:1 
+ Copy-Item -Path $path\src $path\dest -Recurse -Verbose 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : ObjectNotFound: (C:\temp\src:String) [Copy-Item], ItemNotFoundException 
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.CopyItemCommand 

SomeText 

我可以添加ErrorAction參數拷貝項目的test1的函數內部 cmdlet的,但我希望能夠明確地將其設置爲功能啓用/禁用錯誤操作行爲

我該怎麼做才能使它工作?

+0

無法重現此問題。哪個版本的PowerShell是這個?如果使用完整的參數名稱('test1 -ErrorAction Stop'),它有什麼區別? –

+0

同樣,在PowerShell 5中不可重現。 –

+0

我發現添加到** Copy-Item **中的w/o ** Verbose **參數可以正常工作(在出錯後立即停止)。但是** Verbose **參數不起作用。 PowerShell v.5 –

回答

1

您需要使用$PSBoundParameters和阿洛斯檢查$ErrorActionPreference

function test1 { 
    [CmdletBinding()] 
    param([string]$path = "c:\temp") 

    $src = Join-Path $path "src" 
    $dest = Join-Path $path "dest" 

    $errorAction = $PSBoundParameters["ErrorAction"] 
    if(-not $errorAction){ 
     $errorAction = $ErrorActionPreference 
    } 


    Copy-Item -Path $src $dest -Recurse -Verbose -ErrorAction $errorAction 
    write "SomeText" 
} 

$ErrorActionPreference = 'Stop' 
test1 

$ErrorActionPreference = 'continue' 
test1 -ErrorAction Stop 
0

我建議你把驗證事件的輸入參數,而不是像這樣:

param([ValidateScript({Test-Path $_})][string]$path = "c:\temp")