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
参数明确告诉gc
(Get-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 永远不会自动保留输入编码,因此,在没有使用 -Encoding
和 Out-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
在您的原始代码中也适用 在这种特殊情况下 ,因为 相同的误解 然后对输入和输出执行编码,数据只是通过。这不是 通用 解决方案,但是,如果您需要先处理内存中的字符串,然后再将它们保存到文件中,则尤其如此。
我有一个脚本可以合并文件并且运行良好 - 但像 åäö 这样的字符在输出文件中看起来不太好
这是完整的脚本:
$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
参数明确告诉gc
(Get-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 永远不会自动保留输入编码,因此,在没有使用 -Encoding
和 Out-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
在您的原始代码中也适用 在这种特殊情况下 ,因为 相同的误解 然后对输入和输出执行编码,数据只是通过。这不是 通用 解决方案,但是,如果您需要先处理内存中的字符串,然后再将它们保存到文件中,则尤其如此。