2016-08-04 19 views
1

Wie kann ich ErrorAction Parameter mit meiner erweiterten Funktion richtig verwenden? Zum Beispiel habe ich eine solche Funktion:Umgang mit Powershell Erweiterte Funktion ErrorAction Parameter?

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" 
} 

Ermöglicht den Quellpfad $ src übernimmt nicht vorhanden. Und ich diese Funktion mit -ErrorAction Ausführung = Stopp:

test1 -ea stop 

Ich gehe davon aus, dass der Fehler ausgelöst wird, und ich werde nicht siehe „EINTEXT“ -Meldung. Aber ich habe es:

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 

I -ErrorAction Parameter Copy-Item Cmdlets in der test1 Funktion hinzufügen könnte, aber Ich möchte in der Lage sein, explizit auf die Funktion einstellen zu aktivieren/Deaktivieren Sie das Fehleraktionsverhalten.

Was soll ich tun, damit es funktioniert?

+0

kann nicht, dieses Verhalten reproduzieren. Welche Version von PowerShell ist das? Macht es einen Unterschied, wenn Sie den vollständigen Parameternamen ('test1 -ErrorAction Stop') verwenden? –

+0

Ebenso nicht reproduzierbar in PowerShell 5. –

+0

Ich entdeckte, dass w/o ** Verbose ** -Parameter zu ** Copy-Item hinzugefügt ** es funktioniert gut (stoppt direkt nach dem Fehler). Aber mit ** Verbose ** Parameter funktioniert es nicht. PowerShell v.5 –

Antwort

1

Sie müssen $PSBoundParameters verwenden und überprüfen alos $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

Ich würde Ihnen vorschlagen, anstelle Prüfungsereignisse für Eingabeparameter zu setzen, wie folgt aus:

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