将" tree / f / a"结果保存到具有unicode支持的文本文件中

时间:2020-03-06 14:46:34  来源:igfitidea点击:

我试图在Windows命令行中使用tree命令来生成一个列出目录内容的文本文件,但是当我通过管道传输输出时,会填充Unicode字符。

这是我正在使用的命令:

tree /f /a > output.txt

控制台窗口中的结果很好:

\---Erika szobája
        cover.jpg
        Erika szobája.m3u
        Kátai Tamás - 01 Télvíz.ogg
        Kátai Tamás - 02 Z?lderd?.ogg
        Kátai Tamás - 03 Rentheitroad kertje.ogg
        Kátai Tamás - 04 Es?ben szaladtál.ogg
        Kátai Tamás - 05 ázik az út.ogg
        Kátai Tamás - 06 S?r? v?lgyek takaród.ogg
        Kátai Tamás - 07 ?szhozó.ogg
        Kátai Tamás - 08 Mécsvilág.ogg
        Kátai Tamás - 09 Zúzmara.ogg

但是文本文件不好:

\---Erika szob?ja
        cover.jpg
        Erika szob?ja.m3u
        K?tai Tam?s - 01 T?lv?z.ogg
        K?tai Tam?s - 02 Z”lderd?.ogg
        K?tai Tam?s - 03 Rentheitroad kertje.ogg
        K?tai Tam?s - 04 Es?ben szaladt?l.ogg
        K?tai Tam?s - 05 μzik az £t.ogg
        K?tai Tam?s - 06 S–r– v”lgyek takar¢d.ogg
        K?tai Tam?s - 07 ?szhoz¢.ogg
        K?tai Tam?s - 08 M?csvil?g.ogg
        K?tai Tam?s - 09 Z£zmara.ogg

我怎样才能解决这个问题?理想情况下,文本文件将与控制台窗口中的输出完全相同。

我尝试了Chris Jester-Young的建议(发生了什么,我们是否删除了Chris?),建议使用/ U开关运行命令行,它看起来确实是我所需要的,但似乎没有用。我试图在VS2008和记事本中打开文件,并且都显示相同的不正确字符。

解决方案

如果输出为非Unicode(显然是这样做的),则必须使用"控制台"窗口使用的相同编码来查看创建的文本文件。这就是为什么它在控制台中看起来正确的原因。在某些文本编辑器中,打开文件时可以选择一种编码(或者"代码页")。 (我不知道如何输出为Unicode。cmd/ U不执行文档中的说明。)

控制台编码取决于Windows安装。对我来说,它是Microsoft Word中的"西欧(DOS)"(或者仅是" MS-DOS")。

我决定必须查看tree.com并弄清为什么它不遵守控制台的Unicode设置。事实证明,与许多命令行文件实用程序一样,它使用名为ulib.dll的库进行所有打印(具体来说,TREE:DisplayName调用ulib中的WriteString)。

现在,在" ulib"中," WriteString"方法在" SCREEN"和" STREAM"两个类中实现。 SCREEN版本直接使用WriteConsoleW,因此所有Unicode字符都可以正确显示。 " STREAM"版本将Unicode文本转换为三种不同编码之一(" _UseConsoleConversions",控制台代码页(" GetConsoleCP")," _ UseAnsiConversions",默认的ANSI代码页,否则的默认的OEM代码页),然后将其写入。我不知道如何更改转换模式,也不相信可以禁用转换。

我只是简要地看了一下,所以也许更多有冒险精神的人可以谈谈更多! :-)

简短的答案是我们不能,这是因为tree.com是ANSI应用程序,即使在Windows 7上也是如此。

唯一的解决方案是编写自己的tree实现。我们也可以向Microsoft提交错误,但是我怀疑他们尚未意识到。