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

The*_*Guy 17 windows windows-explorer command-line environment-variables ms-dos

  1. 转到Windows资源管理器,并创建一个名为文件夹/目录%systemdrive%%windir%或任何其他现有的变量。
  2. 打开命令提示符,然后转到您刚刚创建的文件夹。

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

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

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

Dav*_*ill 18

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

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

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

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

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


百分比符号是为变量保留的

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

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

以上是不正确的。一切都如您所愿。

使用示例%test%

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

F:\test>md %test%

F:\test>cd %test%

F:\test\%test%>
Run Code Online (Sandbox Code Playgroud)

使用示例%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
Run Code Online (Sandbox Code Playgroud)

转义百分比

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

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

%%
Run Code Online (Sandbox Code Playgroud)

语法


进一步阅读

  • @NathanOsman 您可以使用原始绝对路径符号 (`\\?\C:\USERS\DEFAULT\&lt;test&gt;`) 从 Windows 中创建具有这些名称的文件。 (2认同)

Jac*_*ite 13

DavidPostill 的回答很好,但可能会让新手有点困惑。我会试着改写。

%不是保留字符。

这是一个字符 特殊意义,以命令shell(又名cmd.execommand.com

区别在于:

  • 你根本不能使用保留字符(但见下文)
  • 您可以使用特殊字符和转义字符 - 只是不能按原样输入它们

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

BAT 文件

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

例如,

  • 命令 echo %windir%产生输出:c:\windows
  • 但是,命令echo %%windir%%会产生输出:%windir%
  • 依此类推:命令echo %%%%windir%%%%产生输出:%%windir%%

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

md %%test%%
Run Code Online (Sandbox Code Playgroud)

如果没有变量 named test,则下一个命令与上一个命令等效 - 它还会创建一个目录%test%

md %test%
Run Code Online (Sandbox Code Playgroud)

...但请永远不要这样做,因为一旦有人创建了具有该名称的变量,您的命令将不会按照您想要的方式运行

如果您打算for在 BAT 文件中使用 command ,您还需要加倍,%以便它对forcommand 而不是命令 shell 本身具有特殊意义:

for %%i in (*.*) do echo %%i
Run Code Online (Sandbox Code Playgroud)

这将生成当前目录中的文件列表(即%%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 操作系统(POSIX 的超集)可以创建(和删除)大多数普通 Windows API 函数(以及 Windows 程序)无法使用的文件/目录名称。在 Windows XP 上可以通过安装免费的“Unix 子系统服务”(SFU)来使用它们;在 Vista 和更高版本上需要第三方工具。我不确定新的 ubuntu-on-windows10 子系统是否可以做到。

  • “它是命令外壳的转义符” 不正确。cmd 中的转义字符是`^`。`%` 是“对命令行参数和 FOR 参数具有特殊含义的字符。要将百分号视为常规字符,请将其加倍”。 (2认同)