上周末,我使用Tee-Object生成了我正在跟踪的日志文件的一些输出,我尝试清理输出文件,但无法返回任何结果。但原始的日志文件我是能够grep的。
似乎Tee-Object已经更改了文件的编码。
https://adamtheautomator.com/tee-object-powershell/
有没有一种设置我可以更改为只吐出它一开始读入的相同编码,并保持行尾相同?
上周末,我使用Tee-Object生成了我正在跟踪的日志文件的一些输出,我尝试清理输出文件,但无法返回任何结果。但原始的日志文件我是能够grep的。
似乎Tee-Object已经更改了文件的编码。
https://adamtheautomator.com/tee-object-powershell/
有没有一种设置我可以更改为只吐出它一开始读入的相同编码,并保持行尾相同?
4条答案
按热度按时间t3irkdon1#
简短的回答是否定的,没有
-Encoding
参数。摘自PowerShell TEE-Object文档:
TEE-Object在写入文件时使用Unicode编码。因此,可能无法在使用不同编码的文件中正确格式化输出。若要指定编码,请使用Out-File cmdlet。
cotxawn72#
作为一种解决办法,可以将变量转换为一个变量,然后使用set-content将其保存到一个文件中。默认编码为“ansi”。
这里有一个例子,如果你想要像out-file这样的东西通常提供的额外格式。我是猜的,因为原来的问题没有例子:
实际上,它看起来像是tee-Object正在调用out-file,所以这将把tee-Object的编码设置为ascii:
yc0p9oo03#
Tee-Object
在输出到文件时不支持显式指定输出编码,而总是在Windows PowerShell中使用“Unicode”(UTF-16LE)编码,在PowerShell(Core)中使用**(无BOM)UTF-8**。Tee-Object
添加允许指定所需输出编码的-Encoding
参数来消除此限制。$PSDefaultParameterValues
中针对Out-File
(例如,$PSDefaultParameterValues['Out-File:Encoding'] = 'utf8'
)的条目,实际上存在间接控制编码**的方式。Tee-Object
和Out-File
之间的这种耦合是一个实现细节,所以最好不要依赖它。(此外,将其范围限定为Tee-Object
的单个调用也不是一件容易的事)。Set-Content
不是用于保存捕获的对象的正确cmdlet,因为它对其输入执行简单的.ToString()
字符串注册,而Tee-Object
-类似Out-File
-应用PowerShell的丰富默认格式。因此,请考虑以下解决方法:
至于:
有没有什么设置可以更改为只输出相同的编码
不-PowerShell一般不支持这一点:它将文件内容读入内存中的.NET字符串,并在保存回文件时应用默认(或指定的)字符编码。
唯一的解决方法是手动确定输入文件的编码,然后将该编码的名称传递给具有
-Encoding
参数的写入文件cmdlet,例如Out-File
或Set-Content
。mqkwyuun4#
如前所述,
tee
命令没有encoding
选项。为了解决这个问题,我可以使用以下代码进行转换:这比我尝试使用
Out-File
所做的测试效果更好。