输出到包含西里尔文内容的文本文件

Output to text file with cyrillic content

尝试通过 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

有什么想法吗?

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 的输出,这 对于最多 9,999 行相对容易。但这通常不实用。

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