Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
File 是否可以使用重定向操作符将输出重定向到文件,而不在Powershell中写入字节顺序标记?_File_Powershell_Byte Order Mark - Fatal编程技术网

File 是否可以使用重定向操作符将输出重定向到文件,而不在Powershell中写入字节顺序标记?

File 是否可以使用重定向操作符将输出重定向到文件,而不在Powershell中写入字节顺序标记?,file,powershell,byte-order-mark,File,Powershell,Byte Order Mark,将输出流重定向到文件时,有没有办法省略字节顺序标记?例如,如果我想获取XML文件的内容并用新值替换字符串,我需要创建一个新的编码,并将新的输出写入一个文件,如下所示: $newContent = ( Get-Content .\settings.xml ) -replace 'expression', 'newvalue' $UTF8NoBom = New-Object System.Text.UTF8Encoding( $false ) [System.IO.File]::WriteAllTe

将输出流重定向到文件时,有没有办法省略字节顺序标记?例如,如果我想获取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的应用程序在修改XML并以BOM开始时会出现问题,Chef Client也不喜欢JSON属性文件中的BOM)。除了编写类似于
Write filewithout BOM
的函数来接受管道输入和输出路径之外,还有什么方法可以在将输出重定向到文件时简单地“关闭”编写BOM

解决方案不一定要使用重定向操作符。如果有一个内置的cmdlet,我可以使用它输出到一个没有BOM表的文件,这也是可以接受的。

  • 在从v5.1开始的Windows PowerShell中,没有内置的方法来避免使用UTF-8编码创建BOM(如您所演示的,除了直接调用.NET framework之外)

    • 在v5.1+中,您可以按如下方式更改
      /
      >
      的默认编码,但如果选择
      utf8
      ,您仍然会得到一个BOM表:

      • $PSDefaultParameterValues['Out-File:Encoding']='utf8'
    • 考虑使用我的第三方功能
      Out-FileUtf8NoBom

    • 不幸的是,Windows PowerShell不太可能支持创建无BOM的UTF-8文件[1] ,但希望是PowerShell Core最终将成为Windows上可行的替代方案。PowerShell Core不仅支持这一点,而且默认将无BOM文件解释为UTF-8(见下文)

  • 相比之下,PowerShell Core默认使用无BOM的UTF-8(用于
    /
    设置内容
    ),并通过
    -编码
    说明符
    utf8
    utf8BOM
    为您提供BOM或无BOM的选择


[1] 从a开始,emphasis补充道:“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。

  • 在从v5.1开始的Windows PowerShell中,没有内置的方法来避免使用UTF-8编码创建BOM(如您所演示的,除了直接调用.NET framework之外)

    • 在v5.1+中,您可以按如下方式更改
      /
      >
      的默认编码,但如果选择
      utf8
      ,您仍然会得到一个BOM表:

      • $PSDefaultParameterValues['Out-File:Encoding']='utf8'
    • 考虑使用我的第三方功能
      Out-FileUtf8NoBom

    • 不幸的是,Windows PowerShell不太可能支持创建无BOM的UTF-8文件[1] ,但希望是PowerShell Core最终将成为Windows上可行的替代方案。PowerShell Core不仅支持这一点,而且默认将无BOM文件解释为UTF-8(见下文)

  • 相比之下,PowerShell Core默认使用无BOM的UTF-8(用于
    /
    设置内容
    ),并通过
    -编码
    说明符
    utf8
    utf8BOM
    为您提供BOM或无BOM的选择



[1] 从a开始,emphasis补充道:“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。

这不是我想听到的答案,但我感谢您花时间解释如何覆盖默认编码。很高兴知道
Powershell Core
确实支持此功能,所以希望这意味着
Microsoft Powershell 6.0
也将支持它。@BenderSegregatest:不幸的是,听起来Windows Powershell(与Powershell Core相反)将不会获得任何新功能-请查看我的更新。抱歉,意思是说
Windows Powershell
,而不是
Microsoft
。我想我来晚了,但至少微软已经承诺他们将开发哪种风格的Powershell。这不是我想听到的答案,但我感谢你花时间解释如何覆盖默认编码。知道
Powershell Core
确实支持这一点也很好,所以希望这意味着
Microsoft Powershell 6.0
也会支持它。@BenderSegreatest:不幸的是,它听起来像Windows PowerS