【问题标题】:Output to text file with cyrillic content输出到带有西里尔文内容的文本文件
【发布时间】:2017-05-28 07:39:26
【问题描述】:

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

我的命令:

树 /f /a |剪辑

tree /f /a >output.txt

结果:

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

有什么想法吗?

【问题讨论】:

  • 文件和文件夹名称以 16 位 Unicode 编码内部存储在 Windows NTFS 中,并在由控制台应用程序(例如 tree.com)输出时转换为 8 位 OEM 编码。未安装 Cyrilic 支持时转换失败(通过 ControlPanel/RegionalSettings/Russian)。
  • @eryksun,您可以将您的 cmets 总结为答案,因为您找到了答案,因此 OP 有机会接受...
  • @eryksun 请将其发布为答案,以便我接受。我用cmd /u /c "dir /s /b" | clip 进行了测试,它成功了。

标签: powershell cmd character-encoding cyrillic


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-28
    • 2016-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多