为什么PowerShell的Tee-Object搞乱了我的文件的编码?

dtcbnfnu  于 2022-11-10  发布在  Shell
关注(0)|答案(4)|浏览(132)

上周末,我使用Tee-Object生成了我正在跟踪的日志文件的一些输出,我尝试清理输出文件,但无法返回任何结果。但原始的日志文件我是能够grep的。
似乎Tee-Object已经更改了文件的编码。
https://adamtheautomator.com/tee-object-powershell/
有没有一种设置我可以更改为只吐出它一开始读入的相同编码,并保持行尾相同?

t3irkdon

t3irkdon1#

简短的回答是否定的,没有-Encoding参数。
摘自PowerShell TEE-Object文档:
TEE-Object在写入文件时使用Unicode编码。因此,可能无法在使用不同编码的文件中正确格式化输出。若要指定编码,请使用Out-File cmdlet。

cotxawn7

cotxawn72#

作为一种解决办法,可以将变量转换为一个变量,然后使用set-content将其保存到一个文件中。默认编码为“ansi”。

echo hi | tee -Variable a
set-content file $a

这里有一个例子,如果你想要像out-file这样的东西通常提供的额外格式。我是猜的,因为原来的问题没有例子:

ps cmd | tee -var a
$a | out-string | set-content file

实际上,它看起来像是tee-Object正在调用out-file,所以这将把tee-Object的编码设置为ascii:

$PSDefaultParameterValues = @{'Out-File:Encoding' = 'Ascii'}
yc0p9oo0

yc0p9oo03#

  • HAL's helpful answer显示,在Windows PowerShell和PowerShell(Core)7.2.x中,Tee-Object在输出到文件时不支持显式指定输出编码,而总是在Windows PowerShell中使用“Unicode”(UTF-16LE)编码,在PowerShell(Core)中使用**(无BOM)UTF-8**。
  • GitHub issue #11104建议通过向Tee-Object添加允许指定所需输出编码的-Encoding参数来消除此限制。
  • js2010's answer表明,通过默认参数值表$PSDefaultParameterValues中针对Out-File(例如,$PSDefaultParameterValues['Out-File:Encoding'] = 'utf8')的条目,实际上存在间接控制编码**的方式。
  • 然而,Tee-ObjectOut-File之间的这种耦合是一个实现细节,所以最好不要依赖它。(此外,将其范围限定为Tee-Object单个调用也不是一件容易的事)。
  • js2010的答案也是正确的,通过首先连接到*变量**,但Set-Content不是用于保存捕获的对象的正确cmdlet,因为它对其输入执行简单的.ToString()字符串注册,而Tee-Object-类似Out-File-应用PowerShell的丰富默认格式。

因此,请考虑以下解决方法


# Tee to a *variable* first ($out)...

$PSVersionTable | Tee-Object -Variable out # | ...

# ... then use Out-File -Encoding to save to a file with the desired encoding

# ; e.g., with UTF-8

Out-File -InputObject $out out.txt -Encoding utf8

至于:
有没有什么设置可以更改为只输出相同的编码
不-PowerShell一般不支持这一点:它将文件内容读入内存中的.NET字符串,并在保存回文件时应用默认(或指定的)字符编码。
唯一的解决方法是手动确定输入文件的编码,然后将该编码的名称传递给具有-Encoding参数的写入文件cmdlet,例如Out-FileSet-Content

mqkwyuun

mqkwyuun4#

如前所述,tee命令没有encoding选项。为了解决这个问题,我可以使用以下代码进行转换:

<powershell command> | tee -Variable content
$content | Set-Content -Encoding uft8 test_output.txt

这比我尝试使用Out-File所做的测试效果更好。

相关问题