我正在尝试将输出保存到文件:
SFC | Out-File -FilePath out.txt
现在,如果我out.txt
在 Notebook 中打开,我希望看到
You must be an administrator running a console session in order to
use the sfc utility.
以下是我实际看到的情况:
Y o u m u s t b e a n a d m i n i s t r a t o r r u n n i n g a c o n s o l e s e s s i o n i n o r d e r t o
u s e t h e s f c u t i l i t y .
基于这个答案,我补充道-Encoding UTF8
:
SFC | Out-File -FilePath out.txt -Encoding UTF8
但这并没有什么区别。
我的 PowerShell 版本:7.2.2
。
答案1
PowerShell 7 的默认输出编码已经是 UTF-8。问题不在于 PowerShell 将文本编码到文件中,而在于解码本机程序打印的文本sfc
。您可以通过查看写入文件之前的字符序列来证明这一点:
sfc | % { $_.ToCharArray() }
注意每对实字符之间的空格 - 这些是零/空字符,通过进一步的管道传输可以看到% { [int]$_ }
。SFC 显然是在 Windows 双字节 Unicode 编码中打印其输出,但 PowerShell 正在使用 UTF-8 或某些单字节编码来解释它,因此它会看到一个额外的空字符,而 SFC 表示前一个字符的高字节。Out-File
然后忠实地将这些空字符编码为 UTF-8 中的单个零字节。
解决方案是告诉 PowerShell,本机程序将以双字节 Unicode 编写其输出:
[System.Console]::OutputEncoding = [System.Text.Encoding]::Unicode