Je größer Skripts werden, desto größer ist die Wahrscheinlichkeit, dass sich Fehler in den Code einschleichen.
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$
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
Auf einen Fehler kann Powershell mit verschiedenen Verhaltensweisen reagieren.
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
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.
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.