Inhalt

Vorheriges Thema

11. Objekte in der PS

Nächstes Thema

13. Aufgaben

Diese Seite

12. Fehlerbehandlung

Je größer Skripts werden, desto größer ist die Wahrscheinlichkeit, dass sich Fehler in den Code einschleichen.

12.1. What-if

Um zu sehen, welche Effekte ein Skript hat, kann man es mit dem sog. What-if-Paramter versehen.

# What exactly would happen if Stop-Process
# ended all processes beginning with "c"?
Stop-Process -Name c* -WhatIf

PS C:\> Stop-Process -Name c* -WhatIf
WhatIf: Ausführen des Vorgangs "Stop-Process" für das Ziel "conhost (1012)".
WhatIf: Ausführen des Vorgangs "Stop-Process" für das Ziel "conhost (2000)".
WhatIf: Ausführen des Vorgangs "Stop-Process" für das Ziel "csrss (368)".
WhatIf: Ausführen des Vorgangs "Stop-Process" für das Ziel "csrss (428)".

What-IF kann auch in eigene Funktionen integriert werden.

function MapDrive([string]$driveletter, [string]$target, [switch]$whatif)
{
        If ($whatif)
        {
                Write-Host "WhatIf: creation of a network drive " +
                "with the letter ${driveletter}: at destination $target"
        }
        Else
        {
                New-PSDrive $driveletter FileSystem $target
        }
}

MapDrive k \\127.0.0.1\C$ -whatif
WhatIf: creation of a network drive  + with the letter k: at destination \\127.0.0.1\C$

12.2. Confirm

Mit Hilfe des -confirm - Parameters wird vor der Ausführung eines Befehls eine Sicherheitsabfrage formuliert.

Stop-Service a* -Confirm

Bestätigung
Möchten Sie diese Aktion wirklich ausführen?
Ausführen des Vorgangs "Stop-Service" für das Ziel "Anwendungserfahrung
(AeLookupSvc)".
[J] Ja  [A] Ja, alle  [N] Nein  [K] Nein, keine  [H] Anhalten  [?] Hilfe
(Standard ist "J"):n

Bestätigung
Möchten Sie diese Aktion wirklich ausführen?
Ausführen des Vorgangs "Stop-Service" für das Ziel "Gatewaydienst auf
Anwendungsebene (ALG)".
[J] Ja  [A] Ja, alle  [N] Nein  [K] Nein, keine  [H] Anhalten  [?] Hilfe
(Standard ist "J"):

Da manche Befehle “kritischer” als andere Befehle sind, haben die Schöpfer der Powershell verschiedene Confirm-Level (Low, Medium, High, None) eingebaut und diese an bestimmte Befehle gebunden. So würde die Bestätigungsabfrage beim Löschen einer User-Mail per exchange-cmdlet auch dann eine Sicherheitsabfrage hervorrufen, wenn der -confirm - Parameter nicht übergeben wird. Dies kann über die Variable $ConfirmPreference gesteuert werden. Wenn diese auf “Low” gesetzt wird, wird immer einer Bestätigung verlangt, bei “None” findet keine bestätigung statt.

Calculator may be started and stopped without being called
# into question because Stop-Process is in the Medium category:
Calc
Stop-Process -Name calc
# If the default setting is changed from High to Low,
# PowerShell will automatically question every action:
$ConfirmPreference = "Low"
calc
Stop-Process -Name calc

12.3. ErrorAction

Auf einen Fehler kann Powershell mit verschiedenen Verhaltensweisen reagieren.

  • SilentlyContinue: Einfach weitermachen
  • Continue: Fehlermeldung anzeigen aber weitermachen
  • Stop: Ausführung des Skriptes anhalten
  • Inquire: Nachfragen, wie es sich verhalten soll.

Das Verhaltensweisen können mit Hilfe des Parameter -ErrorAction bzw. der globalen Variable $ErrorActionPreference gesteuert werden.

Del "nosuchthing"; Write-Host "Done!"

Del "nosuchthing" -ErrorAction "SilentlyContinue"; Write-Host "Done!"

$script:ErrorActionPreference = "Stop"  #globales Anhalten bei Fehlern

12.4. Erkennen und Behandeln von Fehlern

Häufig will man auf Fehler auch reagieren können. Eine Möglichkeit ist es, den Fehlerstatus eines Programms auszuwerten. Dieser kann über die globale Variable $? abgefragt werden. Wenn ein Fehler aufgetreten ist, hat diese Variable den Wert True.

Del "nosuchthing" -ErrorAction "SilentlyContinue"
If (!$?) { "Didn't work!"; break }; "Everything's okay!"

Del "nosuchthing" -ErrorAction "SilentlyContinue"
If (!$?) { "Error: $($error[0])"; break }; "Everything's okay!"
Error: Cannot find path "u:\nosuchthing" because it does not exist.

12.5. Error Status in $?

12.6. Benutzen von Traps

  • Traps Require Unhandled Exceptions
  • Using Break and Continue to Determine What Happens after an Error
  • Finding Out Error Details
  • Error Records: Error Details
  • Error Record by Redirection
  • Table 11.3: Properties of an error record
  • Error Record(s) Through the -ErrorVariable Parameter
  • Error Records Through $Error
  • Error Record Through Traps

12.7. Try - catch -finally

http://blogs.technet.com/b/heyscriptingguy/archive/2010/03/11/hey-scripting-guy-march-11-2010.aspx

Exceptions verstehen ====================

Fehler werden in modernen Programmiersprachen häufig mit dem neutralen Wort Ausnahmen bezeichnet. Beim Auftreten eines Fehlers wird eine Ausnahme ausgelößt, die von einer Stelle im Quellcode behandelt werden muss; ansonsten kommt es letztlich zu einer roten Fehlermeldung auf der Konsole.

Ausnahmen sind letztlich spezielle Fehlerklassen des .NET-Frameworks; für bestimmte Fehler gibt es jeweils spezielle Fehlerklassen.

In Abhängigkeit von bestimmten Fehler kann ein Skript nun unterschiedlich reagieren. Dies wird mit Hilfe des try – catch – finally - Konstruktes möglich.

12.8. Catching Errors in Functions and Scripts

  • Stepping Through Code: Breakpoints
  • Table 11.4: Settings for $DebugPreference
  • Table 11.5: Fine adjustments of the PowerShell console
  • Tracing: Displaying Executed Statements
  • Stepping: Executing Code Step-by-Step
  • Summary