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

5

如果你的文件名包含空格,在Windows命令行(cmd.exe)中通常需要用双引号将其括起来。

dir "\Program Files"

这也适用于其他特殊字符,例如^&;,=。但对于百分号并不适用,因为它们可能是变量替换的一部分。例如,
mkdir "%os%"

将创建一个名为Windows_NT的目录。要转义百分号,可以使用脱字符:

mkdir ^%os^%

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

mkdir "^%os^%"

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

这是我迄今为止发现的内容(Windows 7命令行):

  • 字符^&可以用脱字符或双引号进行转义。
  • 字符;,=和空格只能用双引号进行转义。
  • 字符%只能用脱字符进行转义。
  • 字符'`+-~_.!#$@()[]{}在文件名中似乎不需要进行转义。
  • 字符<>:"/\|?*在文件名中是非法的。

这似乎使得对文件名进行引用的一般算法变得复杂。例如,要创建一个名为My favorite %OS%的目录,您必须编写:

mkdir "My favorite "^%OS^%

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

问题2:在不进行转义的情况下,使用以下字符'`+-~_.!#$@()[]{}是否真的是安全的?


嗯。mkdir "我最喜爱的%OS%"能够正常工作...你不需要用^来转义 % - DavidPostill
@DavidPostill 在我的Windows 7上无法工作。您使用的是哪个Windows版本?是否设置了%OS%变量?echo %OS%打印什么? - nwellnhof
Windows 7,%OS%已设置。从echo%OS%的输出是Windows_NT - DavidPostill
@DavidPostill 为了澄清:我希望有一个名为My favorite %OS%的目录,而不是进行变量替换。当我运行mkdir "My favorite %OS%"时,我得到一个名为My favorite Windows_NT的目录,这不是我想要的。 - nwellnhof
mkdir "My favorite %%OS%%" 可以正常工作(第二个 " 在正确的位置)。 - DavidPostill
提供详细答案。 - DavidPostill
1个回答

7

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

在管道操作时有额外的限制。

When a pipe is used, the expressions are parsed twice. First when the expression before the pipe is executed and a second time when the expression after the pipe is executed. So to escape any characters in the second expression double escaping is needed:

The line below will echo a single & character:

break| echo ^^^&

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

%也可以通过加倍来进行转义。

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

要将百分号视为普通字符,请将其加倍:

%%


例如,要创建一个名为“我的最爱%OS%”的目录,您需要编写:
mkdir "My favorite "^%OS^%

Question 1: Is there an easier way to safely quote space and percent characters?

使用%%代替%,并将第二个"放在通常希望它出现的位置的末尾。
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时。
请参见 转义字符以获取所有细节...特别是摘要表。

参考 语法:转义字符、定界符和引号转义字符


更多阅读


1
感谢您指引我查看这个答案。让我困惑的是,在批处理文件中,%%可以用来转义%,但在命令行中却不行。 - nwellnhof

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接