【问题标题】:Powershell - Write-Output produces string with a BOM characterPowershell - Write-Output 生成带有 BOM 字符的字符串
【发布时间】:2021-03-02 19:13:30
【问题描述】:

我正在尝试在 Powershell 脚本中执行这样的命令:

Write-Output "Some Command" | some-application

当运行 PS 脚本 some-application 接收字符串 \xef\xbb\xbfSome Command。第一个字符是 UTF-8 BOM。我可以谷歌的所有解决方案仅适用于将输出重定向到文件。但我正在尝试将字符串重定向到另一个命令(通过管道)。

变量$OutputEncoding显示配置了ASCII,没有设置UTF-8。

我正在从 Azure DevOps Pipeline 运行此脚本,但仅存在此问题。

【问题讨论】:

标签: powershell


【解决方案1】:

注意:当数据传送到一个外部程序如何控制PowerShell使用的编码 /strong>(由此类程序通过 stdin 读取)。

独立于

  • PowerShell cmdlet 默认使用什么字符编码输出 - 有关详细信息,请参阅this answer

  • 在读取外部程序接收的数据时 PowerShell 使用什么字符编码 - 有关详细信息,请参阅 this answer


暗示你错误地设置了$OutputEncoding preference variable,它决定了PowerShell使用什么字符编码来发送数据外部程序,到一个带有 BOM 的 UTF-8 编码

如果您改为分配 BOM-less UTF-8 编码,您的问题就会消失:

$OutputEncoding = [System.Text.Utf8Encoding]::new($false) # BOM-less

"Some Command" | some-application

请注意,在 PowerShell [Core] v6+ 中不会出现此问题,其中 $OutputEncoding 默认 为无 BOM 的 UTF-8(在 Windows PowerShell,不幸的是,它默认为 ASCII)。


为了说明问题:

$OutputEncoding = [System.Text.Encoding]::Utf8 # *with* BOM

"Some Command" | findstr .

以上输出∩╗┐Some Command,其中∩╗┐ 是OEM 代码页437(美国-例如英语系统)。

【讨论】:

    猜你喜欢
    • 2010-10-06
    • 1970-01-01
    • 2013-01-30
    • 2018-04-14
    • 1970-01-01
    • 2021-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多