2017-05-28 79 views
1

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

我的命令:

树/ F/A |剪辑

树/ F/A> output.txt的

结果:

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

任何想法?

+0

文件和文件夹名称在内部存储在Windows NTFS中,采用16位Unicode编码,当它们由控制台应用程序(如tree.com)输出时,它们会转换为8位OEM编码。未安装Cyrilic支持时(通过ControlPanel/RegionalSettings/Russian),转换将失败。 – vitsoft

+1

@eryksun,您可以总结您的意见作为一个答案,因为你击中现场,所以OP有机会接受... – aschipfl

+0

@eryksun请张贴它作为答案,所以我可以接受它。我用'cmd/u/c“dir/s/b”|进行了测试剪辑“,它的工作。 – blfuentes

回答

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脚本以输出除目录之外的文件。