【问题标题】:Powershell error message in console is being wrongly indented控制台中的 Powershell 错误消息被错误地缩进
【发布时间】:2022-01-07 20:13:05
【问题描述】:

我想要做的是运行 wsl 进程,让它的 stdout 和 stderr 通道打印到控制台,就好像它们正常执行一样,如果 stderr 和打印输出为 1:1,则在 powershell 中抛出错误原创。

但是我收到了这个缩进错误:

当运行wsl.exe echo a 1`>`&2`;echo b 2>&1 两次时 Powershell 的控制台缩进过多。
有时甚至会变得非常糟糕,以至于尽管没有缩进,但 Write-Host 输出仍被缩进。
wsl.exe echo a 1`>`&2`;echo b 2>&1

cmd.exe /c echo a 1`>`&2`&echo b 2>&1 有时这也会在运行上面的很多 wsl 命令后发生 此外,当它像这样卡住时,它会感染其他 Write-Error 调用:

$PSVersionTable
名称 |价值
--|-----
PS版本|5.1.22000.282
PSEdition|桌面版
PSCompatibleVersions|{1.0, 2.0, 3.0, 4.0...}
构建版本|10.0.22000.282
CLRVersion|4.0.30319.42000
WSManStackVersion|3.0
PSRemotingProtocolVersion|2.3
序列化版本| 1.1.0.1
编辑:

【问题讨论】:

  • 这看起来像是行尾问题; powershell 仍然停留在 linux 模式下 \n 而不是 dos 模式 \r\n
  • 看起来你有一个标签视图;您使用的是标准的 Windows 控制台,还是类似 Windows 终端的东西?如果不是,您是否在控制台中得到相同的行为?
  • 即便如此,它可能也无济于事,因为您仍然在最后一个屏幕中遇到问题,只有 write-error
  • newline 并不是我想要的样子,它看起来只影响文本编写者用来结束一行的内容,而不影响从 "`n" 到 '\r\n' 的翻译。跨度>
  • 但是您最好的选择可能是将其作为错误发布到控制台中

标签: powershell stdout windows-subsystem-for-linux indentation stderr


【解决方案1】:

虽然我对这种行为没有解释,但我有一个解决方法:

将整个命令括在(...) 中(我还重写了命令以使其功能更明显,但它在功能上是等效的):

# !! The (...) makes the symptom go away.
(wsl.exe bash -c 'echo a 1>&2; echo b' 2>&1)

注意:

  • 使用(...),grouping operator 意味着来自wsl.exe 调用的所有输出行在输出到​​PowerShell 管道之前预先收集。也就是说,您放弃了 PowerShell 的 流式传输 行为,即在接收输出行时中继输出行。也就是说,这在实践中不会成为问题,除非手头的调用发出如此多的行,以至于将它们全部收集到内存中会耗尽内存,或者收集它们的行为会导致不可接受的延迟,如果(它们自己流式传输)下游命令(例如 Tee-Object)预计会及时产生显示输出。

您看到的症状与格式化系统如何呈现包含 stderr 行的 System.Management.Automation.ErrorRecord 实例有关,但 问题是如何发生的以及为什么它只开始出现 从第二次调用开始我不清楚。


两旁:

  • stderr 行 (2) 重定向 (>) 到 成功 错误流 (&1) 呈现为错误 从根本上是有问题的。 p>

    • 在 PowerShell (Core) 7+ 中,这种情况不再发生(即使 stderr 行仍然包裹在 [ErrorRecord] 实例中)。

    • 要在 Windows PowerShell 中模拟此行为,请在每个输出对象上调用 .ToString():

      wsl.exe bash -c 'echo a 1>&2; echo b' 2>&1 | ForEach-Object ToString
      
  • 使用2>&1 时PowerShell 合并stdout 和stderr 的方式不保证原始输出顺序;也就是说,上述命令可以在b 之前输出a,反之亦然——出乎意料;见GitHub issue #5424。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-20
    • 2015-08-29
    • 1970-01-01
    • 2020-10-21
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多