file - 是否可以使用重定向运算符将输出重定向到文件,而无需在Powershell中写入字节顺序标记?

标签 file powershell byte-order-mark

将输出流重定向到文件时,有什么方法可以省略字节顺序标记吗?例如,如果我要获取XML文件的内容并用新值替换字符串,则需要创建新的编码并将新的输出写入类似以下内容的文件:

$newContent = ( Get-Content .\settings.xml ) -replace 'expression', 'newvalue'
$UTF8NoBom = New-Object System.Text.UTF8Encoding( $false )
[System.IO.File]::WriteAllText( '.\settings.xml', $newContent, $UTF8NoBom )

我也尝试使用Out-File,但是将UTF8指定为编码仍然包含BOM:
( Get-Content .\settings.xml ) -replace 'expression', 'newvalue' | Out-File -Encoding 'UTF8' .\settings.xml

我想要做的就是简单地重定向到没有BOM的文件:
( Get-Content .\settings.xml ) -replace 'expression, 'newvalue' > settings.xml

问题是,从其他应用程序读取这些文件时,添加到输出文件的BOM通常会引起问题(最明显的是,如果我修改XML并且以BOM开头的话,大多数读取XML的应用程序都会爆炸,Chef Client也不喜欢JSON属性文件中的BOM)。我缺少编写像Write-FileWithoutBom这样的功能来接受管道输入和输出路径的方法,在将输出重定向到文件时,有什么方法可以简单地“关闭”编写BOM的方法吗?

解决方案不一定必须使用重定向运算符。如果有内置的cmdlet,我可以使用它输出到没有BOM的文件,那也是可以接受的。

最佳答案

  • 在v5.1 版本的 Windows PowerShell中,没有 NO内置方法,可以避免创建使用UTF-8编码的BOM(如所示,直接调用.NET框架)。
  • 在v5.1 +中,您可以按以下方式更改> / >>的默认编码,但是如果选择utf8,您仍然会得到BOM:
  • $PSDefaultParameterValues['Out-File:Encoding'] = 'utf8'
  • 考虑使用我的this answer中的第三方函数Out-FileUtf8NoBom
  • 不幸的是,Windows PowerShell不太可能会支持创建无BOM的UTF-8文件[1]
    ,但希望PowerShell Core最终将成为Windows上可行的替代方案,它不仅支持该功能,而且默认将无BOM的文件解释为UTF-8(请参见下文)。
  • 相比之下,PowerShell Core默认情况下使用无BOM的UTF-8缺省(两者均用于Out-File / >Set-Content),并通过-Encoding标识符utf8utf8BOM为您提供BOM或无BOM的选择。


  • [1]在Microsoft blog post中重点强调:“ Windows PowerShell 5.1 与.NET Framework 4.x一样,将继续是Windows 10和Windows Server 2016的内置受支持组件。但是,将可能不会收到主要功能更新或较低优先级的错误修复。“”,并在注释中,“使用PowerShell Core 6.0
    和所有兼容性垫片的目标是取代了Windows PowerShell 6.0的需求,同时在PowerShell Core 。所以,不,我们目前没有任何计划来制作Windows PowerShell 6.0。

    关于file - 是否可以使用重定向运算符将输出重定向到文件,而无需在Powershell中写入字节顺序标记?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51847114/

    相关文章:

    java - 如何检查我是否可以删除文件?

    powershell - Powershell 中的自动转义动态字符串

    powershell - ConvertTo-JSON 具有单个项目的数组

    Powershell Out-File 无法按预期使用反向字符串

    visual-studio-2010 - 无 BOM 的 UTF-8

    java - Java 是否有获取各种字节顺序标记的方法?

    javascript - 在 WebExtensions(JavaScript、Firefox)中读取 LZ4 压缩文本文件 (mozlz4)

    file - 多个文件中的单个 fortran 模块

    c - 帮助解决在命令行中使用 '<' 重定向运算符读取文本文件时出现的一个小问题? C

    java - 如何在不使用 BOM 且以非 ASCII 字符开头的情况下识别文件的不同编码?