约 2107 字

约 11 分钟

#调试与跟踪

#简介

PowerShell 提供断点、单步调试、调试消息和内部跟踪等机制。对于无法通过阅读代码定位的问题,可以结合断点和 Trace-Command 观察命令绑定、类型转换等内部过程。

#设置断点

Set-PSBreakpoint 支持按行、命令或变量设置断点:

Set-PSBreakpoint -Script ./demo.ps1 -Line 10
Set-PSBreakpoint -Command Get-Process
Set-PSBreakpoint -Variable count -Mode Write
  • -Script -Line:在脚本指定行暂停。
  • -Command:在命令执行前暂停。
  • -Variable -Mode Write:变量被写入时暂停。

查看和删除断点:

Get-PSBreakpoint
Get-PSBreakpoint | Remove-PSBreakpoint

断点属于当前会话,关闭会话后不会保留。

#Wait-Debugger

Wait-Debugger 会在脚本执行到该位置时暂停,等待调试器继续:

function Test-Value { param([int]$Value); Wait-Debugger; $Value * 2 }
Test-Value -Value 21

在自动化或无人值守场景中应移除 Wait-Debugger,否则进程可能一直挂起。

#Set-PSDebug

Set-PSDebug 用于开启简单的脚本跟踪:

Set-PSDebug -Trace 1
./demo.ps1
Set-PSDebug -Off

-Trace 取值 0、1、2,分别表示关闭、跟踪脚本行、同时跟踪变量赋值和函数调用。-Step 逐行单步执行,-Strict 检查未初始化变量。Set-PSDebug 会显著降低执行速度,只应在排查问题时临时启用。

#Trace-Command

Trace-Command 可以跟踪 PowerShell 引擎的内部操作,例如参数绑定和类型转换:

Trace-Command -Name ParameterBinding -Expression {
    Get-Process -Name pwsh
} -PSHost

常用跟踪名称包括 ParameterBinding、CommandDiscovery、TypeConversion 和 ETS。-PSHost 表示把跟踪结果输出到当前主机。

#Write-Debug

Write-Debug 向调试流写入消息,只有在调试偏好允许时才会显示:

function Invoke-Task {
    [CmdletBinding()]
    param([string]$Name)

    Write-Debug "开始处理 $Name"
    "完成:$Name"
}

Invoke-Task -Name 'demo' -Debug

也可以临时设置 $DebugPreference = 'Continue' 来显示调试消息,排查完成后改回 'SilentlyContinue'。

#调试器基本命令

进入调试器后,可以使用以下单字符命令:

s 单步进入,v 单步跳过,o 跳出,c 继续,q 停止并退出,k 显示堆栈,l 列出源码,h 或 ? 显示帮助;也可以直接输入表达式查看值。

在脚本中也可以调用 Get-PSCallStack 查看当前调用堆栈。

#注意事项

  • 断点和 Set-PSDebug 都是会话级状态,排查完成后应清理。
  • 跟踪输出可能包含路径、变量值等敏感信息,分享日志前应检查。
  • Write-Debug 使用调试流,不会混入正常输出流。

#推荐阅读

更新: 2026/11/2

作者: planc

创建: 2026/11/2