我想做一件非常简单的事情:复制一个文件。
Copy
是一个简单(且基本)的命令。它应该很容易,但当涉及到 Unicode 文件名时,它似乎很复杂(使用English XP
、cmd.exe
和.cmd
脚本)。
我已设法使用 Unicode 文件名创建了一个 .cmd 文件,如下所示
:: To create the final .cmd script
::
set SRCE=D:\_cmd\cpp
set DEST=H%SRCE:~1%
cmd.exe /U /c DIR /A:-D /s /b "%SRCE%" >"SRCE.UTF16"
cmd.exe /U /c DIR /A:-D /s /b "%DEST%" >"DEST.UTF16"
ConvUTF.exe 1628 "DEST.UTF16" "DEST.UTF-8"
ConvUTF.exe 1628 "SRCE.UTF16" "SRCE.UTF-8"
:: Then, with `sed.exe`, `diff.exe`, and `ConvUTF.exe` again...
:: the resulting UTF-8 (or UTF16) .cmd file looks like this...
::
copy "D:\_cmd\cpp\ā.क.test" "H:\_cmd\cpp\"
copy
当我直接在 上运行该命令时,它工作正常command prompt
,但在.cmd
脚本中使用时失败。UTF
-8.cmd
错误输出:The system cannot find the file specified
UTF16.cmd
没有通过第一个 NULL 字节(第一个字符),然后退出。
有没有办法通过.cmd
脚本来做到这一点?(我想使用 shell cmd.exe
)
也许有一个可以从我的.cmd
...调用的实用程序
,欢迎提出所有建议。
附言。为了澄清 manin 问题...我不关心 Unicode 文件名在控制台窗口中的显示方式(cmd.exe 窗口中大多数非拉丁字母都不会出现这种情况)...我只关心能够复制文件名中包含 Unicode 字母的文件-通过批处理 .cmd“脚本”。
答案1
保存 UTF-8 批处理文件时,如果开头没有 BOM,则会出现错误cmd
。此外,cmd
对于批处理文件来说,它并不真正支持 Unicode。您应该将
chcp 65001
在批处理开始时切换到 UTF-8应该使您的 Unicode 字符能够被正确读取和处理。唯一的缺点是,即使在批处理文件退出后,此更改仍然存在,因此您只能使用 UTF-8 的 shell。如果这造成问题,您可以保存以前的代码页并在最后恢复它。
另外,将控制台字体更改为 TrueType 字体也可能会有帮助,因为已知有几个内部命令会出现光栅字体的 Unicode 问题(这就是为什么for /f
overdir
通常是一个愚蠢的想法的原因)。