在Windows资源管理器中,如果将百分比符号用于现有变量,为什么还要用百分比(%)符号创建文件夹或文件?


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

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

%用两个百分号()转义百分号()%%无效,因此DavidPostill的答案是错误的:

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

Answers:


16

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

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

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

< (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参数具有特殊含义。

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

%%

语法


进一步阅读


1
注意:并非所有保留字符都适用于NTFS文件系统。例如,使用Linux,我可以轻松创建一个名为的文件<test>。使用Windows的文件管理功能完全无法做到这一点。
内森·奥斯曼

2
@NathanOsman您可以使用原始的绝对路径符号(\\?\C:\USERS\DEFAULT\<test>)从Windows中使用这些名称创建文件。
zwol

@zwol哦?我不知道 很高兴知道。
内森·奥斯曼

@zwol不是从cmdshell 发出的... F:\test>md \\?\f:\test\<test> 命令的语法不正确。
DavidPostill

@DavidPostill怎么样md \\^?\f:\test\^<test^>
zwol

11

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%%

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

md %test%

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

如果打算for在BAT文件中使用命令,则还需要加倍,%以便对for命令(而不是命令外壳本身)具有特殊含义:

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

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

%不是命令提示符中唯一具有特殊含义的字符。其他的还包括^<>|()&!"。其中大多数(不包括")都可以转义 -即以转义字符为前缀,^以便插入文字字符,从而抑制了其特殊含义。那些也会在双引号字符串内失去其特殊功能,并"以反斜杠转义:\"。某些插入符号(^)可能需要在双引号括起来的字符串中以及发生延迟变量替换的地方加倍(!特殊含义)。

命令提示符

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

在命令处理中似乎有一个利用怪癖的解决方法-您可以%通过键入^after 获得文字%。但是,这种方法并不是万无一失的:如果文件名用双引号引起来,^将按字面意义进行解释(并且不会像没有引号一样被删除)

  • 命令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上,可以通过安装免费的“ Unix子系统服务”(SFU)来使用它们。在Vista或更高版本上,则需要第三方工具。我不确定新的ubuntu-on-windows10子系统是否可以做到。


为什么将键盘标签用作路径/命令名称?如果您仅使用内联代码格式,则在语法上将更加正确且可读性更高。键入也更容易:使用反引号代替<kbd>
科迪·格雷

完成。我认为<kbd>标签</ kbd>的轮廓要比清晰得多code blocks。但是,如果出现这样的问题,我想它们确实会引起混乱。
杰克·怀特

2
“这是命令Shell的转义符号”不正确。cmd中的转义字符为^%是“对命令行参数和FOR参数具有特殊含义的字符。要将百分数视为常规字符,请将其加倍”。
DavidPostill

确实,我对这些术语感到困惑。现在更正了答案。谢谢。
杰克·怀特

另请注意,在我的答案概括,你只有加倍%for如果for是一个批处理文件中。键入for %%i in (*) do echo %%i命令propmt窗口会产生错误,提示出现%%i
杰克·怀特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.