gpt4 book ai didi

powershell - CMD 管道与 Powershell 管道不同?

转载 作者:行者123 更新时间:2023-12-04 11:23:04 25 4
gpt4 key购买 nike

我正在尝试将 Node.js 输出通过管道传输到 preatty-pinonode .\dist\GameNode.js | pino-pretty在 CMD 中运行它我得到了我的格式化输出但是在 powershell 中运行它我什么也得不到。
我读到 Powershell 在管道时正在使用对象,所以我试过了node .\dist\GameNode.js | Out-String -Stream | pino-pretty但这也行不通。
为什么它可以在 CMD 中工作,而不能在 Powershell 中工作?
谢谢 :)

最佳答案

注:具体pino-pretty下面的信息无法解决问题中描述的问题。 Lukas(OP)已提交错误报告 here .
令人惊讶的是,您什么也没得到,但 根本区别是:

  • cmd.exe的管道进行原始数据 ,即字节流(接收数据的给定程序本身可能会或可能不会解释为文本)。
  • PowerShell 的管道,在与外部程序通信时,只传输文本 (字符串),这有两个含义:
  • 在管道数据到外部程序时,必须对文本进行编码 ,这是基于存储在 中的字符编码发生的preference variable $OutputEncoding .
  • 从外部程序接收数据时,必须对数据进行解码 ,这是基于存储在 中的字符编码发生的[Console]::OutputEncoding ,默认情况下是系统的 OEM 代码页,反射(reflect)在 chcp .
  • 解码总是发生,无论数据是在 PowerShell 中进一步处理还是传递给另一个外部程序 .
  • 这有时会出现问题 即使在两个外部程序之间也无法通过 PowerShell 的管道发送原始数据 this answer 中讨论.

  • 唯一的异常(exception)是如果外部程序输出既没有被捕获,也没有通过管道发送,也没有重定向到文件:在这种情况下,数据直接打印到控制台(终端),但只在本地控制台中(使用 PowerShell 时)远程与远程机器交互,解码总是再次涉及)。
  • 这种直接显示的打印有时会隐藏编码问题,因为某些程序,特别是 python ,在这种情况下使用完整的 Unicode 支持;也就是说,输出可能打印得很好,但是当您尝试进一步处理它时,可能会出现编码问题。
  • A 强制解码的简单方法 是到 将电话附在 (...) ;例如。,python -c "print('eé')"打印正常,但是(python -c "print('eé'))"出现编码问题;更多信息请参见底部




  • 虽然 控制台应用程序传统上使用事件的 OEM 代码页 用于字符编码和解码, Node.js 总是使用 UTF-8 .
    因此,为了让 PowerShell 与 Node.js 程序正常通信,您必须(暂时)首先设置以下内容:
    $OutputEncoding = [Console]::OutputEncoding = [System.Text.UTF8Encoding]::new()
    如果您想 从根本上切换到 UTF-8 ,系统范围内(具有深远影响)或仅适用于 PowerShell 控制台窗口,请参阅 this answer .

    顺便说一句:中间 Out-String -Stream中继外部程序的输出永远不需要管道段 - 它是有效的(昂贵的)无操作,因为逐行流式传输 stdout 输出是 PowerShell 默认情况下所做的。换句话说:它对您的情况没有影响也就不足为奇了。

    选读:便捷功能 Invoke-WithEncoding和诊断功能 Debug-NativeInOutput用于临时编码需求/诊断:
    如果无法将所有 PowerShell 控制台切换到 UTF-8 和/或您需要处理使用 UTF-8 或事件 OEM 代码页以外的特定编码的“流氓”程序,您可以安装:
  • 功能 Invoke-WithEncoding , 其中 调用外部程序时临时切换到给定的编码 ,直接来自 this Gist如下(我可以向你保证这样做是安全的,但你应该经常检查):

  • # Download and define advanced function Invoke-WithEncoding in the current session.
    irm https://gist.github.com/mklement0/ef57aea441ea8bd43387a7d7edfc6c19/raw/Invoke-WithEncoding.ps1 | iex
  • 功能 Debug-NativeInOutput , 其中 帮助诊断外部程序的编码问题 ,直接来自 this Gist如下(同样,你应该先检查):

  • # Download and define advanced function Debug-NativeInOutput in the current session.
    irm https://gist.github.com/mklement0/eac1f18fbe0fc2798b214229b747e5dd/raw/Debug-NativeInOutput.ps1 | iex

    以下是 示例命令 使用 python命令打印一个重音字符。
    与 Node.js 一样,Python 的行为是非标准的,虽然它不使用 UTF-8,但是系统的事件 ANSI(!) 代码页(而不是预期的 OEM 代码页)。
    也就是说,即使您将 PowerShell 控制台切换为 UTF-8,默认情况下与 Python 脚本的通信也无法正常工作,除非做出额外的努力,这 Invoke-WithEncoding可以为您封装:
    注意:我在这里使用 Python 作为示例,以说明函数的工作原理。可以让 Python 使用 UTF-8,即通过设置环境变量 PYTHONUTF81或 - 在 v3.7+ 中 - 通过传递参数 -X utf8 (准确的情况)。

    Invoke-WithEncoding例如:
    # Outputs *already-decoded* output, so if the output *prints* fine, 
    # then *decoding* worked fine too.
    PS> Invoke-WithEncoding { python -c "print('eé')" } -Encoding Ansi -WindowsOnly

  • 请注意 Invoke-WithEncoding确保对 .NET 字符串的实际解码发生在它输出之前,因此编码问题不会被 Windows 上看似正确的直接显示输出意外掩盖(更多信息见下文)。
  • -WindowsOnly用于跨平台兼容性并确保在这种情况下编码仅适用于 Windows(在 Unix 上,Python 使用 UTF-8)。

  • Debug-NativeInOutput例如:
    使用默认的 PowerShell 控制台,使用系统的 OEM 代码页,您将看到使用相同 Python 命令的以下输出,从 PowerShell (Core) 7.1 调用:
    PS> Debug-NativeInOutput { python -c "print('eé')" }
    Debug-NativeInOutput
  • 请注意 DecodedOutput属性(property) ,显示 错误解码的结果 基于将 Python 的输出解释为 OEM- 而不是 ANSI 编码:'eΘ' . (Input* 属性为空,因为该命令不涉及将数据传送到 Python 脚本。)
  • 相比之下,通过直接显示打印,输出打印得很好(因为 Python 那时 - 并且只有那时 - 使用 Unicode),这隐藏了问题,但是一旦您想以编程方式处理输出 - 在变量中捕获,发送到管道中的另一个命令,重定向到文件 - 编码问题将浮出水面。
  • Invoke-WithEncoding , Debug-NativeInOutput支持 -Encoding参数,所以如果你通过 -Encoding Ansi对于上面的调用,您将看到 Python 的输出已正确解码。
  • 输出反射(reflect)了这样一个事实,即在 PowerShell(核心)中,$OutputEncoding默认为 UTF-8,而在 Windows PowerShell 中,它默认为 ASCII(!)。这种与实际编码的不匹配是有问题的,this comment on GitHub issue #提出了一种将来解决此问题的方法(仅适用于 PowerShell(核心))。
  • 关于powershell - CMD 管道与 Powershell 管道不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66904779/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com