如何在 Powershell 抛出异常时显示行号

3
我的PowerShell脚本抛出了异常,但没有给出异常抛出的行号:
The process cannot access the file 'C:/path/to/foo.txt' because it is being used by another process.
+ CategoryInfo          : NotSpecified: (:) [Set-Content], IOException
+ FullyQualifiedErrorId : System.IO.IOException,Microsoft.PowerShell.Commands.SetContentCommand
+ PSComputerName        : localhost

我认为最好的做法是重构脚本,使用try/catch块来缩小抛出Set-Content异常的范围 - 但在这种情况下,由于脚本的规模较大,我正在尝试避免该选项。相反,我希望有一个自上而下的解决方案 - 例如,能够以添加了详细信息的方式调用脚本,使得Powershell在堆栈跟踪中打印行号(我相信Python默认会这样做)。Powershell 3.0原生支持这个吗?
编辑:被接受的答案to this question涉及try/catch方法,我已经提到这不是我的首选方法。再次问一下,有没有办法让PowerShell在抛出异常时报告行号,而不需要强制使用try/catch?我是否必须将整个脚本包装在通用的try/catch中?我是否必须使用一些--verbose标志调用脚本?Powershell 3.0支持类似的功能吗?

你能添加导致错误的脚本吗? - spicy.dll
1
应该有 At D:\PShell\SO\56588150.ps1:21 char:1 行(或类似行)。您可以检查 $Error[0].ScriptStackTrace 属性。 - JosefZ
另外,$Error [0] .InvocationInfo.ScriptLineNumber - Drew
可能是PowerShell如何获取错误行号的问题的重复。 - Moerwald
@Moerwald 这不是那个问题的重复 - 接受的答案涉及 try/catch 块方法($_.Exception 在 catch 块的上下文中被调用)。 - alex
@JosefZ 不是 - 我包含了完整的异常。 - alex
1个回答

3

Set-PsDebug 会在脚本运行时,将每个命令在控制台上打印出来。

Set-PSDebug -Trace 2; foreach ($i in 1..3) {$i}
DEBUG:    1+ Set-PsDebug -Trace 2; foreach ($i in 1..3) {$i}
DEBUG:    1+ Set-PsDebug -Trace 2; foreach ($i in 1..3) {$i}
1
DEBUG:    1+ Set-PsDebug -Trace 2; foreach ($i in 1..3) {$i}
2
DEBUG:    1+ Set-PsDebug -Trace 2; foreach ($i in 1..3) {$i}
3

谢谢Moerwald - 这正是我正在寻找的东西。为了那些会觉得官方文档令人困惑的人们 - 要使用这个,你只需要在脚本本身的上下文中添加Set-PSDebug -Trace 1即可。这将显示每行执行的代码,以及像DEBUG: 1739+这样的消息 - 非常丑陋但它确实有效。 - alex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接