PowerShell-Grundlagen: Funktionen mit WhatIf und Confirm testen und bestätigen

Bei der Automatisierung mit der PowerShell kann schnell etwas schief gehen. Mit diesen Parametern lassen sich Funktionen testen und bestätigen.

Das Scripting mit der Windows PowerShell kann viel Zeit sparen, da die PowerShell so ziemlich alles in einer Microsoft-Umgebung von der Kommandozeile aus automatisieren und verwalten kann. Skripte für die PowerShell können dabei sehr einfach sein und nur einige Dateien oder Registry-Keys auflisten.

Skripte können aber auch riesig sein und hunderte Zeilen umfassen, um einen umfassenden Inventarisierungsbericht mit farbigen Markierungen und ordentlicher Formatierung zu erstellen. Beides wären Beispiele dafür, wie die PowerShell Konfigurationselemente ausliest. Geändert wird dabei zunächst gar nichts, es geht nur um das Auslesen des aktuellen Zustands. Diese und ähnliche Operationen werden typischerweise durch Cmdlets repräsentiert und nutzen als Namensbestandteil das Verb Get.

Die PowerShell kann aber auch verschiedene Tätigkeiten zum Hinzufügen, Entfernen und Verändern von Elementen ausführen. Cmdlets mit Verben wie New, Remove und Set als Namensbestandteile weisen auf solche Operationen hin. Wer innerhalb seines Unternehmens über eine ausreichende Entscheidungsgewalt verfügt und über ein wenig Wissen zu PowerShell, der kann durch die Automatisierung von Abläufen jede Menge Zeit einsparen – oder sich natürlich auch jede Menge Ärger einhandeln, falls die Automatisierung schiefgeht.

Glücklicherweise gibt es in der PowerShell Parameter, die irrtümliche Veränderungen an Skripten verhindern helfen. Dieser Artikel stellt Funktionen vor, die Berichte über mögliche Szenarien beim Ausführen von PowerShell-Befehlen erstellen. Zusätzlich wird das Einfügen von Eingabeaufforderungen gezeigt, mit denen sich bestimmte Aktionen vor dem Ausführen vom Anwender bestätigen lassen.

Beispiel einer einfachen PowerShell-Funktion

Für den Anfang betrachten wir eine Funktion, die eine fiktionale virtuelle Maschine (VM) entfernt. Die Funktion hat einen Parameter namens $VMName, der den Namen der virtuellen Maschine aufnimmt, die entfernt werden soll. Sobald der Befehl Remove-MyVM –VMName VM123 ausgeführt wird, entfernt dies die virtuelle Maschine umgehend.

Function Remove-MyVM

{

     [CmdletBinding()]

     param(

           [Parameter()]

           [string]$VMName

     )

     Remove-VM –VM $VMName

}

Jede Wette: Eines Tages wird es vorkommen, dass über die Funktion versehentlich die falsche virtuelle Maschine gelöscht wird. Mit dem Drücken der Eingabetaste ist die virtuelle Maschine auch schon Geschichte, und jeder Versuch zwecklos, sie wieder zurückzuholen. Wie ließe sich dies verhindern? Hierfür gibt es zwei Möglichkeiten.

WhatIf-Unterstützung

Eine Möglichkeit, einen solchen Fehler zu verhindern, stellt die WhatIf-Unterstützung dar. Diese stellt zwei Anforderungen: Die Nutzung eines Schlüsselworts namens SupportsShouldProcess in der Funktion, um diese als  WhatIf-tauglich zu kennzeichnen, und die Nutzung einer If-Then-Anweisung innerhalb der Funktion, die unterscheidet, ob die Aufgabe ausgeführt werden oder nur ein Bericht darüber erstellt werden soll, zu welchem Ergebnis die Ausführung in diesem Moment führen würde.

Function Remove-MyVM

{

    [CmdletBinding(SupportsShouldProcess)]

    param(

         [Parameter()]

         [string]$VMName

    )

    if ($PSCmdlet.ShouldProcess("VM $VMName",'Remove')) {

        Remove-VM –VM $VMName

    }      

}

Durch die Nutzung dieser beiden Komponenten in der Funktion gibt es nun die Möglichkeit, den Parameter -WhatIf in dieser Funktion zu nutzen, um das Funktionsergebnis zu begutachten, bevor die Änderungen tatsächlich vorgenommen werden.

Abbildung 1: Der Parameter WhatIf testet das Ergebnis einer Funktion, ohne dass dabei Änderungen vorgenommen werden.

Abbildung 1 zeigt, dass alleine die Nutzung des Parameters -WhatIf nun dafür sorgt, dass eine Nachricht ausgegeben wird, welche Folgen es gehabt hätte, wenn die Funktion regulär ausgeführt worden wäre. Die Strings Remove und VM MYVM entstammen beide den PowerShell-Parametern, die in der obigen Methode ShouldProcess() benutzt wurden.

Remove-MyVM –Confirm

Als weiteren Ansatz zur Fehlervermeidung bietet die PowerShell den Parameter -Confirm, der durch die Nutzung des Schlüsselworts SupportsShouldProcess ermöglicht wird. Der Parameter Confirm lässt sich verwenden, ohne jedwede Änderung an der obigen Funktion vornehmen zu müssen. In diesem Fall wird man, anders als bei der Nutzung des Parameters WhatIf, gefragt, ob die Funktion auch wirklich ausgeführt werden soll, es ist also eine manuelle Bestätigung erforderlich.

Abbildung 2: Der Parameter Confirm erfordert vor der Ausführung einer Funktion die manuelle Bestätigung.

Bei der Verwendung des Parameters Confirm wird bei jeder Ausführung eine Bestätigung angefragt, allerdings liegt es wie immer am Anwender, den Parameter tatsächlich auch überall anzufügen. Aber was wäre, wenn man unabhängig vom manuellen Setzen des Parameters jede Funktion bestätigen will? Auch das lässt sich bewerkstelligen, hierfür ist es zunächst erforderlich, die mögliche Auswirkung der Funktion einzuschätzen und einen Schwellenwert festzulegen.

Über die Variable $ConfirmPreferences lässt sich der Schwellenwert festlegen. Ist die Auswirkung der fraglichen Funktion größer, so wird automatisch eine Bestätigung zum Ausführen der Funktion abgefragt. Ist sie geringer, dann wird die Funktion ohne weiter Bestätigung ausgeführt.

Abbildung 3: Die Variable ConfirmPreference fügt automatische Bestätigungen ein.

Das bedeutet, dass die Funktion eine Auswirkung im Maße High aufweisen muss, um eine automatische Rückfrage auszulösen. Um diese Auswirkungsebene festzulegen, kann das Schlüsselwort ConfirmImpact genutzt werden, um diesem den Wert High zuzuweisen.

Function Remove-MyVM

{

    [CmdletBinding(SupportsShouldProcess,ConfirmImpact = 'High')]

    param(

         [Parameter()]

         [string]$VMName

    )

    if ($PSCmdlet.ShouldProcess("VM $VMName",'Remove')) {

        Remove-VM –VM $VMName

    }

}

Nun kann die Funktion ohne Verwendung des Parameters Confirm ausgeführt werden, und trotzdem wird zunächst eine Bestätigung zum Ausführen angefordert werden.

Abbildung 4: Starten Sie die Funktion Remove-MyVM ohne den Parameter Confirm.

Dies liegt daran, dass die Auswirkung der Funktion höher festgelegt wurden, als der Schwellenwert in den Einstellung von $ConfirmPreference, wordurch die automatische Bestätigung ausgelöst wird. Die Parameter WhatIf und Confirm bieten also einen guten Schutz gegen unvorsichtige PowerShell-Anwender. Wichtig ist es dabei lediglich, die Unterstützung auch im Voraus in die entsprechenden Funktionen einzubauen.

Folgen Sie SearchDataCenter.de auch auf Twitter, Google+ und Facebook!

Erfahren Sie mehr über Serverbetriebssysteme