我想在 Windows 10 中自动创建目录树文件。
在 PowerShell 中,我执行了以下命令:
cd C:\TreeTest
tree /f > .\TreeStructure.txt
Run Code Online (Sandbox Code Playgroud)
输出是一个漂亮的 UTF-8 文件:
现在我想在批处理文件中做同样的事情:
@echo off
cd C:\TreeTest
tree /f > .\TreeStructure.txt
Run Code Online (Sandbox Code Playgroud)
但是批处理文件执行的输出的编码搞砸了:
为什么 PowerShell 输出的编码与批处理文件的输出不同?
我知道可以通过将 /a 添加到 tree 命令来获得 ASCII 输出,但我更喜欢将漂亮的 UTF-8 输出保存到我的树文件中。
我尝试通过将“chcp 65001”添加到我的批处理文件中来更改代码页,但它没有更改文件输出。
您错误地假设您的编辑器Notepad++将 PowerShell 中创建的文件读取为 UTF8。
有UTF16-LE/UCS-2 LE-BOM有BOM 0xFF 0xFE
在 cmd.exe 中创建的树文件在 actice 代码页中进行编码,请参阅 的输出chcp
并相应地更改编码Notepad++。
> chcp
Aktive Codepage: 850.
Run Code Online (Sandbox Code Playgroud)
更改编码(在我的德语语言环境 Notepad++ 中):
LotPing的回答是正确的。只是为了详细描述:
\n重定向运算符>(将指定的流发送到文件):
\n\n当您写入文件时,重定向运算符使用
\nUnicode\n编码。如果文件具有不同的编码,\n输出的格式可能不正确。要将内容重定向到非 Unicode 文件,请使用\ncmdletOut-File及其Encoding参数。11复制粘贴,因为在线文档
\nGet-Help about_Redirection -ShowWindow中有错误
\n\n当您写入文件时,重定向运算符使用\n
\nUTF8NoBOM编码。
cmd.exe)中:cmd.exe(默认):内部命令到管道或文件的输出是OEM,cmd.exe /A:导致内部命令输出到管道或文件ANSI,并且cmd.exe /U:导致内部命令到管道或文件的输出为Unicode,即UCS-2 LE(否BOM):\n\nShell
\nCMD可以重定向OEM//ANSIUnicode\n(UCS-2 le) 但不能UTF-8。可以通过启动\n或或
来选择此选项。CMDCMD /ACMD /U
但是,相当老式的实用程序的输出tree.com尚未准备好转换为 Unicode。因此,straightstart "" cmd /U /C "tree>tree_U.txt"仍然会产生(mojibake)乱码(OEM编码文件解释为ANSI)。以下cmd命令应该可以解决问题:
tree>"%temp%\\auxTree.txt"\nstart "" cmd /U /C "type "%temp%\\auxTree.txt">tree_Unicode.txt"\ndel "%temp%\\auxTree.txt"\nRun Code Online (Sandbox Code Playgroud)\n顺便说一句,这里是那些漂亮的字符和他们的代码(乱码ANSI):
Char Unicode OEM ANSI UTF-8 Character_description\n \xe2\x94\x80 U+2500 196 n/a 0xE29480 Box Drawings Light Horizontal\n \xe2\x94\x82 U+2502 179 n/a 0xE29482 Box Drawings Light Vertical\n \xe2\x94\x94 U+2514 192 n/a 0xE29494 Box Drawings Light Up And Right\n \xe2\x94\x9c U+251C 195 n/a 0xE2949C Box Drawings Light Vertical And Right\nRun Code Online (Sandbox Code Playgroud)\n以及mojibake大小写机制(Python 中的示例,以实现其常见的可理解性):
\n\' \xe2\x94\x80 \xe2\x94\x82 \xe2\x94\x94 \xe2\x94\x9c \'.encode(\'cp437\').decode(\'cp1252\')\nRun Code Online (Sandbox Code Playgroud)\n\n\nRun Code Online (Sandbox Code Playgroud)\n\' \xc3\x84 \xc2\xb3 \xc3\x80 \xc3\x83 \'\n