Frage Powershell-Trap [Exception] fängt meinen Fehler nicht ein


Aus irgendeinem Grund fängt mein Skript die Ausnahme nicht ab, wenn ich das folgende Skript für eine Datei ausführe, die nicht existiert. Ich habe diesen Code aus Beispielen erstellt, die ich im Internet gefunden habe, aber es scheint nicht für mich zu funktionieren.

Ich würde mich über Tipps oder Hinweise freuen, wie Sie das beheben können.

Hinweis: Im folgenden Beispiel habe ich es auch versucht

trap [Exception] {

aber das hat auch nicht funktioniert.

Hier ist das Skript:

function CheckFile($f) {

      trap {
        write-host "file not found, skipping".
        continue
      }

      $modtime = (Get-ItemProperty $f).LastWriteTime

      write-host "if file not found then shouldn't see this"
}


write-host "checking a file that does not exist"
CheckFile("C:\NotAFile")
write-host "done."

Ausgabe:

PS > .\testexception.ps1
checking a file that does not exist
Get-ItemProperty : Cannot find path 'C:\NotAFile' because it does not exist.
At C:\Users\dleclair\Documents\Visual Studio 2010\lib\testexception.ps1:12 char:35
+       $modtime = (Get-ItemProperty <<<<  $f).LastWriteTime
    + CategoryInfo          : ObjectNotFound: (C:\NotAFile:String) [Get-ItemProperty], ItemNotFoundException
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetItemPropertyCommand

if file not found then shouldn't see this
done.
PS >

7
2017-08-26 02:11


Ursprung


Antworten:


Versuche es so:

trap { write-host "file not found, skipping";continue;}
$modtime = Get-ItemProperty c:\manoj -erroraction stop

Auf der Grundlage von Kommentaren des OP:

Ich glaube, Sie haben falsch verstanden, was in dem Artikel gesagt wird, mit dem Sie verlinkt sind:

In diesem Beispiel haben wir fortgeführt, um die Ausführung zu veranlassen, zu der zurückzukehren   Bereich, in dem sich die Falle befindet, und den nächsten Befehl ausführen. Es ist wichtig, dass   Beachten Sie, dass die Ausführung nur zum Gültigkeitsbereich des Traps zurückkehrt   Ausnahme wurde innerhalb einer Funktion oder sogar innerhalb einer if-Anweisung geworfen,   und gefangen außerhalb davon ... der Fortfahren wird am Ende von aufheben   der verschachtelte Bereich

Also wenn du so etwas machst:

trap{ write-host $_; continue;}
throw "blah"
write-host after

after wird gedruckt.

Aber wenn du so etwas machst:

trap{ write-host $_ ; continue}
function fun($f) {


      throw "blah"
      write-host after
}

fun
write-host "outside after"

after wird NICHT gedruckt, aber outside after wird sein.

Alternativ verwenden Sie einen try-catch-Block:

      try{
      $modtime = (Get-ItemProperty $f -erroraction stop).LastWriteTime
      write-host "if file not found then shouldn't see this"
      }
      catch{
        write-host "file not found, skipping".
      }

6
2017-08-26 03:51



Sie müssen einstellen $ErrorActionPreference zu SilentlyContinue innerhalb der Funktion oder außerhalb des Skripts (für globale Anwendung) für trap arbeiten. Alternativ (wie oben erwähnt), einstellen -ErrorAction gemeinsamer Parameter für die gleiche Sache.


0
2017-08-29 14:54