Ben*_*est 1 powershell byte-order-mark file
在将输出流重定向到文件时,有没有办法省略字节顺序标记?例如,如果我想获取XML文件的内容并用新值替换字符串,我需要创建一个新的编码并将新输出写入如下所示的文件,这个文件非常简单:
$newContent = ( Get-Content .\settings.xml ) -replace 'expression', 'newvalue'
$UTF8NoBom = New-Object System.Text.UTF8Encoding( $false )
[System.IO.File]::WriteAllText( '.\settings.xml', $newContent, $UTF8NoBom )
Run Code Online (Sandbox Code Playgroud)
我也试过使用Out-File,但指定UTF8编码仍然包含BOM:
( Get-Content .\settings.xml ) -replace 'expression', 'newvalue' | Out-File -Encoding 'UTF8' .\settings.xml
Run Code Online (Sandbox Code Playgroud)
我想要做的只是重定向到没有BOM的文件:
( Get-Content .\settings.xml ) -replace 'expression, 'newvalue' > settings.xml
Run Code Online (Sandbox Code Playgroud)
问题是添加到输出文件的BOM通常会在从其他应用程序读取这些文件时导致问题(最值得注意的是,如果我修改XML并且它以BOM开头,大多数读取XML的应用程序都会爆炸,Chef Client也是不喜欢JSON属性文件中的BOM.如果我没有编写类似于Write-FileWithoutBom接受管道输入和输出路径的功能,那么在将输出重定向到文件时,我是否可以简单地"关闭"写入BOM?
解决方案不一定必须使用重定向运算符.如果有一个内置的cmdlet,我可以使用它输出到没有BOM的文件,这也是可以接受的.
在Windows PowerShell中为V5.1的,有没有内置的方式来避免创建BOM 使用UTF-8编码(短直接调用.NET框架,你表现出的).
在v5.1 +中,您可以更改>/ 的默认编码,>>如下所示,但如果您选择utf8,您仍会获得BOM:
$PSDefaultParameterValues['Out-File:Encoding'] = 'utf8'考虑Out-FileUtf8NoBom从我的这个答案中使用第三方功能.
不幸的是,Windows PowerShell不太可能支持创建无BOM的UTF-8文件[1] ,但希望是PowerShell Core,它不仅支持这一点,而且默认将无BOM文件解释为UTF-8 (见下文),最终将成为Windows上可行的替代方案.
相比之下,PowerShell Core 默认使用无BOM的 UTF-8(均为Out-File/ >和Set-Content),并通过-Encoding说明符utf8和方式为您提供BOM或无BOM的选择utf8BOM.
[1]来自微软博客文章的重点补充说:" Windows PowerShell 5.1与.NET Framework 4.x非常相似,将继续成为Windows 10和Windows Server 2016的内置支持组件.但是,它很可能没有收到主要的功能更新或低优先级的错误修复. "并且,在评论中," PowerShell Core 6.0和所有兼容性垫片的目标是在PowerShell Core上融合生态系统时取代Windows PowerShell 6.0.所以没有,我们目前没有任何计划来执行Windows PowerShell 6.0. "
| 归档时间: |
|
| 查看次数: |
129 次 |
| 最近记录: |