如何为powershell tee命令指定文件格式?

问题描述

我使用cmd.exe在Windows 10笔记本电脑上运行powershell ".\t.bat 2>&1 | tee results.txt",根据记事本++,生成文件results.txt以“ UCS-2 LE BOM”格式输出。我的VBScript和其他人阅读困难。

是的,我可以使用“编码->用ASCII编码”之类的方法,但这是手动干预,我想使过程自动化。

是否有一些PowerShell选项可以让我说出tee输出文件应该是什么格式? 还是某些PowerShell / DOS命令会为我“修复” /更改文件格式?

谢谢。

解决方法

改为使用文件外文件。

直接从文档复制粘贴 https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/tee-object?view=powershell-7

注释

您还可以使用Out-File cmdlet或重定向运算符,两者 其中的输出保存在文件中,但不向下发送 管道。

从PowerShell 6开始,Tee-Object使用无BOM的UTF-8编码 当它写入文件时。如果您需要其他编码,请使用 带有Encoding参数的文件外cmdlet。

,

不幸的是,截至Tee-Object cmdlet(Windows上的内置别名为tee [1] )自-Encoding起没有参数PowerShell 7.1-与其他写入文件的cmdlet不同。

GitHub suggestion #11104建议添加一个。

Tee-Object Windows PowerShell 中的默认编码为“ Unicode”(UTF-16LE)(严格来说,它与UCS相同, -2 LE [2] ),而在 PowerShell [Core] v6 + 中,所有cmdlet使用相同的编码,因此它是无BOM的UTF-8。

该文件尚未正式记录,但是您可以通过为Tee-Object分配编码来间接控制控制$PSDefaultParameterValues['Out-File:Encoding']的输出编码,但是请注意,这样做也会更改Out-File> / >>的默认字符编码。

以下命令使Tee-Object使用带有BOM的UTF-8编码:

powershell -c "$PSDefaultParameterValues['Out-File:Encoding'] = 'utf8'; .\t.bat 2>&1 | tee results.txt"

在两个PowerShell版本中,可以传递给Out-File -Encoding的任何值都可以分配给$PSDefaultParameterValues['Out-File:Encoding'],在 Windows PowerShell 中,该值仅限于预定义的枚举值,而在 PowerShell [Core] v6 + (其可执行文件是pwsh而不是powershell.exe),您还可以传递任何从类型System.Text.Encoding派生的实例。


[1]在类似Unix的平台上未定义 这个别名,以免在本地隐藏tee实用程序。

[2] UCS-2是过时的固定宽度编码,其中每个字符正好占据2个字节。 UTF-16是该编码的_variable_width 超级集,它还能够通过称为代理对。