如果您的文件名包含空格,则通常在Windows命令shell(cmd.exe
)上双引号。
dir "\Program Files"
这也适用于^&;,=
等其他特殊字符。但它并不适用于百分号,因为它们可能是变量替代的一部分。例如,
mkdir "%os%"
将创建一个名为Windows_NT
的目录。要逃避百分号,可以使用插入符号:
mkdir ^%os^%
但不幸的是,插入符号在双引号中失去了意义:
mkdir "^%os^%"
创建一个名为^%os^%
的目录。
这是我到目前为止发现的(Windows 7命令shell):
^
和&
可以使用插入标记或双引号进行转义。;
,,
,=
和空格只能使用双引号进行转义。%
只能使用插入符号进行转义。'`+-~_.!#$@()[]{}
显然不必以文件名转义。<>:"/\|?*
在文件名中都是非法的。这似乎使得引用文件名的通用算法相当复杂。例如,要创建名为My favorite %OS%
的目录,您必须编写:
mkdir "My favorite "^%OS^%
问题1:是否有更简单的方法可以安全地引用空格和字符百分比?
问题2:如果没有转义,字符'`+-~_.!#$@()[]{}
是否真的可以安全使用?
答案 0 :(得分:5)
^
和&
可以使用插入标记或双引号进行转义。管道时还有一个额外的限制。
使用管道时,表达式将被解析两次。第一次的时候 管道执行前的表达式和第二次执行时的表达式 管道执行后的表达式。 所以要逃避任何角色 需要第二个表达式双重转义:
以下行将回显一个
&
字符:break| echo ^^^&
%
只能使用插入符号进行转义。 %
也可以通过加倍来逃避。
%
字符对命令行参数有特殊含义 和FOR
参数。要将百分比视为常规字符,请加倍:
%%
mkdir "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
问题2:字符'+ - ~_。!#$ @()[] {}在没有转义的情况下真的可以安全使用吗?
不,还有一些其他情况,其中一些必须转义,例如使用延迟变量扩展或使用for /f
时。
有关所有详细信息,请参阅Escape Characters ...特别是摘要表。
来源Syntax : Escape Characters, Delimiters and Quotes和Escape Characters。