我想在 Windows 10 中自动创建目录树文件。
在 PowerShell 中,我执行了以下命令:
cd C:\TreeTest
tree /f > .\TreeStructure.txt
输出是一个漂亮的 UTF-8 文件:
现在我想在批处理文件中做同样的事情:
@echo off
cd C:\TreeTest
tree /f > .\TreeStructure.txt
但是批处理文件执行的输出编码搞错了:
为什么 PowerShell 输出的编码与批处理文件的输出不同?
我知道我可以通过在 tree 命令中添加 /a 来获得 ASCII 输出,但我更希望将漂亮的 UTF-8 输出保存到我的 tree 文件中。
我尝试通过在批处理文件中添加“chcp 65001”来更改代码页,但它并没有改变文件输出。
答案1
LotPing 的回答是正确的。仅供详细说明:
重定向>
运算符 (将指定流发送到文件):
- 在Windows PowerShell,输出文件的默认编码是UCS-2 LE 物料清单:
当你写入文件时,重定向操作符使用
Unicode
编码。如果文件具有不同的编码,则输出格式可能不正确。要将内容重定向到非 Unicode 文件,请使用Out-File
带有其Encoding
参数的cmdlet。11复制并粘贴,
Get-Help about_Redirection -ShowWindow
因为原文有错误在线文档
- 在PowerShell 核心: 开始于PowerShell 6,默认编码改为无 BOM 的 UTF-8写入文件时:
当您写入文件时,重定向运算符使用
UTF8NoBOM
编码。
- 在Windows 命令提示符 (
cmd.exe
): cmd.exe
(默认):内部命令到管道或文件的输出是OEM
,cmd.exe /A
:导致内部命令到管道或文件的输出ANSI
, 和cmd.exe /U
:导致内部命令到管道或文件的输出统一码即UCS-2 LE
(否BOM
):
Shell
CMD
可以重定向OEM
/ANSI
/Unicode (UCS-2 le
) 但不能UTF-8
。
可以通过启动CMD
或CMD /A
或来选择CMD /U
。
然而,输出相当老式实用程序tree.com
尚未准备好转换为 Unicode。因此,直接start "" cmd /U /C "tree>tree_U.txt"
仍然产生 (莫吉巴克) 乱码(OEM
编码文件解释为ANSI
)。以下cmd
命令应该可以解决问题:
tree>"%temp%\auxTree.txt"
start "" cmd /U /C "type "%temp%\auxTree.txt">tree_Unicode.txt"
del "%temp%\auxTree.txt"
顺便说一下,这些是漂亮的字符及其代码(乱码ANSI
):
Char Unicode OEM ANSI UTF-8 Character_description
─ U+2500 196 n/a 0xE29480 Box Drawings Light Horizontal
│ U+2502 179 n/a 0xE29482 Box Drawings Light Vertical
└ U+2514 192 n/a 0xE29494 Box Drawings Light Up And Right
├ U+251C 195 n/a 0xE2949C Box Drawings Light Vertical And Right
还有莫吉巴克大小写机制(以 Python 为例,以方便理解):
' ─ │ └ ├ '.encode('cp437').decode('cp1252')
' Ä ³ À Ã '
答案2
您错误地认为您的编辑器Notepad++
将 PowerShell 中创建的文件读取为 UTF8。
它是UTF16-LE
/UCS-2 LE-BOM
带有物料清单 0xFF 0xFE
在 cmd.exe 中创建的树文件在活动代码页中编码,请查看输出chcp
并相应地更改编码Notepad++
。
> chcp
Aktive Codepage: 850.
更改编码(在我的德语区域设置 Notepad++ 中):