【问题标题】:How to display line numbers where Powershell exceptions are raised如何显示引发 Powershell 异常的行号
【发布时间】:2019-06-14 21:43:56
【问题描述】:

我的 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 中?我是否必须使用一些 --verbose 标志调用脚本? Powershell 3.0 是否支持类似的东西?

【问题讨论】:

  • 能否添加导致错误的脚本?
  • 应该有At D:\PShell\SO\56588150.ps1:21 char:1 行(或类似行)。您可以查看$Error[0].ScriptStackTrace的属性。
  • 或者,$Error[0].InvocationInfo.ScriptLineNumber
  • @Moerwald 这不是那个问题的重复 - 接受的答案涉及 try/catch 块方法($_.Exception 在 catch 块的上下文中被调用)。

标签: powershell powershell-3.0


【解决方案1】:

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 - 这正是我正在寻找的东西。为了那些会发现 the official docs 令人困惑 - 要使用它,您只需在脚本本身的上下文中的某处抛出 Set-PSDebug -Trace 1。这将显示执行的每一行,以及像 DEBUG: 1739+ 这样的消息 - 非常丑陋但它有效。
猜你喜欢
  • 1970-01-01
  • 2011-03-20
  • 2011-04-17
  • 1970-01-01
  • 1970-01-01
  • 2010-12-26
  • 2019-03-29
相关资源
最近更新 更多