Getty Images/iStockphoto

Wie Sie PowerShell-Skripte erfolgreich debuggen

Haben Sie ein PowerShell-Skript, das nicht funktioniert? Debuggen Sie es mit Breakpoints und ein paar Schritten in VS Code, und Sie sind auf dem Weg zum erfolgreichen Skripting.

Die meisten PowerShell-Skripte sind komplex, sodass es fast unmöglich ist, beim ersten Mal ein perfektes Skript zu schreiben. Das muss aber kein größeres Problem darstellen, da sich Skripte jederzeit debuggen lassen.

Das effektive Debuggen eines PowerShell-Skripts ist eine entscheidende Fähigkeit für jeden Skriptautor, vom neuen Desktop-Support-Techniker bis zum erfahrenen Entwickler. Sie müssen wissen, wie Sie Haltepunkte (Breakpoints) verwenden und wie Sie im Debugger in der PowerShell-Erweiterung für Visual Studio (VS) Code navigieren.

Um die Schritte in diesem Artikel nachvollziehen zu können, benötigen Sie PowerShell 7.5, VS Code und die PowerShell-Erweiterung in VS Code. Es gibt jedoch keine Betriebssystemanforderungen. Sie können PowerShell-7.5-Skripte in VS Code mit der PowerShell-Erweiterung unter Windows, macOS und den meisten Linux-Distributionen debuggen.

Wenn Sie eine PS1-Datei in VS Code öffnen und die PowerShell-Erweiterung noch nicht installiert haben, werden Sie aufgefordert, sie zu installieren.

Installation der PowerShell-Erweiterung
Abbildung 1: Installieren Sie die PowerShell-Erweiterung.

Wenn Sie sie manuell installieren müssen, gehen Sie zum Erweiterungssymbol und suchen Sie nach PowerShell.

PowerShell-Erweiterung
Abbildung 2: Suchen Sie die PowerShell-Erweiterung.

Um die Debug-Ansicht zu öffnen, drücken Sie auf Windows oder Linux Strg + Shift + D. Auf macOS drücken Sie Cmd + Shift + D. Dort klicken Sie auf den Link Erstellen Sie eine launch.json-Datei und wählen im Anschluss in der Eingabeaufforderung PowerShell als Umgebung aus. Dort entscheiden Sie sich für eine Art des Debuggens.

Breakpoints verstehen

Breakpoints sind benutzerdefinierte Punkte im Code, an denen der Debugger die Ausführung des Codes anhält, um Ihnen die Möglichkeit zu geben, den Status von Variablen zu bewerten, bevor Sie fortfahren. Das ist nützlich, da Sie so Probleme leicht identifizieren können.

Um Haltepunkte in VS Code festzulegen, setzen Sie den Cursor auf die Zeile, zu der Sie einen Breakpoint hinzufügen möchten, und drücken Sie die Taste F9. Sie können auch mit der Maus über den linken Rand fahren und auf den roten Punkt klicken, wie in Abbildung 3 dargestellt.

Hinzufügen von Breakpoints
Abbildung 3: Fügen Sie Breakpoints hinzu.

Sobald Sie den Breakpoint festgelegt haben, wird er durch einen leuchtend roten Punkt angezeigt, wie in Abbildung 4 dargestellt.

Kennzeichnung der Breakpoints
Abbildung 4: Breakpoints sind durch rote Punkte gezeichnet.

Breakpoints werden auch in der Breakpoint-Liste am unteren Rand des Debugger-Bereichs angezeigt, wie in Abbildung 5 dargestellt. Sie können Breakpoints über den Debugger-Bereich aktivieren oder deaktivieren.

Breakpoints im Debugger-Bereich
Abbildung 5: Die Breakpoints werden im Debugger-Bereich angezeigt.

So erfolgt das Debuggen

Wenn Sie Preisdaten aus Azure mithilfe der Preise-API abrufen möchten, könnte Ihr Skript wie folgt aussehen:

$azPricesApiBase = "https://prices.azure.com/api/retail/prices"
$filters = @(
    "serviceName eq 'Virtual Machines'",
    "priceType eq 'Reservation'",
    "armRegionName eq 'westus3'"
)
$url = "$azPricesApiBase?$filter=$($filters -join ' and ')"
 
$items = & {
    $out = Invoke-RestMethod $url
    $out
    while ($null -ne $out.NextPageLink) {
        $out = Invoke-RestMethod $out.NextPageLink
        $out
    }
}
 
$items | Export-Excel -Path "C:\temp\azPrices.xlsx" -AutoSize -TableName "AzurePrices"

In diesem Beispiel sollen alle Preise für Reservierungen virtueller Maschinen aus der Region West US 3 abgerufen werden. Da die API Paginierung verwendet, müssen Sie mehrere Abfragen ausführen, um alle Daten zu erhalten.

Wenn Sie dieses Skript in PowerShell ausführen, wird ein Fehler ausgegeben.

Fehlerausgabe
Abbildung 6: Es wird ein Fehler ausgegeben.

Der Fehler deutet darauf hin, dass etwas mit der URL nicht stimmt. Öffnen Sie das Skript in VS Code und starten Sie das Debugging.

Setzen Sie zunächst einen Breakpoint auf Zeile 10, da dort der Fehler auftritt.

Starten Sie als Nächstes das Skript im Debugging-Modus. Drücken Sie dazu auf Ihrer Tastatur F5 oder gehen Sie zum Menü Ausführen (Run) und wählen Sie Debugging starten (Start Debugging) aus. Wenn das Skript Zeile 10 erreicht, wird es am Breakpoint angehalten und die Zeile wird hervorgehoben, wie in Abbildung 7 dargestellt.

hervorgehobene Zeile
Abbildung 7: Die Zeile wird hervorgehoben.

Untersuchen Sie dann die URL-Variable, während das Skript im Debugger angehalten ist. Sie können den Inhalt von $url anzeigen, indem Sie entweder $url in das Terminal eingeben oder den entsprechenden Variablenbereich im Debugger im Abschnitt Skript erweitern und nach unten zu $url scrollen, wie in Abbildung 8 dargestellt.

Scrollen bis zu $url
Abbildung 8: Scrollen Sie bis zu $url.

Der gesamte erste Teil der URL, der in der Variablen $azPricesApiBase vorhanden ist, ist nicht sichtbar. Wenn Sie nach oben zu dieser Variablen scrollen oder sie in das Terminal eingeben, werden Sie feststellen, dass sie einen Wert hat, wie in Abbildung 9 dargestellt.

Wert von $azPricesApiBase
Abbildung 9: $azPricesApiBase hat einen Wert.

In Zeile 7, in der Sie die Variable $url erstellen, tritt ein unerwartetes Ereignis auf.

In diesem Fall gibt es zwei Probleme:

  • PowerShell interpretiert das Fragezeichen als Teil des Variablennamens. In diesem Fall müssen Sie das Fragezeichen maskieren.
  • Die API erfordert die wörtliche Zeichenfolge $filter als Teil der Abfrageparameter. In diesem Fall müssen Sie das Dollarzeichen maskieren, da sich die Zeichenfolge in doppelten Anführungszeichen befindet.

Nachdem beide Probleme behoben wurden, sieht Zeile 7 nun wie folgt aus:

$url = "$azPricesApiBase`?`$filter=$($filters -join ' and ')"

Klicken Sie anschließend auf die Schaltfläche Stopp, um den Debugger zu stoppen.

Stopp des Debuggers
Abbildung 10: Stoppen Sie den Debugger.

Führen Sie das Skript dann erneut aus, um festzustellen, dass $url korrekt aussieht.

korrekte Ausgabe
Abbildung 11: Hier sieht $url korrekt aus.

Das Skript wird erfolgreich bis zum Abschluss ausgeführt, mit der Ausnahme, dass die Daten, die in der Tabelle erwartet wurden, völlig anders sind.

andere Daten in Tabelle
Abbildung 12: Die Daten in der Tabelle sind anders.

Fügen Sie weitere Breakpoints in den Zeilen 11, 14 und 18 hinzu, damit Sie die abgerufenen Daten überprüfen können.

Hinzufügen neuer Breakpoints
Abbildung 13: Fügen Sie neue Breakpoints hinzu.

Wenn Sie das Skript anschließend ausführen und es in Zeile 11 stoppt, sehen Sie sich die Variable $out an. Die gewünschten Informationen befinden sich in einer Untereigenschaft namens Items.

Informationen bei Items
Abbildung 14: Suchen Sie die Informationen bei Items.

Verfolgen Sie den Wert von $out. Klicken Sie mit der rechten Maustaste darauf und wählen Sie Überwachen (Watch) aus. Es bleibt im Abschnitt Überwachen des Debugger-Fensters.

Wenn Sie möchten, dass das Skript fortgesetzt wird, verwenden Sie die Debugger-Steuerelemente. Die Optionen sind Continue, Step Over, Step Into, Step Out und Stop, wie in Abbildung 15 dargestellt.

unterschiedliche Optionen
Abbildung 15: Das sind die verschiedenen Optionen.
  • Continue: Fortsetzung bis zum nächsten Breakpoint oder bis zum Ende des Skripts
  • Step Over: Fortsetzung bis zur nächsten Anweisung im aktuellen Ausführungskontext
  • Step Into: Fortsetzung bis zur nächsten Anweisung, einschließlich verschachtelter Ausführungskontexte wie Funktionsaufrufe
  • Step Out: Fortsetzung des Debuggers in einem verschachtelten Ausführungskontext, bis der aktuelle Ausführungskotext verlassen wird
  • Stop: Stoppt das Debugging und beendet den Debugger

In diesem Fall klicken Sie auf Weiter (Continue), um zum nächsten Breakpoint zu gelangen. Drücken Sie F5 auf der Tastatur oder die Schaltfläche Weiter auf den Debugger-Steuerelementen, wie in Abbildung 16 zu sehen.

Fortfahren bis zum nächsten Breakpoint
Abbildung 16: Gehen Sie weiter zum nächsten Breakpoint.

In Zeile 14 ist der Wert von $out ähnlich. Er zeigt die gewünschte Ausgabe in der Eigenschaft Items an. Beenden Sie das Debugging und ändern Sie die Zeilen 11 und 14 so, dass sie sich auf die Items-Eigenschaft verweisen.

$out.Items

Entfernen Sie schließlich alle Breakpoints und führen Sie das Skript aus. Die Daten, die Sie erwarten, sollten in der Tabelle erscheinen.

korrekte Tabelle
Abbildung 17: Die Tabelle ist korrekt.

Die Bedeutung von Variablen

Es ist wichtig, Variablen zu verwenden, wo immer es möglich ist, um einen Code leicht zu debuggen. Variablen machen es einfach zu verstehen, was das Skript ausführt und wie es mit Cmdlets und Funktionen interagiert.

Wenn das Skript beispielsweise die URL in Übereinstimmung mit dem Cmdlet in Zeile 10 erstellt hätte, wäre es schwieriger gewesen zu verstehen, warum die URL falsch war, da sie im Debugger vorhanden gewesen wäre. Das ist es, was die Variable $url in Zeile 7 definiert.

Erfahren Sie mehr über Server- und Desktop-Virtualisierung