Sonntag, April 5, 2020

Powershell versuchen / fangen / endlich

Ich schrieb kürzlich ein Powershell-Skript, funktioniert Super – Allerdings möchte ich nun aktualisieren Sie das Skript und fügen Sie einige Fehler überprüfung /Behandlung -, Aber ich war ratlos an der ersten Hürde wie es scheint. Warum nicht den folgenden code zu arbeiten?

try {
  Remove-Item "C:\somenonexistentfolder\file.txt" -ErrorAction Stop
}

catch [System.Management.Automation.ItemNotFoundException] {
  "item not found"
}

catch {
  "any other undefined errors"
  $error[0]
}

finally {
  "Finished"
}

Wird der Fehler gefangen in den zweiten catch-block – Sie können finden Sie in der Ausgabe von $error[0]. Offensichtlich würde ich mag, um es zu fangen in der ersten block – Was bin ich? Dank

InformationsquelleAutor der Frage steve | 2011-07-21

2 Kommentare

  1. 35

    -ErrorAction Stop ist, Dinge zu verändern für Sie. Versuchen Sie dieses und sehen, was Sie bekommen:

    Catch [System.Management.Automation.ActionPreferenceStopException] {
    "caught a StopExecution Exception" 
    $error[0]
    }

    InformationsquelleAutor der Antwort Bruce

  2. 23

    Dass ist sehr merkwürdig.

    Ging ich durch ItemNotFoundException’s base Klassen getestet und die folgenden mehrere catches zu sehen, was würde fangen:

    try {
      remove-item C:\nonexistent\file.txt -erroraction stop
    }
    catch [System.Management.Automation.ItemNotFoundException] {
      write-host 'ItemNotFound'
    }
    catch [System.Management.Automation.SessionStateException] {
      write-host 'SessionState'
    }
    catch [System.Management.Automation.RuntimeException] {
      write-host 'RuntimeException'
    }
    catch [System.SystemException] {
      write-host 'SystemException'
    }
    catch [System.Exception] {
      write-host 'Exception'
    }
    catch {
      write-host 'well, darn'
    }

    Wie sich herausstellt, wurde die Ausgabe 'RuntimeException'. Ich habe auch versucht es mit einer anderen Ausnahme CommandNotFoundException:

    try {
      do-nonexistent-command
    }
    catch [System.Management.Automation.CommandNotFoundException] {
      write-host 'CommandNotFoundException'
    }
    catch {
      write-host 'well, darn'
    }

    Ausgabe 'CommandNotFoundException' richtig.

    Ich erinnere mich vage zu Lesen, die anderswo (obwohl ich nicht finden konnte, es wieder) Probleme mit diesem. In solchen Fällen, in denen Ausnahme-Filterung funktionierte nicht richtig, Sie fangen würde, die nächsten Type Sie konnten, und verwenden Sie dann eine switch. Die folgenden nur die Fänge Exception statt RuntimeException, aber ist das switch äquivalent zu meinem ersten Beispiel, der prüft alle Basistypen von ItemNotFoundException:

    try {
      Remove-Item C:\nonexistent\file.txt -ErrorAction Stop
    }
    catch [System.Exception] {
      switch($_.Exception.GetType().FullName) {
        'System.Management.Automation.ItemNotFoundException' {
          write-host 'ItemNotFound'
        }
        'System.Management.Automation.SessionStateException' {
          write-host 'SessionState'
        }
        'System.Management.Automation.RuntimeException' {
          write-host 'RuntimeException'
        }
        'System.SystemException' {
          write-host 'SystemException'
        }
        'System.Exception' {
          write-host 'Exception'
        }
        default {'well, darn'}
      }
    }

    Dieser schreibt 'ItemNotFound', wie es sollte.

    InformationsquelleAutor der Antwort Joel B Fant

Kostenlose Online-Tests