如果调用了chcp,则批处理脚本不会被执行

7

我正在尝试使用批处理脚本删除一些带有Unicode字符的文件(这是必需的)。因此,我运行cmd并执行以下命令:

> chcp 65001

有效地将代码页设置为UTF-8。它可以工作:

D:\temp\1>dir
 Volume in drive D has no label.
 Volume Serial Number is 8C33-61BF

 Directory of D:\temp\1

02.02.2010  09:31    <DIR>          .
02.02.2010  09:31    <DIR>          ..
02.02.2010  09:32               508 1.txt
02.02.2010  09:28                12 delete.bat
02.02.2010  09:20                95 delete.cmd
02.02.2010  09:13    <DIR>          Rún
02.02.2010  09:13    <DIR>          Гуцул Каліпсо
               3 File(s)            615 bytes
               4 Dir(s)  11 576 438 784 bytes free

D:\temp\1>rmdir Rún

D:\temp\1>dir
 Volume in drive D has no label.
 Volume Serial Number is 8C33-61BF

 Directory of D:\temp\1

02.02.2010  09:56    <DIR>          .
02.02.2010  09:56    <DIR>          ..
02.02.2010  09:32               508 1.txt
02.02.2010  09:28                12 delete.bat
02.02.2010  09:20                95 delete.cmd
02.02.2010  09:13    <DIR>          Гуцул Каліпсо
               3 File(s)            615 bytes
               3 Dir(s)  11 576 438 784 bytes free

然后我将相同的rmdir命令放入批处理脚本中,并以UTF-8编码保存。但是当我运行时,什么都没有发生:在这种情况下,批处理脚本甚至没有回显工作。即使将脚本保存为OEM编码也没有帮助。

因此,似乎当我在控制台中将代码页更改为UTF-8时,脚本就停止工作了。有人知道如何解决吗?


思考并很快写出实际答案,但有两个问题:您是否确保批处理文件开头没有U+FEFF?而且您可以使用VBScript代替批处理文件吗?那里的Unicode支持更容易。 - Joey
不,批处理文件中没有BOM。我可以使用VBS,但我只想知道是否可以直接解决我的问题。 - Andy
也许可以;我之前在批处理文件中有过一些Unicode方面的进展,但并不完美,而且最好也只是些零散的结果。 - Joey
3个回答

10

如果您想在批处理文件中支持Unicode,那么单独使用一行的CHCP只会中止批处理文件。我的建议是在需要Unicode的每个批处理文件行上都放置CHCP,如下所示:

chcp 65001 > nul && <real command here>

例子:在我的情况下,我想要在调试时拥有一个漂亮的日志文件TAIL,但是即使是Latin-1字符的内容也会被搞砸。因此,这是我的批处理文件,它包装了来自Windows Resource Kit的真正的tail实现。

@C:\WINDOWS\system32\chcp.com 65001 >nul && tail.exe -f %1

此外,如果要在控制台输出,您需要设置一个真正的字体,即Lucidia Console。

显然,如果要将输出写入文件,则需要将命令行设置为Unicode编码,因此您需要按以下方式启动批处理脚本:

cmd /u /c <batch file command here>

免责声明:在 Windows XP sp3 上使用 Windows 资源工具包进行测试。


那么也许 chcp 65001 && path\to\batchfile.bat 会起作用? - tripleee

0

控制台中的Unicode支持,特别是在批处理文件中,非常糟糕。 你能否“扭曲”要求,以使用PowerShell或Active Scripting(VBScript或JScript)?

从长远来看,这将为您节省很多麻烦(如果您需要将其发展成超出此简单任务的内容)

更不用说,PowerShell和ActiveScripting都使用更强大的语言,允许使用函数、适当的循环、真正的变量、调试器以及许多适用于更严肃项目的好东西。


是的,我可以。我只是想弄清楚,是否有可能直接解决这个错误(实际上,这是一个错误,不是吗)... - Andy

0

尝试在批处理文件的第一行插入一个空行...

第1行:

第2行:CHCP 65001

第3行:脚本命令

应该可以工作!


抱歉,我忘记了:请确保将BAT文件保存为UTF-8格式。 - Joey Lanza
为什么这个会起作用?如果可能的话,请通过添加测试用例来扩展。 - adamdunson
1
在Win7上这个可以工作,但是你不会遇到任何关于chcp 65001的问题,无论是否有空行。在XP上这仍然失败。 - jeb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接