如何在 Windows PowerShell ISE 中调试脚本How to Debug Scripts in Windows PowerShell ISE
断点是脚本中你想要操作暂停的指定位置,这样你可以检查变量的当前状态和脚本运行的环境。一旦你的脚本被断点暂停,你可以在控制台窗格中运行命令来检查你的脚本状态。你可以输出变量或运行其他命令。甚至可以修改对正在运行的脚本的上下文可见的任何变量的值。检查完你想要查看的内容后,可以恢复该脚本的运行。
可以在 Windows PowerShell 调试环境中设置三种类型的断点:
行断点 在脚本运行期间,当达到所指定的行时,脚本暂停
变量断点。每当指定变量的值发生变化时,脚本就会暂停。
命令断点。在脚本运行期间,每当要运行指定命令时,脚本暂停。它可以包括参数,以便仅对所需操作进一步筛选断点。该命令还可以是你创建的函数。
其中,在 Windows PowerShell ISE 调试环境中,只有行断点可以通过使用菜单或键盘快捷方式进行设置。可以设置其他两种类型的断点,但应通过使用 Set-PSBreakpoint cmdlet 从控制台窗格中进行设置。本部分介绍了如何通过使用菜单(若有)在 Windows PowerShell ISE 中执行调试任务,并通过脚本从控制台窗格中执行更广泛的命令。
设置断点To set a breakpoint
仅当保存脚本后,才可以在其中设置断点。右键单击你想要设置行断点的行,然后单击“切换断点”。或者,单击你想要设置的行断点所在的行,然后按 F9,或在“调试”菜单上,单击“切换断点”。
以下脚本是如何通过使用 Set-PSBreakpoint cmdlet 从控制台窗格中设置变量断点的示例。
列出所有断点List all breakpoints
在当前 Windows PowerShell 会话中显示所有断点。
在“调试”菜单上,单击“列表断点”。以下脚本是如何通过使用 Get-PSBreakpoint cmdlet 从控制台窗格中列出所有断点的示例。
Get-PSBreakpoint
移除断点Remove a breakpoint
移除断点会将其删除。
如果你认为稍后还可能再次使用,请考虑改为禁用断点。右键单击你想要移除的断点所在的行,然后单击“切换断点”。或者,单击你想要移除的断点所在的行,然后在“调试”菜单上,单击“切换断点”。以下脚本是如何通过使用 cmdlet 从控制台窗格中移除具有指定 ID 的断点的示例。
# This command deletes the breakpoint with breakpoint ID 2.
Remove-PSBreakpoint -Id 2
移除所有断点Remove All Breakpoints
以下脚本是如何通过使用 cmdlet 从控制台窗格中移除所有断点的示例。
禁用断点不会将断点移除;只是会将其关闭,直至启用。若要禁用特定行断点,右键单击你想要禁用的行断点所在的行,然后单击“切换断点”。或者,单击你想要禁用的断点所在的行,然后按 F9,或在“调试”菜单上,单击“禁用断点”。以下脚本是如何通过使用 Disable-PSBreakpoint cmdlet 从控制台窗格中移除具有指定 ID 的断点的示例。
Disable-PSBreakpoint -Id 0
禁用所有断点Disable All Breakpoints
禁用断点不会将断点移除;只是会将其关闭,直至启用。若要禁用在当前会话中的所有断点,在“调试”菜单上,单击“禁用所有断点”。以下脚本是如何通过使用 Disable-PSBreakpoint cmdlet 从控制台窗格中禁用所有断点的示例。
# This command disables all breakpoints in the current session.
# You can abbreviate this command as: "gbp | dbp".
启用断点Enable a Breakpoint
若要启用特定断点,右键单击你想要启用的断点所在的行,然后单击“启用断点”。或者,单击你想要启用的断点所在的行,然后按 F9,或在“调试”菜单上,单击“启用断点”。以下脚本是如何通过使用 Enable-PSBreakpoint cmdlet 从控制台窗格中启用特定断点的示例。
启用所有断点Enable All Breakpoints
若要启用在当前会话中定义的所有断点,在“调试”菜单上,单击“启用所有断点”。以下脚本是如何通过使用 Enable-PSBreakpoint cmdlet 从控制台窗格中启用所有断点的示例。
# This command enables all breakpoints in the current session.
# You can abbreviate the command by using their aliases: "gbp | ebp".
Get-PSBreakpoint | Enable-PSBreakpoint
开始调试之前,必须设置一个或多个断点。你不能设置一个断点,除非已保存你想要调试的脚本。有关如何设置断点的说明,请参阅或 Set-PSBreakpoint。开始调试后,将无法编辑脚本,除非停止调试。运行之前,将自动保存设置有一个或多个断点的脚本。
启动调试To start debugging
按 F5 或在工具栏上,单击“运行脚本”图标,或在“调试”菜单上,单击“运行/继续”。脚本将一直运行,直到它遇到第一个断点。它将在此处暂停操作,并突出显示它暂停时所在的行。
按 F5 或在工具栏上,单击“运行脚本”图标,或在“调试”菜单上,单击“运行/继续”或在控制台窗格中,键入 C,然后按 ENTER。这将导致脚本继续运行到下一个断点,或如果接下来没有遇到任何断点的话运行到脚本的末尾。
查看调用堆栈To view the call stack
调用堆栈会显示脚本中的当前运行位置。如果脚本在由其他函数调用的函数中运行,则会由输出中的附加行在显示中表示。最底行显示原始脚本以及脚本中调用函数所在的行。下一行显示该函数以及函数中可能调用了另一个函数所在的行。最顶行显示设置了断点的当前行的当前上下文。
在暂停时,若要查看当前调用堆栈,请按 CTRL+SHIFT+D,或在“调试”菜单上,单击“显示调用堆栈”,在控制台窗格中,键入 K,然后按 ENTER。
停止调试To stop debugging
按 SHIFT-F5,或在“调试”菜单上,单击“停止调试器”,或者,在控制台窗格中,键入 Q,然后按 ENTER。
单步执行是一次运行一条语句的过程。你可以在一个代码行上停止,然后检查变量的值和系统状态。下表描述了常见的调试任务,如步越、步入和步出。
显示标准变量的值To display the values of standard variables
使用以下方法之一:
在脚本窗格中,将鼠标悬停在变量上,以在工具提示中显示它的值。
在控制台窗格中,键入变量的名称并按 ENTER。
ISE 中的所有窗格始终位于同一作用域中。因此,调试脚本时,你在控制台窗格中键入的命令在脚本作用域中运行。这样,你便可以使用控制台窗格查找变量的值,并调用仅在脚本中定义的函数。
显示自动变量的值To display the values of automatic variables
调试脚本时,可以使用前述方法显示几乎所有变量的值。但是,这些方法不适用于以下自动变量。
$
$Input
$MyInvocation
$PSBoundParameters
$Args
如果你尝试显示这些变量中的任何一个的值,你将获取调试器使用的内部管道中变量的值,而不是脚本中变量的值。对于一些变量($、$Input、$MyInvocation、$PSBoundParameters 和 $Args),可以使用以下方法解决此问题:
在脚本中,将自动变量的值分配给一个新变量。
例如,若要显示 $MyInvocation 变量的值,在脚本中,将该值分配给一个新变量(如 $scriptname),然后将鼠标悬停在 $scriptname 变量上,或键入 $scriptname 变量以显示其值。
$scriptname = $MyInvocation.MyCommand.Path