about_Debuggers
Kurze Beschreibung
Beschreibt den PowerShell-Debugger.
Lange Beschreibung
Das Debuggen ist der Prozess der Untersuchung eines Skripts, während es ausgeführt wird, um Fehler in den Skriptanweisungen zu identifizieren und zu beheben. Der PowerShell-Debugger kann Ihnen helfen, Fehler und Ineffizienzen in Ihren Skripts, Funktionen, Befehlen, Konfigurationen der gewünschten PowerShell-Zustandskonfiguration (PowerShell Desired State Configuration, DSC) oder Ausdrücken zu untersuchen und zu identifizieren.
Ab PowerShell 5.0 wurde der PowerShell-Debugger aktualisiert, um Skripts, Funktionen, Befehle, Konfigurationen oder Ausdrücke zu debuggen, die entweder in der Konsole oder in windows PowerShell Integrated Scripting Environment (ISE) auf Remotecomputern ausgeführt werden.
Hinweis
Windows PowerShell ISE unterstützt nur Windows PowerShell. Für PowerShell 6 und höher müssen Sie Visual Studio Code mit der Erweiterung für PowerShell verwenden. Weitere Informationen finden Sie unter Debuggen mit Visual Studio Code.
Debugger-Cmdlets
Der PowerShell-Debugger enthält die folgenden Cmdlets:
Set-PSBreakpoint
: Legt Haltepunkte für Linien, Variablen und Befehle fest.Get-PSBreakpoint
: Ruft Haltepunkte in der aktuellen Sitzung ab.Disable-PSBreakpoint
: Deaktiviert Haltepunkte in der aktuellen Sitzung.Enable-PSBreakpoint
: Aktiviert Haltepunkte in der aktuellen Sitzung erneut.Remove-PSBreakpoint
: Löscht Haltepunkte aus der aktuellen Sitzung.Get-PSCallStack
: Zeigt den aktuellen Aufrufstapel an.
Starten und Beenden des Debuggers
Um den Debugger zu starten, legen Sie einen oder mehrere Haltepunkte fest, und führen Sie dann das Skript, den Befehl oder die Funktion aus, die Sie debuggen möchten.
Wenn Sie einen Haltepunkt erreichen, wird die Ausführung beendet und die Steuerung an den Debugger übergeben.
Um den Debugger zu beenden, führen Sie das Skript, den Befehl oder die Funktion aus, bis er abgeschlossen ist.
Oder geben stop
Sie ein oder aus t
.
Debuggerbefehle
Wenn Sie den Debugger in der PowerShell-Konsole verwenden, verwenden Sie die folgenden Befehle, um die Ausführung zu steuern. Verwenden Sie in Windows PowerShell ISE Befehle im Menü "Debuggen".
Hinweis
Informationen zur Verwendung des Debuggers in anderen Hostanwendungen finden Sie in der Dokumentation zur Hostanwendung.
s
,StepInto
: Führt die nächste Anweisung aus und stoppt dann.v
,StepOver
: Führt die nächste Anweisung aus, überspringt jedoch Funktionen und Aufrufe. Die übersprungenen Anweisungen werden ausgeführt, aber nicht in Einzelschritten durchlaufen.Ctrl+Break
: (Alle in ISE unterbrechen) bricht in ein ausgeführtes Skript in der PowerShell-Konsole oder windows PowerShell ISE auf. Beachten Sie, dass strg+Break in Windows PowerShell 2.0, 3.0 und 4.0 das Programm schließt. "Alle unterbrechen" funktioniert sowohl auf lokalen als auch auf Remote-Skripts, die interaktiv ausgeführt werden.o
, :StepOut
Schritte aus der aktuellen Funktion; eine Ebene nach oben, wenn geschachtelt. Wenn sich der Haupttext befindet, wird er bis zum Ende oder zum nächsten Haltepunkt fortgesetzt. Die übersprungenen Anweisungen werden ausgeführt, aber nicht in Einzelschritten durchlaufen.c
, :Continue
Wird weiterhin ausgeführt, bis das Skript abgeschlossen ist oder bis der nächste Haltepunkt erreicht ist. Die übersprungenen Anweisungen werden ausgeführt, aber nicht in Einzelschritten durchlaufen.l
,List
: Zeigt den Teil des ausgeführten Skripts an. Standardmäßig werden die aktuelle Zeile, fünf vorherige Zeilen und 10 nachfolgende Zeilen angezeigt. Um mit der Auflistung des Skripts fortzufahren, drücken Sie die EINGABETASTE.l <m>
,List
: Zeigt 16 Zeilen des Skripts an, die mit der Zeilennummer beginnen, die durch<m>
.l <m> <n>
,List
: Zeigt<n>
Zeilen des Skripts an, beginnend mit der Zeilennummer, die durch<m>
.q
, , :Stop
Exit
Beendet die Ausführung des Skripts und beendet den Debugger. Wenn Sie einen Auftrag debuggen, indem Sie dasDebug-Job
Cmdlet ausführen, trennt der Befehl denExit
Debugger und ermöglicht es dem Auftrag, die Ausführung fortzusetzen.k
,Get-PsCallStack
: Zeigt den aktuellen Aufrufstapel an.<Enter>
: Wiederholt den letzten Befehl, wenn erStep
(s
),StepOver
(v
) oderList
(l
). Andernfalls stellt eine Sendeaktion dar.?
,h
: Zeigt die Hilfe zum Debuggerbefehl an.
Zum Beenden des Debuggers können Sie (q
) verwenden Stop
.
Ab PowerShell 5.0 können Sie den Befehl "Beenden" ausführen, um eine geschachtelte Debugsitzung zu beenden, die Sie gestartet haben, indem Sie entweder Debug-Job
oder Debug-Runspace
.
Mithilfe dieser Debuggerbefehle können Sie ein Skript ausführen, an einem bestimmten Punkt anhalten, die Werte von Variablen und den Status des Systems untersuchen und das Skript weiter ausführen, bis Sie ein Problem erkannt haben.
Hinweis
Wenn Sie eine Anweisung mit einem Umleitungsoperator ausführen, z >
. B. den PowerShell-Debugger, führt sie alle verbleibenden Anweisungen im Skript durch.
Anzeigen der Werte von Skriptvariablen
Während Sie sich im Debugger befinden, können Sie auch Befehle eingeben, den Wert von Variablen anzeigen, Cmdlets verwenden und Skripts an der Befehlszeile ausführen. Sie können den aktuellen Wert aller Variablen im Skript anzeigen, das gedebuggt wird, mit Ausnahme der folgenden automatischen Variablen:
$_
$Args
$Input
$MyInvocation
$PSBoundParameters
Wenn Sie den Wert einer dieser Variablen anzeigen, erhalten Sie den Wert dieser Variablen für eine interne Pipeline, die der Debugger verwendet, nicht den Wert der Variablen im Skript.
Um den Wert dieser Variablen für das skript anzuzeigen, das gedebuggt wird, fügen Sie Ihrem Skript Zeilen hinzu, um diese Werte in einer neuen Variablen zu speichern. Legen Sie ihren Haltepunkt nach diesen neuen Zeilen fest. Anschließend können Sie den Wert der neuen Variablen anzeigen.
Beispiel:
$scriptArgs = $Args
$scriptname = $MyInvocation.PSCommandPath
Die Debuggerumgebung
Wenn Sie einen Haltepunkt erreichen, geben Sie die Debuggerumgebung ein. Die Eingabeaufforderung ändert sich so, dass sie mit "[DBG]:"beginnt. Außerdem wird in einigen Hostanwendungen, z. B. der PowerShell-Konsole, eine geschachtelte Eingabeaufforderung zum Debuggen geöffnet. Sie können die geschachtelte Eingabeaufforderung erkennen, indem Sie die wiederholten größer als Zeichen (ASCII 62) erkennen, die an der Eingabeaufforderung angezeigt werden.
Weitere Informationen zum Anpassen der Eingabeaufforderung finden Sie unter about_Prompts.
Sie finden die Schachtelungsebene mithilfe der $NestedPromptLevel
automatischen Variablen. Die automatische Variable , $PSDebugContext
wird im lokalen Bereich definiert. Sie können das Vorhandensein der $PSDebugContext
Variablen verwenden, um zu bestimmen, ob Sie innerhalb des Debuggers ausgeführt werden.
Zum Beispiel:
if ($PSDebugContext) {"Debugging"} else {"Not Debugging"}
Sie können den Wert der $PSDebugContext
Variablen im Debugging verwenden.
[DBG]: PS>>> $PSDebugContext.InvocationInfo
Name CommandLineParameters UnboundArguments Location
---- --------------------- ---------------- --------
= {} {} C:\ps-test\vote.ps1 (1)
Debuggen und Bereich
Wenn Sie in den Debugger wechseln, ändert sich nicht der Bereich, in dem Sie arbeiten, aber wenn Sie einen Haltepunkt in einem Skript erreichen, wechseln Sie in den Skriptbereich. Der Skriptbereich ist ein untergeordnetes Element des Bereichs, in dem Sie den Debugger ausgeführt haben.
Um die Variablen und Aliase zu finden, die im Skriptbereich definiert sind, verwenden Sie den Scope-Parameter der Get-Alias
Oder Get-Variable
Cmdlets.
Beispielsweise ruft der folgende Befehl die Variablen im lokalen Bereich (Skript) ab:
Get-Variable -scope 0
Dies ist eine nützliche Möglichkeit, nur die Variablen anzuzeigen, die Sie im Skript definiert haben und die Sie beim Debuggen definiert haben.
Debuggen an der Befehlszeile
Wenn Sie einen variablen Haltepunkt oder einen Befehlshaltepunkt festlegen, können Sie den Haltepunkt nur in einer Skriptdatei festlegen. Standardmäßig ist der Haltepunkt jedoch für alle Elemente festgelegt, die in der aktuellen Sitzung ausgeführt werden.
Wenn Sie z. B. einen Haltepunkt für die $name
Variable festlegen, wird der Debugger für jede Variable $name
in allen Skripts, Befehlen, Funktionen, Skript-Cmdlets oder Ausdrücken unterbrochen, die Sie ausführen, bis Sie den Haltepunkt deaktivieren oder entfernen.
Auf diese Weise können Sie Ihre Skripts in einem realistischeren Kontext debuggen, in dem sie möglicherweise von Funktionen, Variablen und anderen Skripts in der Sitzung und im Benutzerprofil betroffen sind.
Zeilenumbruchpunkte sind spezifisch für Skriptdateien, sodass sie nur in Skriptdateien festgelegt werden.
Debuggen von Funktionen
Wenn Sie einen Haltepunkt für eine Funktion festlegen, die Abschnitte process
enthältbegin
end
, wird der Debugger an der ersten Zeile jedes Abschnitts umgebrochen.
Zum Beispiel:
function test-cmdlet {
begin {
write-output "Begin"
}
process {
write-output "Process"
}
end {
write-output "End"
}
}
C:\PS> Set-PSBreakpoint -command test-cmdlet
C:\PS> test-cmdlet
Begin
Entering debug mode. Use h or ? for help.
Hit Command breakpoint on 'prompt:test-cmdlet'
test-cmdlet
[DBG]: C:\PS> c
Process
Entering debug mode. Use h or ? for help.
Hit Command breakpoint on 'prompt:test-cmdlet'
test-cmdlet
[DBG]: C:\PS> c
End
Entering debug mode. Use h or ? for help.
Hit Command breakpoint on 'prompt:test-cmdlet'
test-cmdlet
[DBG]: C:\PS>
Debuggen von Remoteskripts
Sie können ausführen Enter-PSSession
, um eine interaktive PowerShell-Remotesitzung zu starten, in der Sie Haltepunkte festlegen und Skriptdateien und Befehle auf dem Remotecomputer debuggen können. Enter-PSSession
ermöglicht es Ihnen, eine getrennte Sitzung, die ein Skript oder einen Befehl auf einem Remotecomputer ausführt, erneut zu verbinden. Wenn das ausgeführte Skript auf einen Haltepunkt trifft, startet Ihre Clientsitzung automatisch den Debugger. Wenn die getrennte Sitzung, die ein Skript ausführt, bereits einen Haltepunkt erreicht hat, Enter-PSSession
startet der Befehlszeilendebugger automatisch, wenn Sie die Verbindung mit der Sitzung erneut herstellen.
Das folgende Beispiel zeigt, wie dies funktioniert. Haltepunkte wurden in den Zeilen 6, 11, 22 und 25 des Skripts festgelegt. Wenn der Debugger gestartet wird, gibt es zwei identifizierende Änderungen an der Eingabeaufforderung:
- Der Name des Computers, auf dem die Sitzung ausgeführt wird
- Die DBG-Eingabeaufforderung, mit der Sie wissen, dass Sie sich im Debugmodus befinden
Enter-PSSession -Cn localhost
[localhost]: PS C:\psscripts> Set-PSBreakpoint .\ttest19.ps1 6,11,22,25
ID Script Line Command Variable Action
-- ------ ---- ------- -------- ------
0 ttest19.ps1 6
1 ttest19.ps1 11
2 ttest19.ps1 22
3 ttest19.ps1 25
[localhost]: PS C:\psscripts> .\ttest19.ps1
Hit Line breakpoint on 'C:\psscripts\ttest19.ps1:11'
At C:\psscripts\ttest19.ps1:11 char:1
+ $winRMName = "WinRM"
# + ~
[localhost]: [DBG]: PS C:\psscripts>> list
6: 1..5 | foreach { sleep 1; Write-Output "hello2day $_" }
7: }
# 8:
9: $count = 10
10: $psName = "PowerShell"
11:* $winRMName = "WinRM"
12: $myVar = 102
# 13:
14: for ($i=0; $i -lt $count; $i++)
15: {
16: sleep 1
17: Write-Output "Loop iteration is: $i"
18: Write-Output "MyVar is $myVar"
# 19:
20: hello2day
# 21:
[localhost]: [DBG]: PS C:\psscripts>> stepover
At C:\psscripts\ttest19.ps1:12 char:1
+ $myVar = 102
# + ~
[localhost]: [DBG]: PS C:\psscripts>> quit
[localhost]: PS C:\psscripts> Exit-PSSession
PS C:\psscripts>
Beispiele
Dieses Testskript erkennt die Version von PowerShell und zeigt eine versionsgerechte Meldung an. Sie enthält eine Funktion, einen Funktionsaufruf und eine Variable.
Der folgende Befehl zeigt den Inhalt der Testskriptdatei an:
PS C:\PS-test> Get-Content test.ps1
function psversion {
"PowerShell " + $PSVersionTable.PSVersion
if ($PSVersionTable.PSVersion.Major -lt 7) {
"Upgrade to PowerShell 7!"
}
else {
"Have you run a background job today (start-job)?"
}
}
$scriptName = $MyInvocation.PSCommandPath
psversion
"Done $scriptName."
Um zu beginnen, legen Sie einen Haltepunkt an einem interessanten Punkt für das Skript fest, z. B. eine Zeile, einen Befehl, eine Variable oder eine Funktion.
Erstellen Sie zunächst einen Zeilenumbruchpunkt in der ersten Zeile des Skripts "Test.ps1" im aktuellen Verzeichnis.
PS C:\ps-test> Set-PSBreakpoint -line 1 -script test.ps1
Der Befehl gibt ein System.Management.Automation.LineBreakpoint-Objekt zurück.
Column : 0
Line : 1
Action :
Enabled : True
HitCount : 0
Id : 0
Script : C:\ps-test\test.ps1
ScriptName : C:\ps-test\test.ps1
Starten Sie nun das Skript.
PS C:\ps-test> .\test.ps1
Wenn das Skript den ersten Haltepunkt erreicht, gibt die Haltepunktmeldung an, dass der Debugger aktiv ist. Er beschreibt den Haltepunkt und zeigt eine Vorschau der ersten Zeile des Skripts an, bei der es sich um eine Funktionsdeklaration handelt. Die Eingabeaufforderung ändert sich auch, um anzugeben, dass der Debugger über Kontrolle verfügt.
Die Vorschauzeile enthält den Skriptnamen und die Zeilennummer des vorschauierten Befehls.
Entering debug mode. Use h or ? for help.
Hit Line breakpoint on 'C:\ps-test\test.ps1:1'
test.ps1:1 function psversion {
DBG>
Verwenden Sie den Befehl "Schritt" (s), um die erste Anweisung im Skript auszuführen und eine Vorschau der nächsten Anweisung anzuzeigen. Die nächste Anweisung verwendet die $MyInvocation
automatische Variable, um den Wert der $scriptName
Variablen auf den Pfad und Dateinamen der Skriptdatei festzulegen.
DBG> s
test.ps1:11 $scriptName = $MyInvocation.PSCommandPath
An diesem Punkt wird die $scriptName
Variable nicht aufgefüllt, aber Sie können den Wert der Variablen überprüfen, indem Sie dessen Wert anzeigen. In diesem Fall handelt es sich um den Wert $null
.
DBG> $scriptname
DBG>
Verwenden Sie einen anderen Step
Befehl (s
), um die aktuelle Anweisung auszuführen und eine Vorschau der nächsten Anweisung im Skript anzuzeigen. Die nächste Anweisung ruft die psversion
Funktion auf.
DBG> s
test.ps1:12 psversion
An diesem Punkt wird die $scriptName
Variable aufgefüllt, aber Sie überprüfen den Wert der Variablen, indem Sie dessen Wert anzeigen. In diesem Fall wird der Wert auf den Skriptpfad festgelegt.
DBG> $scriptName
C:\ps-test\test.ps1
Verwenden Sie einen anderen Schritt-Befehl, um den Funktionsaufruf auszuführen. Drücken Sie die EINGABETASTE, oder geben Sie "s" für Schritt ein.
DBG> s
test.ps1:2 "PowerShell " + $PSVersionTable.PSVersion
Die Debugnachricht enthält eine Vorschau der Anweisung in der Funktion. Um diese Anweisung auszuführen und eine Vorschau der nächsten Anweisung in der Funktion anzuzeigen, können Sie einen Step
Befehl verwenden. Verwenden Sie in diesem Fall jedoch einen StepOut-Befehl (o). Sie schließt die Ausführung der Funktion ab (es sei denn, sie erreicht einen Haltepunkt) und die Schritte zur nächsten Anweisung im Skript.
DBG> o
Windows PowerShell 2.0
Have you run a background job today (start-job)?
test.ps1:13 "Done $scriptName"
Da wir die letzte Anweisung im Skript verwenden, haben die Befehle "Step", "StepOut" und "Continue" den gleichen Effekt. Verwenden Sie in diesem Fall StepOut (o).
Done C:\ps-test\test.ps1
PS C:\ps-test>
Der Befehl "StepOut" führt den letzten Befehl aus. Die Standard-Eingabeaufforderung gibt an, dass der Debugger das Steuerelement beendet und an den Befehlsprozessor zurückgegeben hat.
Führen Sie nun den Debugger erneut aus. Zum Löschen des aktuellen Haltepunkts verwenden Sie zunächst die Get-PsBreakpoint
Und-Cmdlets Remove-PsBreakpoint
. (Wenn Sie denken, dass Sie den Haltepunkt möglicherweise wiederverwenden, verwenden Sie das Disable-PsBreakpoint
Cmdlet anstelle von Remove-PsBreakpoint
.)
PS C:\ps-test> Get-PSBreakpoint| Remove-PSBreakpoint
Sie können diesen Befehl wie folgt abkürzen:
PS C:\ps-test> gbp | rbp
Oder führen Sie den Befehl aus, indem Sie eine Funktion schreiben, z. B. die folgende Funktion:
function delbr { gbp | rbp }
Erstellen Sie nun einen Haltepunkt für die $scriptname
Variable.
PS C:\ps-test> Set-PSBreakpoint -variable scriptname -script test.ps1
Sie können den Befehl abkürten als:
PS C:\ps-test> sbp -v scriptname -s test.ps1
Starten Sie nun das Skript. Das Skript erreicht den variablen Haltepunkt. Der Standardmodus ist "Schreiben", sodass die Ausführung unmittelbar vor der Anweisung beendet wird, die den Wert der Variablen ändert.
PS C:\ps-test> .\test.ps1
Hit Variable breakpoint on 'C:\ps-test\test.ps1:$scriptName'
(Write access)
test.ps1:11 $scriptName = $MyInvocation.PSCommandPath
DBG>
Zeigt den aktuellen Wert der $scriptName
Variablen an, also $null
.
DBG> $scriptName
DBG>
Verwenden Sie einen Step
Befehl (s
), um die Anweisung auszuführen, die die Variable auffüllt. Zeigen Sie dann den neuen Wert der $scriptName
Variablen an.
DBG> $scriptName
C:\ps-test\test.ps1
Verwenden Sie einen Schrittbefehl (s), um eine Vorschau der nächsten Anweisung im Skript anzuzeigen.
DBG> s
test.ps1:12 psversion
Die nächste Anweisung ist ein Aufruf der psversion
Funktion. Um die Funktion zu überspringen, aber trotzdem auszuführen, verwenden Sie einen StepOver
Befehl (v
). Wenn Sie sich bereits in der Funktion befinden, wenn Sie sie verwenden StepOver
, ist sie nicht effektiv. Der Funktionsaufruf wird angezeigt, wird jedoch nicht ausgeführt.
DBG> v
Windows PowerShell 2.0
Have you run a background job today (start-job)?
test.ps1:13 "Done $scriptName"
Der StepOver
Befehl führt die Funktion aus, und es wird eine Vorschau der nächsten Anweisung im Skript angezeigt, die die letzte Zeile druckt.
Verwenden Sie einen Stop
Befehl (t
), um den Debugger zu beenden. Die Eingabeaufforderung wird auf die Standard-Eingabeaufforderung zurückgesetzt.
C:\ps-test>
Verwenden Sie Get-PsBreakpoint
die Und-Cmdlets Remove-PsBreakpoint
, um die Haltepunkte zu löschen.
PS C:\ps-test> Get-PSBreakpoint| Remove-PSBreakpoint
Erstellen Sie einen neuen Befehlstrennpunkt für die psversion
Funktion.
PS C:\ps-test> Set-PSBreakpoint -command psversion -script test.ps1
Sie können diesen Befehl abkürden wie folgt:
PS C:\ps-test> sbp -c psversion -s test.ps1
Führen Sie nun das Skript aus.
PS C:\ps-test> .\test.ps1
Hit Command breakpoint on 'C:\ps-test\test.ps1:psversion'
test.ps1:12 psversion
DBG>
Das Skript erreicht den Haltepunkt beim Funktionsaufruf. An diesem Punkt wurde die Funktion noch nicht aufgerufen. Auf diese Weise können Sie den Aktionsparameter Set-PSBreakpoint
verwenden, um Bedingungen für die Ausführung des Haltepunkts festzulegen oder vorbereitende oder Diagnoseaufgaben auszuführen, z. B. das Starten eines Protokolls oder das Aufrufen eines Diagnose- oder Sicherheitsskripts.
Verwenden Sie zum Festlegen einer Aktion einen Befehl "Weiter" (c), um das Skript zu beenden, und einen Remove-PsBreakpoint
Befehl, um den aktuellen Haltepunkt zu löschen. (Haltepunkte sind schreibgeschützt, sodass Sie dem aktuellen Haltepunkt keine Aktion hinzufügen können.)
DBG> c
Windows PowerShell 2.0
Have you run a background job today (start-job)?
Done C:\ps-test\test.ps1
PS C:\ps-test> Get-PSBreakpoint| Remove-PSBreakpoint
PS C:\ps-test>
Erstellen Sie nun einen neuen Befehlshaltepunkt mit einer Aktion. Der folgende Befehl legt einen Befehlshaltepunkt mit einer Aktion fest, die den Wert der $scriptName
Variablen protokolliert, wenn die Funktion aufgerufen wird. Da das break
Schlüsselwort in der Aktion nicht verwendet wird, wird die Ausführung nicht beendet. Der Backtick (`
) ist das Zeilenfortsetzungszeichen.
PS C:\ps-test> Set-PSBreakpoint -command psversion -script test.ps1 `
-action { add-content "The value of `$scriptName is $scriptName." `
-path action.log}
Sie können auch Aktionen hinzufügen, die Bedingungen für den Haltepunkt festlegen. Im folgenden Befehl wird der Befehlshaltepunkt nur ausgeführt, wenn die Ausführungsrichtlinie auf "RemoteSigned" festgelegt ist, die restriktivste Richtlinie, mit der Sie weiterhin Skripts ausführen können.
PS C:\ps-test> Set-PSBreakpoint -script test.ps1 -command psversion `
-action { if ((Get-ExecutionPolicy) -eq "RemoteSigned") { break }}
Das break
Schlüsselwort in der Aktion leitet den Debugger an, den Haltepunkt auszuführen. Sie können das continue
Schlüsselwort auch verwenden, um den Debugger ohne Unterbrechung auszuführen. Da das Standardschlüsselwort lautet continue
, müssen Sie angeben break
, um die Ausführung zu beenden.
Führen Sie nun das Skript aus.
PS C:\ps-test> .\test.ps1
Hit Command breakpoint on 'C:\ps-test\test.ps1:psversion'
test.ps1:12 psversion
Da die Ausführungsrichtlinie auf "RemoteSigned" festgelegt ist, wird die Ausführung beim Funktionsaufruf beendet.
An diesem Punkt sollten Sie den Aufrufstapel überprüfen. Verwenden Sie das Get-PsCallStack
Cmdlet oder den Get-PsCallStack
Debuggerbefehl (k
). Der folgende Befehl ruft den aktuellen Aufrufstapel ab.
DBG> k
2: prompt
1: .\test.ps1: $args=[]
0: prompt: $args=[]
In diesem Beispiel werden nur einige der vielen Möglichkeiten zum Verwenden des PowerShell-Debuggers veranschaulicht.
Weitere Debugfeatures in PowerShell
Zusätzlich zum PowerShell-Debugger enthält PowerShell mehrere weitere Features, die Sie zum Debuggen von Skripts und Funktionen verwenden können.
Das
Set-PSDebug
Cmdlet bietet sehr einfache Skriptdebuggingfeatures, einschließlich Schritt- und Ablaufverfolgung.Verwenden Sie das
Set-StrictMode
Cmdlet, um Verweise auf nicht initialisierte Variablen, Verweise auf nicht vorhandene Eigenschaften eines Objekts und funktionssyntax zu erkennen, die ungültig ist.Fügen Sie einem Skript Diagnoseanweisungen hinzu, z. B. Anweisungen, die den Wert von Variablen, Anweisungen anzeigen, die Eingaben aus der Befehlszeile lesen, oder Anweisungen, die die aktuelle Anweisung melden. Verwenden Sie die Cmdlets, die das Verb "Write" für diese Aufgabe enthalten, z
Write-Host
. B. , ,Write-Debug
,Write-Warning
undWrite-Verbose
.