【问题标题】:Windows batch: Unicode parameters for (robo) copy commandWindows 批处理:(robo)复制命令的 Unicode 参数
【发布时间】:2011-05-10 18:06:54
【问题描述】:

我需要在一个批处理文件中复制多个文件。这些文件具有映射到不同代码页的 Unicode 名称。

示例:

set ArabicFile=ڊڌڵڲڛشس
set CyrillicFile=щЖЛдЉи
set GermanFile=Bücher

copy %ArabicFile% SomePlaceElse
copy %CyrillicFile% SomePlaceElse
copy %GermanFile% SomePlaceElse

问题:批处理文件不能是 Unicode。

问题:如何将 Unicode 文件名写入批处理文件,以便复制命令识别它们?

注意事项:

我不关心文件名的显示方式。
实际上批处理文件不仅仅是复制这些文件,我只是简化了描述以使问题更清楚。

正确的批处理文件:

根据 Arnout 的回答,我修改了我的批处理文件,如下所示。它现在可以正常工作而无需更改字体(正如 Arnout 评论的那样,这会很混乱)。

@echo off

chcp 65001

set ArabicFolder=ڊڌڵڲڛشس
set CyrillicFolder=щЖЛдЉи
set GermanFolder=Bücher

robocopy /e d:\temp\test\%ArabicFolder% d:\temp\test2\%ArabicFolder% /log:copy.log
robocopy /e d:\temp\test\%CyrillicFolder% d:\temp\test2\%CyrillicFolder% /log+:copy.log
robocopy /e d:\temp\test\%GermanFolder% d:\temp\test2\%GermanFolder% /log+:copy.log

【问题讨论】:

    标签: windows unicode batch-file filenames


    【解决方案1】:

    我想创建一个批处理文件(例如RunThis.bat),该文件创建的目录名称可以是俄罗斯人或其他人。

    示例:
    当 DOS Windows 以提示打开时:

    D:\>md "Russia - Шпионка"
    

    这在命令中起作用,并且名称显示正确。

    但如果我尝试使用记事本并保存在 ANSII 中,我不能。
    因此,如果我再次使用记事本并以 UTF-8 保存,它会起作用,但会出现乱码。

    RunThis.bat(记事本保存UTF-8),给乱码。

    chcp 65001
    set fn14="Russia - Шпионка"
    md %fn14%
    

    记事本的问题,它使用 UTF-8 BOM。

    要使用 UTF-8 没有 BOM 保存 .bat,我们必须使用 Notepad++ 之类的编辑器。

    RunThis.bat(Notepad++ 保存 UTF-8 - 无 BOM

    chcp 65001
    set fn14="Russia - Шпионка"
    md %fn14%
    

    这一次,当我们直接从 explorer.exe 运行“RunThis.bat”时,它可以完美运行

    【讨论】:

      【解决方案2】:

      如果

      • 我将CHCP 65001 添加为批处理文件的第一行,
      • 将文件另存为不带 BOM 的 UTF-8,然后
      • 将我的控制台字体设置为“光栅字体”以外的其他字体(在我的 Win7 机器上,我可以选择 Consolas 或 Lucida Console),

      它有效。很简单,不是吗? :-)

      (实际上不需要更改字体,前提是您没有将非 ASCII 输出写入控制台。)

      【讨论】:

      • 如果您打算使用可能包含 Unicode 的命令输出,则需要更改字体可能 ;)
      • 嗯,是的,这就是我所说的“只要您没有将非 ASCII 输出写入控制台”...
      • 酷,这行得通;-) 唯一的问题:如何在批处理文件中设置字体?批处理文件要在多台计算机上运行,​​我无法在运行脚本之前重新配置它们。并且需要更改字体 - 如果我不更改字体,设置命令将失败。
      • 会添加一个ECHO OFF 来解决问题,还是依赖于能够在控制台窗口中看到(部分)输出?您可以通过在 HKCU\Console 下导入具有某些设置的 .REG 来指定字体,但这很丑陋,而且可能不是很健壮。 (当然,您必须从另一个 .CMD 脚本执行此操作。)
      • 在我的 Win7 64 位机器上,CHCP 区分大小写,我必须将命令写成小写。否则无法识别该命令。
      【解决方案3】:

      我不确定,但我认为短 (8.3) 文件名将是 ASCII,所以您可以这样引用它吗?您可以通过dir /X 找到短文件名。

      【讨论】:

      • 好主意!但是,在我的情况下它不能使用您的解决方案,因为批处理文件需要在多个系统上运行,并且计算机之间的短名称可能不同(例如,当文件的创建顺序不同时)。
      • 短文件名生成可以被禁用,所以你不应该依赖它们。
      猜你喜欢
      • 1970-01-01
      • 2014-06-16
      • 1970-01-01
      • 2014-12-19
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 2010-11-02
      相关资源
      最近更新 更多