如何在 Windows PowerShell ISE 中调试脚本

本文介绍如何使用 Windows PowerShell 集成脚本环境(ISE)视觉调试功能在本地计算机上调试脚本。

如何管理断点

断点是脚本中你想要操作暂停的指定位置,这样你可以检查变量的当前状态和脚本运行的环境。 一旦你的脚本被断点暂停,你可以在控制台窗格中运行命令来检查你的脚本状态。 可以输出变量或运行其他命令。 甚至可以修改当前脚本运行环境可见的任何变量的值。 检查完要查看的内容后,您可以恢复脚本的操作。

可以在 Windows PowerShell 调试环境中设置三种类型的断点:

  1. 行断点。 在脚本运行期间,当达到所指定的行时,脚本暂停

  2. 可变断点。 每当指定变量的值发生更改时,脚本将暂停。

  3. 命令断点。 每当指定命令即将在脚本的操作过程中运行时,脚本都会暂停。 它可以包括参数,以便仅对所需操作进一步筛选断点。 该命令也可以是创建的函数。

其中,在 Windows PowerShell ISE 调试环境中,只能使用菜单或键盘快捷方式设置换行点。 可以设置其他两种类型的断点,但应通过使用 Set-PSBreakpoint cmdlet 从控制台窗格中进行设置。 本部分介绍如何使用可用的菜单在 Windows PowerShell ISE 中执行调试任务,以及如何使用脚本从控制台窗格中执行更广泛的命令。

设置断点

只有在脚本保存后,才能设置断点。 右键单击要在其中设置行断点的行,然后单击“ 切换断点”。 或者,单击要在其中设置行断点的行,然后按 F9 或在 “调试” 菜单上单击“ 切换断点”。

以下脚本是一个示例,演示如何使用 Set-PSBreakpoint cmdlet 从控制台窗格中设置变量断点。

# This command sets a breakpoint on the Server variable in the Sample.ps1 script.
Set-PSBreakpoint -Script sample.ps1 -Variable Server

列出所有断点

显示当前 Windows PowerShell 会话中的所有断点。

“调试 ”菜单上,单击“ 列表断点”。 以下脚本是一个示例,演示如何使用 Get-PSBreakpoint cmdlet 列出控制台窗格中的所有断点。

# This command lists all breakpoints in the current session.
Get-PSBreakpoint

移除断点

移除断点会将其删除。

如果你认为稍后还可能再次使用,请考虑改为禁用断点。 右键单击要删除断点的行,然后单击 ToggleBreakpoint。 或者,单击要删除断点的行,然后在 “调试” 菜单上单击“ 切换断点”。 以下脚本展示了如何使用 Remove-PSBreakpoint cmdlet 删除控制台中具有指定 ID 的断点的示例。

# This command deletes the breakpoint with breakpoint ID 2.
Remove-PSBreakpoint -Id 2

移除所有断点

若要删除当前会话中定义的所有断点,请在 “调试” 菜单上单击“ 删除所有断点”。

以下脚本是一个示例,说明如何使用 Remove-PSBreakpoint cmdlet 从控制台面板中删除所有断点。

# This command deletes all of the breakpoints in the current session.
Get-PSBreakpoint | Remove-PSBreakpoint

禁用断点

禁用断点不会将其移除。 在启用之前,它会一直处于关闭状态。 若要禁用特定行断点,请右键单击要禁用断点的行,然后单击“ 禁用断点”。

或者,单击要禁用断点的行,然后按 F9 或在 “调试” 菜单上单击“ 禁用断点”。 以下脚本是一个示例,演示如何使用 Disable-PSBreakpoint cmdlet 从控制台窗格中删除具有指定 ID 的断点。

# This command disables the breakpoint with breakpoint ID 0.
Disable-PSBreakpoint -Id 0

禁用所有断点

禁用断点不会移除它,而是将其关闭,直到重新启用。 若要禁用当前会话中的所有断点,请在 “调试 ”菜单上,单击“ 禁用所有断点”。 以下脚本展示了如何通过使用 Disable-PSBreakpoint cmdlet 来禁用控制台窗格中的所有断点的示例。

# This command disables all breakpoints in the current session.
# You can abbreviate this command as: "gbp | dbp".
Get-PSBreakpoint | Disable-PSBreakpoint

启用断点

若要启用特定的断点,请右键单击要启用断点的行,然后单击“ 启用断点”。 或者,单击要启用断点的行,然后按 F9 或在 “调试 ”菜单上单击“ 启用断点”。 以下脚本是如何通过使用 Enable-PSBreakpoint cmdlet 从控制台窗格中启用特定断点的示例。

# This command enables breakpoints with breakpoint IDs 0, 1, and 5.
Enable-PSBreakpoint -Id 0, 1, 5

启用所有断点

若要启用当前会话中定义的所有断点,请在 “调试” 菜单上,单击“ 启用所有断点”。 以下脚本是如何通过使用 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。 开始调试后,在停止调试之前,无法编辑脚本。 在运行前,设置有一个或多个断点的脚本会被自动保存。

启动调试

F5 ,或在工具栏上单击 “运行脚本 ”图标,或在 “调试 ”菜单上单击“ 运行/继续”。 该脚本将运行,直到遇到第一个断点。 它将在此处暂停操作,并突出显示它暂停时所在的行。

继续调试

F5 或在工具栏上单击 “运行脚本 ”图标,或在 “调试 ”菜单上,单击“ 运行/继续 ”,或在控制台窗格中键入 C ,然后按 Enter。 这会导致脚本继续运行到下一个断点或脚本的末尾(如果没有遇到进一步的断点)。

查看调用堆栈

调用堆栈在脚本中显示当前运行位置。 如果脚本在由其他函数调用的函数中运行,那么输出的额外行会在显示中表示这一点。 最底部的行显示原始脚本及其中调用函数的行。 下一行显示该函数以及函数中可能调用了另一个函数所在的行。 最上面的行显示设置断点的当前行的当前上下文。

暂停时,若要查看当前调用堆栈,请按 Ctrl+SHIFT+D ,或在 “调试 ”菜单上单击“ 显示调用堆栈 ”,或在控制台窗格中键入 K ,然后按 Enter

停止调试

SHIFT+F5 或在 “调试 ”菜单上,单击“ 停止调试器”,或在控制台窗格中键入 Q ,然后按 Enter

如何在调试过程中步越、步入和步出

单步执行是一次运行一条语句的过程。 可以在代码行上停止,并检查变量的值和系统的状态。 下表描述了常见的调试任务,如步越、步入和步出。

调试任务 说明 如何在 PowerShell ISE 中完成此作
逐语句 执行当前语句,然后在下一个语句处停止。 如果当前语句是函数或脚本调用,则调试器会单步执行该函数或脚本,否则它会在下一个语句处停止。 F11,或在“调试”菜单上,单击“单步执行”,或者在控制台窗格中,键入 S,然后按 ENTER
逐过程 执行当前语句,然后在下一个语句处停止。 如果当前语句是函数或脚本调用,则调试器将执行整个函数或脚本,并在函数调用后在下一个语句处停止。 F10 ,或在 “调试 ”菜单上,单击“ 单步执行”,或在控制台窗格中键入 V 并按 Enter
步出 跳出当前函数,如果函数是嵌套的则返回上一级。 如果在主正文中,脚本将执行到末尾,或到下一个断点。 将执行跳过的语句,但不会单步遍历。 SHIFT+F11,或在“调试”菜单上,单击“单步跳出”,或在控制台窗格中键入O 并按 ENTER
Continue 继续执行到结束,或到下一个断点。 将执行已跳过的函数和调用,但不会进行单步遍历。 F5 或在 “调试 ”菜单上,单击“ 运行/继续”,或在控制台窗格中键入 C 并按 Enter

如何在调试时显示变量的值

在逐步执行代码时,可以在脚本中显示变量的当前值。

显示标准变量的值

使用以下方法之一:

  • 在“脚本窗格”中,将鼠标悬停在变量上以将其值显示为工具提示。

  • 在控制台窗格中,键入变量名称,然后按 Enter

ISE 中的所有窗格始终位于同一作用域内。 因此,在调试脚本时,在控制台窗格中键入的命令在脚本范围内运行。 这样,可以使用控制台窗格查找仅在脚本中定义的变量和调用函数的值。

显示自动变量的值

在调试脚本时,可以使用上述方法显示几乎所有变量的值。 但是,这些方法不适用于以下自动变量。

  • $_
  • $input
  • $MyInvocation
  • $PSBoundParameters
  • $args

如果尝试显示其中任一变量的值,则可以在调试器使用的内部管道中获取该变量的值,而不是脚本中变量的值。 可以使用以下方法解决几个变量($_$input$MyInvocation$PSBoundParameters$args)的问题:

  1. 在脚本中,将自动变量的值分配给新变量。

  2. 通过将鼠标悬停在脚本窗格中的新变量上或通过在控制台窗格中键入新变量来显示新变量的值。

例如,若要显示变量的值 $MyInvocation ,请在脚本中为新变量赋值,例如 $scriptName,然后将鼠标悬停或键入 $scriptName 变量以显示其值。

# In C:\ps-test\MyScript.ps1
$scriptName = $MyInvocation.PSCommandPath
# In the Console Pane:
.\MyScript.ps1
$scriptName
C:\ps-test\MyScript.ps1

另请参阅

探究 Windows PowerShell ISE