Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何正确转义Windows cmd.exe中的文件名?_Cmd_Escaping_Filenames - Fatal编程技术网

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

如何正确转义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): 字符^和&

如果文件名包含空格,通常在Windows命令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