在 Windows 资源管理器中,如果百分号用于现有变量,为什么我们可以创建带有百分号 (%) 的文件夹或文件?

在 Windows 资源管理器中,如果百分号用于现有变量,为什么我们可以创建带有百分号 (%) 的文件夹或文件?
  1. 转到 Windows 资源管理器,并创建一个名为 、 或任何其他现有变量的文件夹/%systemdrive%目录%windir%
  2. 打开命令提示符,然后转到刚刚创建的文件夹。

你不能,因为%文件夹名称中有百分号()符号,这会混淆命令提示符,因为百分号用于现有变量。

%用两个百分号 ( ) 来转义百分号( %%) 符号不起作用,因此 DavidPostill 的答案是错误的:

命令提示符窗口,其中显示了资源管理器桌面的一部分%那么,在 Windows 资源管理器中,如果百分号用于现有变量, 为什么我们可以创建带有百分号 ( ) 符号的文件夹或文件?

答案1

为什么我们可以创建带有百分号的文件夹/文件?

%字符不是文件名中的保留字符。

用于命名文件、路径和命名空间的保留字符是:

< (less than)
> (greater than)
: (colon)
" (double quote)
/ (forward slash)
\ (backslash)
| (vertical bar or pipe)
? (question mark)
* (asterisk)

来源命名文件、路径和命名空间


百分号是为变量保留的

现在,打开命令提示符并尝试转到您创建的文件夹。

不能,因为文件夹名称中有百分号,表示它是一个变量。

上述情况并非如此。一切都按您预期的方式运行。

使用示例%test%

F:\test>echo %test%
%test%

F:\test>md %test%

F:\test>cd %test%

F:\test\%test%>

使用示例%systemdrive%

F:\test>echo %systemdrive%
C:

F:\test>md %systemdrive%
A subdirectory or file C: already exists.

F:\test>cd %systemdrive%
C:\Users\DavidPostill

F:\test>c:

C:\Users\DavidPostill>f:

F:\test>

F:\test>dir %systemdrive%
 Volume in drive C has no label.
 Volume Serial Number is C8D0-DF1E

 Directory of C:\Users\DavidPostill

03/06/2016  16:16    <DIR>          .
03/06/2016  16:16    <DIR>          ..
18/07/2015  19:25    <DIR>          .atom
03/06/2016  16:16    <DIR>          .oracle_jre_usage
08/05/2015  20:29    <DIR>          Contacts
03/06/2016  16:14    <DIR>          Desktop
01/06/2016  09:04    <DIR>          Documents
02/05/2016  12:55    <DIR>          Downloads
09/01/2015  11:51    <DIR>          dwhelper
08/05/2015  20:29    <DIR>          Favorites
20/02/2016  22:00    <DIR>          Jaikoz
08/05/2015  20:29    <DIR>          Links
17/03/2015  06:19    <DIR>          Music
29/03/2016  19:01    <DIR>          Pictures
08/05/2015  20:29    <DIR>          Saved Games
23/06/2016  10:55    <DIR>          Searches
02/05/2016  12:36    <DIR>          SecurityScans
11/04/2016  12:14               994 Start Menu - Shortcut.lnk
31/05/2016  00:52    <DIR>          temp
17/03/2015  06:19    <DIR>          Videos
               1 File(s)            994 bytes
              19 Dir(s)  69,716,357,120 bytes free

转义百分号

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

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

%%

来源句法


进一步阅读

答案2

DavidPostill 的回答很棒,但可能会让新手有些困惑。我会尝试重新表述。

%不是一个预订的特点。

这是一个具有特殊意义命令外壳(又名cmd.execommand.com

区别在于:

  • 根本不能使用保留字符(但请参见下文)
  • 您可以使用特殊字符和转义字符 - 但不能直接输入

换句话说,您可以创建一个%名称中包含的文件或文件夹。您可以直接使用 Windows 资源管理器执行此操作,因为%那里没有特殊含义。也没有打算阻止您在命令提示符下创建此类文件,但由于%那里有特殊含义,您需要使用下面概述的语法来创建此类文件。

BAT文件

如果你是编写批处理文件(*.bat、*.cmd)由命令 shell(又名命令提示符应用程序)执行,要按%字面意思使用(例如创建一个%带有名称的文件,而不是替换变量或参数),您需要键入%%

例如,

  • 命令echo %windir%产生输出:c:\windows
  • 但是,命令echo %%windir%%产生输出:%windir%
  • 等等:命令echo %%%%windir%%%%产生输出:%%windir%%

因此,如果您将以下行保存为test.bat并运行它,它将创建一个名为%test%complete 并带有百分号的目录:

md %%test%%

如果有变量名为test,下一个命令与上一个命令相同 - 它还创建一个目录%test%

md %test%

...但请永远不要这样做,因为一旦有人创建了同名的变量,你的命令就不会按照你想要的方式运行。

如果您打算for在 BAT 文件中使用命令,那么您还需要将其重复%,以使其对for命令而不是命令 shell 本身具有特殊含义:

for %%i in (*.*) do echo %%i

这将生成当前目录中的文件列表(即%%i具有特殊含义),并且我不确定如何使其生成文字,%%i而无需诉诸%p%下一节中描述的解决方法(%%%%i这里不起作用)。

%并不是命令提示符中唯一具有特殊含义的字符。其他字符包括^<>|()&!"其中大多数(不包括")都可以逃脱- 即以转义字符作为前缀,^这样就可以插入文字字符,从而隐藏其特殊含义。这些字符在双引号字符串中也会失去其特殊功能,并"使用反斜杠进行转义:\"。某些插入符号 ( ^) 可能需要在双引号括起来的字符串中重复,并且会发生延迟变量替换(!特殊含义)。

命令提示符

不幸的是,当直接在命令提示符窗口中输入命令时,重复%字符只会产生%%上述方法在这种情况下不起作用。

似乎有一种利用命令处理中的怪癖的解决方法 - 你可以在后面%输入 来获取文字。但这种方法并非万无一失:如果你的文件名用双引号括起来,则会按字面意思解释(而不是像没有引号那样被删除)^%^

  • 命令echo %windir%产生输出:c:\windows
  • 命令echo %^windir%产生输出:%windir%
  • 命令echo "%^windir%"产生输出:("%^windir%"带有额外的^- 不是我们想要的)

我建议使用另一种解决方法:

  • 创建一个这样的变量:set "p=%"
  • %p%在需要文字百分号的地方使用:echo "%p%windir%p%"现在将产生输出:"%windir%"

可以使用相同的解决方法来获取命令中的文字百分号for,但请注意,与直接键入命令的 BAT 文件不同,for您需要不是双百分号。

文件系统保留字符

通常,您不能创建名称中包含以下保留字符的文件或目录:/ ? < > \ : * | "、NULL 符号以及代码为 1 至 31 的字符;.还有空间不能是最后一个字符;并且以下名称是非法的:com1 com2 com3 com4 com5 com6 com7 com8 com9 lpt1 lpt2 lpt3 lpt4 lpt5 lpt6 lpt7 lpt8 lpt9 con nul prn

然而,一些可以通过在文件路径前加上前缀来绕过这些限制,如下\\?\所示:\\?\c:\test...\nul。至少可以使用这种方式操作具有保留名称的文件以及以空格和点结尾的文件。

此外,NTFS 文件系统本身支持多个命名子系统:DOS、Windows 和 POSIX。Windows 子系统具有上述所有限制,而 POSIX 仅禁止使用/NULL 符号。

因此,GNU/Linux OS(POSIX 的超集)可以创建(和删除)大多数普通 Windows API 函数(以及 Windows 程序)无法处理的文件/目录名称。在 Windows XP 上,可以通过安装免费的“Services For Unix 子系统”(SFU)来处理它们;在 Vista 及更高版本上,需要第三方工具才能做到这一点。我不确定新的 ubuntu-on-windows10 子系统是否可以做到这一点。

相关内容