如何正确转义Windows cmd.exe中的文件名?

nwe*_*hof 3 filenames cmd escaping

如果您有一个包含空格的文件名,通常在Windows命令shell(cmd.exe)上引用它.

dir "\Program Files"
Run Code Online (Sandbox Code Playgroud)

这也适用于其他特殊字符^&;,=.但它不适用于百分号,因为它们可能是变量替代的一部分.例如,

mkdir "%os%"
Run Code Online (Sandbox Code Playgroud)

将创建一个名为的目录Windows_NT.要逃脱百分号,可以使用插入符号:

mkdir ^%os^%
Run Code Online (Sandbox Code Playgroud)

但不幸的是,插入符号在双引号中失去了意义:

mkdir "^%os^%"
Run Code Online (Sandbox Code Playgroud)

创建一个名为的目录^%os^%.

这是我到目前为止发现的(Windows 7命令shell):

  • 字符^&可与插入符号或双引号进行转义.
  • 字符;,,,=,和空间只能用双引号转义.
  • 角色%只能用插入符号进行转义.
  • '`+-~_.!#$@()[]{}显然,这些字符不必在文件名中进行转义.
  • <>:"/\|?*无论如何,这些字符在文件名中都是非法的.

这似乎使得引用文件名的通用算法相当复杂.例如,要创建一个名为的目录My favorite %OS%,您必须编写:

mkdir "My favorite "^%OS^%
Run Code Online (Sandbox Code Playgroud)

问题1:是否有更简单的方法来安全地引用空格和百分比字符?

问题2:'`+-~_.!#$@()[]{}如果没有逃脱,角色是否真的可以安全使用?

Dav*_*ill 6

字符^&可与插入符号或双引号进行转义.

管道时还有一个额外的限制.

使用管道时,表达式将被解析两次.首先执行管道之前的表达式,第二次执行管道之后的表达式.因此,为了逃避第二个表达式中的任何字符,需要双重转义:

下面的行将回显一个&字符:

break| echo ^^^&
Run Code Online (Sandbox Code Playgroud)

角色%只能用插入符号进行转义.

% 也可以通过加倍来逃避.

%字符对命令行参数和FOR参数具有特殊含义.

要将百分比视为常规字符,请加倍:

%%


例如,要创建名为My favorite%OS%的目录,您必须编写:

mkdir "My favorite "^%OS^%
Run Code Online (Sandbox Code Playgroud)

问题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
Run Code Online (Sandbox Code Playgroud)

问题2:字符'+ - ~_.!#$ @()[] {}在没有转义的情况下真的可以安全使用吗?

不,还有一些额外的情况,其中一些必须转义,例如使用延迟变量扩展或使用时for /f.

有关所有详细信息,请参阅转义字符 ...特别是摘要表.


语法:转义字符,分隔符和引号以及转义字符.


进一步阅读