调试 – 有没有办法进入调试器的错误?

有没有办法进入PowerShell调试器以回应错误? ErrorAction参数有几个值,但是我没有看到任何类似的调试。我想要的是打开调试器,如果我设置了一个断点,只有当发生错误(从,例如Write-Error)打开调试器。

编辑
我应该澄清一点:我主要是一个C#开发人员,对PowerShell来说有点新鲜,我期望的是类似于Visual Studio调试器为您提供“未处理的异常”的行为。 PowerShell命令看起来更常见的是抛出异常,而自定义脚本似乎主要使用Write-Error。我不认为我特别关心两者之间的区别,但我想处理两者。

Trevor Sullivan的答案下面提到你可以使用Set-PSBreakpoint -Command Write-Error -Action {break; };这似乎很好地抓住了这些案件。尽管如此,我发现在很多情况下,它实际上是一个命令,抛出一个我想打破的异常。如果您设置$ ErrorActionPreference =“stop”,Roman Kuzmin的回答似乎有效,但是我遇到的问题是我无法通过该程序,似乎突破该位置并结束脚本。如果$ ErrorActionPreference =“继续”它对我来说不起作用。陷阱通常似乎有一个类似的问题,它们从任何嵌套的范围中分离出来,这是不希望的。

当然。您可以使用Set-PSBreakpoint cmdlet在PowerShell中创建条件断点。考虑下面的代码。将其另存为脚本文件,然后执行。有一些在线评论,以帮助您了解发生了什么。

请记住,有三种不同类型的断点:

>线
>变量
>命令

命令断点

这个代码示例是使用命令断点类型,因为我告诉它仅在Get-WmiObject命令上设置断点。您可以选择指定一个特定的行号或一个变量断点类型。您可以使用-Action参数指定要在其下设置断点的条件。您必须在-Action ScriptBlock中的某处使用break关键字,以指示调试器暂停执行PowerShell脚本。

# 1. Reset $Error to $null
$WmiError = $null;

# 2. Clean up any existing breakpoints
Get-PSBreakpoint | Remove-PSBreakpoint;

# 3. Set breakpoint, but only on Get-WmiObject commands, when the $WmiError variable is not $null
Set-PSBreakpoint -Command Get-WmiObject -Action { if ($WmiError) { break; } };

# 4. Failed Get-WmiObject command
Get-WmiObject -Class Win32_NonExistentClass -ErrorVariable WmiError;

# 5. Successful Get-WmiObject command
#    PowerShell breaks here, because:
#     - It's a Get-WmiObject command
#     - The $WmiError variable is not null
Get-WmiObject -Class Win32_BIOS;

由于您提到使用Write-Error,您可以在出现Write-Error的行上设置PSBreakpoint。这是一个如何做的例子:

Set-PSBreakpoint -Command Write-Error -Action { break; };

很简单,对吧?

可变断点

此示例使用变量PSBreakpoint类型,但仅当变量的内容被修改时。您可以使用-Mode参数来确定在什么情况下可以创建变量断点:

>阅读
> ReadWrite
>写

码:

# 1. Clean up any existing breakpoints
Get-PSBreakpoint | Remove-PSBreakpoint;

# 2. Set a PSBreakpoint of type "variable" on a variable named "Data," but only when it has changed
Set-PSBreakpoint -Action { Write-Host -ForegroundColor Green -Object ('The $Data variable has changed! Value is: {0}' -f $Data); break; } -Variable Data -Mode Write;

# 3. No break on this line, because we are not changing the variable
Write-Host -Object $Data;

# 4. Execution is paused on this line, because we change the variable
$Data = 1;

线断点

现在我们已经看过变量和命令PSBreakpoint类型,最后一个要检测的断点类型是线断点。如果要复制/粘贴下面的代码,请保存并执行代码,您将看到代码在Write-Host行(恰好是第9行)中断,但只有当$ Service的Name属性变量等于WinRM。这就是-Action参数的ScriptBlock中的条件语句定义。

# 1. Clean up any existing breakpoints
Get-PSBreakpoint | Remove-PSBreakpoint;

# 2. Set a PSBreakpoint of type "line" on line #8, but only if the $Service variable's Name property equals 'winrm'
Set-PSBreakpoint -Action { if ($Service.Name -eq 'winrm') { break; } } -Line 9 -Script $MyInvocation.MyCommand.Path;

# 3. Get a list of Windows Services and iterate over them
foreach ($Service in (Get-WmiObject -Class Win32_Service)) {
    Write-Host -Object ('Service name is: {0}' -f $Service.Name);
}
http://stackoverflow.com/questions/20912371/is-there-a-way-to-enter-the-debugger-on-an-error

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:调试 – 有没有办法进入调试器的错误?