我想处理包含文件名奇怪的字符,像法国é。
一切都在外壳做工精细:
C:\somedir\>ren -hélice hélice
我知道,如果我把这个线在.bat文件中,我得到以下结果:
C:\somedir\>ren -hÚlice hÚlice
看到了吗? é已被替换用u。
这同样适用于命令输出正确的。 如果我dir
在外壳的一些目录,输出是罚款。 如果我这个输出重定向到一个文件中,某些字符被转换。
所以,我怎么能告诉CMD.EXE如何解释这似乎为我的批处理文件的E,是一个真正的é而不是U或逗号?
因此,有执行.bat文件时,提供与上面写的代码页的暗示没有办法?
你必须保存与OEM编码批处理文件。 如何做到这一点取决于你的文本编辑器而异。 在这种情况下,所使用的编码而变化为好。 对于西方文化中它通常是CP850。
批处理文件和编码是真正的两件事情,特别不喜欢对方。 你会发现,Unicode是也不能使用那里,不幸的是(即使环境变量处理得很好)。
或者,您可以设置控制台使用另一个代码页:
chcp 1252
应该做的伎俩。 至少它为我工作在这里。
当你做输出重定向,如用dir
,适用同样的规则。 控制台窗口的代码页中。 您可以使用/u
切换到cmd.exe
强制Unicode的输出重定向,这会导致生成的文件是在UTF-16。
至于在编码和代码页cmd.exe
在一般情况下,也看到了这个问题:
编辑:至于你编辑:没有, cmd
总是假定被写在控制台默认代码页的批处理文件。 然而,你可以很容易地包括chcp
在批的开始:
chcp 1252>NUL
ren -hélice hélice
为了使这更健壮直接在命令行中使用时,你可能要记住旧代码页和事后恢复它:
@echo off
for /f "tokens=2 delims=:." %%x in ('chcp') do set cp=%%x
chcp 1252>nul
ren -hélice hélice
chcp %cp%>nul
我创建了以下块,我把在我的批处理文件的开头:
set Filename=%0
IF "%Filename:~-8%" == "-850.bat" GOTO CONVERT_CODEPAGE_END
rem Converting code page from 1252 to 850.
rem My editors use 1252, my batch uses 850.
rem We create a converted -850.bat file, and then launch it.
set File850=%~n0-850.bat
PowerShell.exe -Command "get-content %0 | out-file -encoding oem -filepath %File850%"
call %File850%
del %File850%
EXIT /b 0
:CONVERT_CODEPAGE_END
我是有这个麻烦,这里是我找到了解决办法。 查找您正在寻找在当前的代码页的字符的十进制数。
例如,我在代码页437( chcp
告诉你),我想一定程度的标志。 http://en.wikipedia.org/wiki/Code_page_437告诉我,度符号数248。
然后,你发现有相同数量的Unicode字符。
在248中的Unicode字符(U + 00F8)的。
如果您在批处理脚本插入Unicode字符,它会显示在控制台你想要的字符。
所以我的批处理文件
echo
版画
°
我关心的三个概念:
输出控制台编码
命令行内部编码(即改变与CHCP)
.BAT文本编码
最简单的场景对我说:我会在相同的编码中提到的前两个,说CP850,我将我的.bat存储在相同的编码(在记事本++,菜单→ 编码 字符集 → 西欧 →OEM 850)。
但是,假设有人给我另一种编码一个.BAT,说CP1252(在记事本++,菜单编码*→ 字符集 → 西欧 →Windows的1252)
然后我想改变命令行内部编码,与CHCP 1252。
这改变了它使用与其他进程交谈编码,无论是输入装置也没有输出控制台。
所以我的命令行实例将有效地通过它的标准输出的文件描述符发在1252个字符,但是当控制台解码出来为850(E为U)出现gabbed文本。
然后我修改了文件,如下所示:
@echo off
perl -e "use Encode qw/encode decode/;" -e "print encode('cp850', decode('cp1252', \"ren -hlice hlice\n\"));"
ren -hlice hlice
首先我把回声关闭,因此该命令不输出,除非明确地做任何回音......或Perl -e“打印...”
然后,我每一次我需要输出的东西把这个样板
的perl -e “使用编码QW /编码解码/;” -e “打印编码( 'CP850',解码( 'CP1252',\” 仁-hélice厚蟹\ n \ “));”
我代替实际的文字,我会告诉这个人:任-hélice厚蟹。
而且我需要替换我的控制台编码CP850和对方编码CP1252。
而就在下面,我把所需的命令。
我也打破了问题的行到输出一半,真正的命令一半。
我曾在R(如:A,E,Z,Z等)里面的代码抛光标志和有问题.bat文件运行时,该R脚本 (在输出文件.Rout,而不是那些迹象有样症状%,&#等,以及代码并没有运行到结束)。
我的解决方案:
- 与编码保存[R脚本:文件>保存与编码> CP1250
- 运行.bat文件
它为我工作,但如果仍有问题,尝试使用其他的编码。