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

时间:2015-06-03 13:00:53

标签: cmd escaping filenames

如果您的文件名包含空格,则通常在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:如果没有转义,字符'`+-~_.!#$@()[]{}是否真的可以安全使用?

1 个答案:

答案 0 :(得分:5)

字符^&可以使用插入标记或双引号进行转义。

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

  

使用管道时,表达式将被解析两次。第一次的时候   管道执行前的表达式和第二次执行时的表达式   管道执行后的表达式。 所以要逃避任何角色   需要第二个表达式双重转义

     

以下行将回显一个&字符:

break| echo ^^^&

字符%只能使用插入符号进行转义。

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

  

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

     

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

     

%%

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

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 QuotesEscape Characters

进一步阅读