outfile 中特定字符的问题

Issues with specific characters in outfile

我有一个脚本可以合并文件并且运行良好 - 但像 åäö 这样的字符在输出文件中看起来不太好

这是完整的脚本:

$startOfToday = (Get-Date).Date
Get-ChildItem "C:\TEST -include *.* -Recurse |
Where-Object LastWriteTime -gt $startOfToday | ForEach-Object {gc $_; ""} | 
Out-File "C:$(Get-Date -Format 'yyyy/mm/dd').txt"

例如在文件中看起来像这样

Order ID 1

Order ID 2

This is för får

在输出中,最后一行是这样的

Order ID 1

Order ID 2

får för fär

有没有办法让这些字符出现在输出文件中,就像它们出现在第一个文件中一样?

这意味着您的输入文件是 UTF-8 编码的没有 BOM,这在 Windows PowerShell 中 被(错误)解释为 ANSI 编码(使用系统的活动 ANSI 代码页,例如 Windows-1252)。

解决方案是通过-Encoding参数明确告诉gcGet-Content)使用什么编码:

Get-ChildItem C:\TEST -include *.* -Recurse |
  Where-Object LastWriteTime -gt $startOfToday | 
    ForEach-Object { Get-Content -Encoding Utf8 $_; ""} | 
      Out-File "C:$(Get-Date -Format 'yyyy/mm/dd').txt"

请注意,PowerShell 永远不会自动保留输入编码,因此,在没有使用 -EncodingOut-File 的情况下,将使用其默认编码,即“Unicode”(UTF-16LE)在 Windows PowerShell.

虽然 PowerShell (Core) 7+ 也不保留输入编码,但它 始终默认为 BOM -less UTF-8,因此您的原始代码将按原样工作。

有关 Windows PowerShell 与 PowerShell (Core) 7+ 中默认编码的详细信息,请参阅


注意:由于 AdminOfThings suggests in a comment, simply replacing Out-File with Set-Content 在您的原始代码中也适用 在这种特殊情况下 ,因为 相同的误解 然后对输入和输出执行编码,数据只是通过。这不是 通用 解决方案,但是,如果您需要先处理内存中的字符串,然后再将它们保存到文件中,则尤其如此。