2016-03-24 8 views
1

In meinem Powershell-Skript habe ich die folgende Zeile:Wie kann ich Powershell einchecken, wenn Get-ChildItem fehlgeschlagen ist?

$DirectoryInfo = Get-ChildItem $PathLog | Where-Object { $_.PSIsContainer } 

einige Daten aus dem Pfad in den Variablen $PathLog zu lesen gegeben. Aber ich merke, dass, selbst wenn der Get-ChildItem Befehl fehlgeschlagen ist (zum Beispiel der angegebene Pfad in $PathLog nicht existiert) und ein Fehler in die Shell geschrieben wird, wird das Skript fortgesetzt. Wie kann ich prüfen, ob Get-ChildItem erfolgreich war? Ich möchte es verwenden, um eine if Klausel auslösen wie folgt, die das Skript in diesem Moment stoppt:

if (???) { 
    "There was an error" 
    return 
} 

Was in den Klammern setzen? Wie geht es anders?

Antwort

1

A "leichtgewichtige" Alternative zu try/catch/finally sind die $? automatischen Variablen. Wenn der vorherige Befehl fehlgeschlagen ist, hat er einen Wert von $false:

Get-ChildItem F:\non\existing\path -ErrorAction SilentlyContinue 
if(-not $?) 
{ 
    throw "Get-ChildItem failed" 
} 
0

Verwenden Try/Catch Block und -ErrorAction Stop:

try { 
    $DirectoryInfo = Get-ChildItem $PathLog -ErrorAction Stop | Where-Object { $_.PSIsContainer } 
} catch { 
    Write-Error "There was an error" 
    return 
} 
+0

Funktioniert nicht. Vielleicht ein Problem mit der Powershell-Version, die ich verwende? – Alex

+0

Es sollte funktionieren. Sein 'Write-Error' wird ebenfalls einen Fehler auslösen, aber sein Inhalt ist anders. –

1

können Sie einen Try/Catch Block verwenden, um die Fehler zu fangen wie @Beatcracker beantworten konnte oder wenn Sie wirklich nur egal, ob es succeeeded oder nicht, können Sie $? verwenden.

$?
Enthält den Ausführungsstatus der letzten Operation. Es enthält TRUE, wenn die letzte Operation erfolgreich war, und FALSE, wenn es fehlgeschlagen ist.

Quelle: about_Automatic_Variables

Wenn $? mit verstecke ich in der Regel den Fehler von Get-ChildItem zu, also habe ich -ErrorAction SilentlyContinue fügte hinzu, dass in der Probe zu tun.

$DirectoryInfo = Get-ChildItem c:\DoesntExist -ErrorAction SilentlyContinue | Where-Object { $_.PSIsContainer } 
if($?) { 
    "It worked!" 
} else { 
    "It failed! :-(" 
} 
Verwandte Themen