输出到带有西里尔文内容的文本文件

时间:2017-05-28 07:39:27

标签: powershell cmd character-encoding cyrillic

尝试通过cmd获取输出,其中包含驱动器中的文件夹和文件列表。 有些文件夹是用西里尔字母写的,所以我只能得到???符号。

我的命令:

  

tree / f / a | clip

  

tree / f / a> output.txt

结果:

\---???????????
    \---2017 - ????? ??????? ????
            01. ?????.mp3
            02. ? ???????.mp3
            03. ????.mp3
            04. ?????? ? ???.mp3
            05. ?????.mp3
            06. ???? ?????.mp3
            07. ???????? ????.mp3
            08. ??? ?? ?????.mp3
            Cover.jpg

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

tree.com在写入控制台时使用本机UTF-16编码,就像cmd.exe和powershell.exe一样。因此,首先您希望将输出重定向到文件或管道以使用Unicode。但是,与大多数命令行实用程序一样,tree.com使用旧代码页将输出编码为管道或磁盘文件。 (说到遗产,文件名中的" .com"是历史性的。在64位Windows中,它是常规的64位可执行文件,而不是16位DOS代码。)

当写入管道或磁盘文件时,某些程序硬编码系统ANSI代码页(例如西欧的1252)或OEM代码页(例如西欧的850),而有些则使用控制台的当前输出代码页(如果连接到控制台),默认为OEM。后者会很棒,因为您可以通过chcp.com 65001将控制台的输出代码页更改为UTF-8。不幸的是,tree.com使用OEM代码页,没有选择使用其他任何东西。

另一方面,

cmd.exe至少提供/u选项以将其内置命令输出为UTF-16。因此,如果您不需要树格式输出,则可以使用cmd' dir命令。例如:

cmd /u /c "dir /s /b" | clip

如果确实需要树格式输出,一种解决方法是直接从控制台屏幕缓冲区读取tree.com的输出,can be done相对容易地读取最多9,999行。但这通常不实用。

否则PowerShell可能是您的最佳选择。例如,您可以修改Show-Tree脚本以输出除目录之外的文件。