如何正确转义Windows cmd.exe中的文件名?
如果文件名包含空格,通常在Windows命令shell(如何正确转义Windows cmd.exe中的文件名?,cmd,escaping,filenames,Cmd,Escaping,Filenames,如果文件名包含空格,通常在Windows命令shell(cmd.exe)中对其进行双引号引用 这也适用于其他特殊字符,如^&=。但它不适用于百分号,因为它们可能是变量替换的一部分。比如说, mkdir "%os%" 将创建名为Windows\u NT的目录。要避开百分号,可以使用插入符号: mkdir ^%os^% 但不幸的是,插入符号在双引号中失去了意义: mkdir "^%os^%" 创建名为^%os^%的目录 这是我到目前为止发现的(Windows 7命令shell): 字符^和&
cmd.exe
)中对其进行双引号引用
这也适用于其他特殊字符,如^&=代码>。但它不适用于百分号,因为它们可能是变量替换的一部分。比如说,
mkdir "%os%"
将创建名为Windows\u NT
的目录。要避开百分号,可以使用插入符号:
mkdir ^%os^%
但不幸的是,插入符号在双引号中失去了意义:
mkdir "^%os^%"
创建名为^%os^%
的目录
这是我到目前为止发现的(Windows 7命令shell):
- 字符
^
和&
可以用插入符号或双引号转义
- 字符
、、
、=
,空格只能用双引号转义
- 字符
%
只能用插入符号转义
- 字符
“`+-~#$@()[]{}
显然不必在文件名中转义
- 字符
:“/\ \?*
在文件名中无论如何都是非法的
这似乎使引用文件名的通用算法变得相当复杂。例如,要创建名为我最喜欢的%OS%
的目录,您必须编写:
mkdir "My favorite "^%OS^%
问题1:是否有更简单的方法安全地引用空格和百分比字符
问题2:字符“`+-~.!$@()[]{}
在不转义的情况下使用真的安全吗?字符^
和&
可以用插入符号或双引号转义。
配管时还有一个附加限制
使用管道时,表达式将被解析两次
执行管道之前的表达式,以及
执行管道后的表达式。以便转义管道中的任何字符
第二个表达式需要双转义:
下一行将回显单个字符和字符:
break| echo ^^^&
字符%
只能用插入符号转义。
%
也可以通过加倍进行转义
%
字符对命令行参数有特殊意义
和
参数的
要将百分比视为常规字符,请将其加倍:
%%
例如,要创建名为My favorite%OS%的目录,您必须编写:
问题1:是否有更简单的方法安全地引用空间和百分比
角色
使用%%
而不是%%
,将第二个“
放在您通常期望的末尾
C:\test\sub>dir
...
Directory of C:\test\sub
03/06/2015 14:40 <DIR> .
03/06/2015 14:40 <DIR> ..
0 File(s) 0 bytes
2 Dir(s) 82,207,772,672 bytes free
C:\test\sub>mkdir "My favorite %%OS%%"
C:\test\sub>dir
...
Directory of C:\test\sub
03/06/2015 14:40 <DIR> .
03/06/2015 14:40 <DIR> ..
03/06/2015 14:40 <DIR> My favorite %Windows_NT%
0 File(s) 0 bytes
3 Dir(s) 82,207,772,672 bytes free
C:\test\sub>dir
...
C:\test\sub目录
03/06/2015 14:40 .
03/06/2015 14:40 ..
0个文件0个字节
2个Dir(s)8220777672字节可用
C:\test\sub>mkdir“我最喜欢的%%OS%%”
C:\test\sub>dir
...
C:\test\sub目录
03/06/2015 14:40 .
03/06/2015 14:40 ..
2015年6月3日14:40我最喜欢的%Windows\u NT%
0个文件0个字节
3个目录8220777672字节可用
问题2:这些字符是“`+-~~”#$@()[]{}使用起来真的安全吗
不,还有一些情况下,其中一些必须转义,例如,当使用延迟变量扩展或使用for/f
时
有关所有详细信息,请参阅。。。特别是汇总表
资料来源和报告
进一步阅读
Hmm.mkdir“我最喜欢的%OS%”
预期效果良好。。。您不需要使用^
@davidpost退出%
,否则它在Windows 7上对我不起作用。您使用什么Windows版本?%OS%
变量是否已设置?echo%OS%
打印什么?Windows 7中设置了%OS%
。echo%OS%
的输出是Windows\u NT
@DavidPostill要澄清的是:我希望有一个名为My favorite%OS%
的目录,没有变量替换。当我运行mkdir“我最喜欢的%OS%”
时,我得到一个名为我最喜欢的Windows\u NT
的目录,这不是我想要的。mkdir“我最喜欢的%%OS%%”
起作用(第二个“
在它应该在的末尾)。感谢您指点我。让我困惑的是,%%
可以用于在批处理文件中转义%%
,但不能在命令行上转义。
mkdir "My favorite "^%OS^%
C:\test\sub>dir
...
Directory of C:\test\sub
03/06/2015 14:40 <DIR> .
03/06/2015 14:40 <DIR> ..
0 File(s) 0 bytes
2 Dir(s) 82,207,772,672 bytes free
C:\test\sub>mkdir "My favorite %%OS%%"
C:\test\sub>dir
...
Directory of C:\test\sub
03/06/2015 14:40 <DIR> .
03/06/2015 14:40 <DIR> ..
03/06/2015 14:40 <DIR> My favorite %Windows_NT%
0 File(s) 0 bytes
3 Dir(s) 82,207,772,672 bytes free