
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.

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

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.

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

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.

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.

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.

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.

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.

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.

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

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.

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

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.

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.

- 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.

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.

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.