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

Powershell 输出到包含西里尔文内容的文本文件,powershell,cmd,character-encoding,cyrillic,Powershell,Cmd,Character Encoding,Cyrillic,试图通过cmd获取驱动器中文件夹和文件列表的输出。 有些文件夹是用西里尔字母写的,所以我只得到???符号 我的命令: 树/f/a |夹 或 树/f/a>output.txt 结果: \---??????????? \---2017 - ????? ??????? ???? 01. ?????.mp3 02. ? ???????.mp3 03. ????.mp3 04. ?????? ? ???

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

有什么想法吗?

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的输出,这对于多达9999行来说相对容易。但这通常并不实际


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

文件名和文件夹名以16位Unicode编码在Windows NTFS中内部存储,并在控制台应用程序(如tree.com)输出时转换为8位OEM编码。未安装西里尔语支持时转换失败(通过控制面板/RegionalSettings/Russian)。@eryksun,您可以将您的评论总结为答案,因为您已经找到了答案,所以OP有机会接受…@eryksun请将其作为答案发布,以便我可以接受。我用
cmd/u/c“dir/s/b”| clip
进行了测试,效果良好。