2013-03-21 18 views
16

Mein Fall:ErrorActionPreference und -ErrorAction SilentlyContinue für Get-PSSessionConfiguration

$ErrorActionPreference = "Stop"; 
"1 - $ErrorActionPreference;" 
Get-ChildItem NoSuchFile.txt -ErrorAction SilentlyContinue; 
"2 - $ErrorActionPreference;" 
Get-ChildItem NoSuchFile.txt -ErrorAction Stop; 
"3 - $ErrorActionPreference;" 

Ausgang:

1 - Stop;
2 - Stopp; Jetzt
und eine Fehlermeldung ...

,

$ErrorActionPreference = "Stop"; 
"1 - $ErrorActionPreference;" 
(Get-PSSessionConfiguration -Name "MyShellUri" -ErrorAction SilentlyContinue) 
"2 - $ErrorActionPreference;" 

Ausgang:

1 - Stop; einen Fehler
und anzuzeigen ...

Warum funktioniert nicht -ErrorAction SilentlyContinue) für Get-PSSessionConfiguration?

Update:

Jetzt

$ErrorActionPreference = "Continue" 
"1 - $ErrorActionPreference;" 
(Get-PSSessionConfiguration -Name "MyShellUri" -ErrorAction SilentlyContinue) 
"2 - $ErrorActionPreference;" 

Ausgang:

1 - Weiter;
2 - Fortfahren;

Jetzt

$ErrorActionPreference = "SilentlyContinue" 
"1 - $ErrorActionPreference;" 
(Get-PSSessionConfiguration -Name "MyShellUri" -ErrorAction SilentlyContinue) 
"2 - $ErrorActionPreference;" 

Ausgang:

1 - SilentlyContinue;
2 - SilentlyContinuue;

Dieses reference:

Die ErrorAction allgegenwärtigen Parameter können verwendet werden, ohne Abbruch Fehler zum Schweigen zu bringen mit dem Parameterwert SilentlyContinue und es kann verwendet werden, um Fehler zu Abschlussfehlern zu konvertieren Nicht-Einstellung des Parameterwerts mit Stop . Es kann jedoch nicht helfen, Abbruchfehler zu ignorieren, und in diesem Fall gibt Stop-Transcript einen Abbruchfehler aus. Wenn Sie ignorieren möchten, verwenden Sie einen try/catch z.B .:

try { Stop-Transcript } catch {} 

Antwort

18

Eine Lösung für mich:

$old_ErrorActionPreference = $ErrorActionPreference 
$ErrorActionPreference = 'SilentlyContinue' 
if((Get-PSSessionConfiguration -Name "MyShellUri" -ErrorAction SilentlyContinue) -eq $null) { 
    WriteTraceForTrans "The session configuration MyShellUri is already unregistered." 
} 
else {   
    #Unregister-PSSessionConfiguration -Name "MyShellUri" -Force -ErrorAction Ignore 
} 
$ErrorActionPreference = $old_ErrorActionPreference 

Oder verwendet try-catch

try { 

(Get-PSSessionConfiguration -Name "MyShellUri" -ErrorAction SilentlyContinue) 

} 
catch { 

} 
+4

ich wusste nicht '-ErrorAction Stop' wird immer noch benötigt, um' catch' zu bekommen, um die Ausnahme zu bekommen: | – AceMark

0

Es sieht aus wie das ist eine „nicht behandelte Ausnahme“, was bedeutet, das Cmdlet selbst wurde nicht codiert zu erkennen und diese Ausnahme zu behandeln. Es explodierte, ohne jemals die interne Fehlerbehandlung ausführen zu müssen, daher kam die Einstellung -ErrorAction für das Cmdlet nie zum Einsatz.

1

Tip #2

Können Sie nicht den klassischen 2> Umleitungsoperator verwenden.

(Get-PSSessionConfiguration -Name "MyShellUri" -ErrorAction SilentlyContinue) 2> $NULL 
if(!$?){ 
    'foo' 
} 

Ich mag keine Fehler, also vermeide ich sie um jeden Preis.