奇怪的Windows DIR命令行为

时间:2012-06-19 18:25:29

标签: windows command-line batch-file cmd dir

我在寻找名称中带有数字的文件时偶然发现了这一点。当我输入:

dir * 号码 *

(其中number表示0到9之间的任何数字,星号和数字之间没有空格)

在cmd.exe命令提示符下,它返回任何不符合搜索条件的文件。有点奇怪的是,取决于目录,一些数字将起作用,而不是其他数字。例如,在与网站关联的目录中,我键入以下内容:

dir *4*

返回的是:

Directory of C:\Ampps\www\includes\pages 

04/30/2012  03:55 PM               153 inventory_list_retrieve.php
06/18/2012  11:17 AM             6,756 ix.html
06/19/2012  01:47 PM           257,501 jquery.1.7.1.js
               3 File(s)        264,410 bytes
               0 Dir(s)  362,280,906,752 bytes free

这对我没有任何意义。任何线索?

问题出在stackOverflow上,因为DIR命令通常与批处理程序中的FOR结合使用。如果使用DIR命令,奇怪的DIR行为似乎会使批处理程序可能不可靠。

编辑:(附加说明)。虽然已经过了很长时间,但我发现了另一个怪癖,这几乎让我付出了很多努力。我想删除特定目录树中的所有.htm个文件。我之前意识到*.htm匹配.html文件。此外,*.man匹配.manifest,可能还有其他人。删除该特定目录中的所有.html文件至少可以说是令人沮丧。

4 个答案:

答案 0 :(得分:15)

命令提示符处的通配符与长文件名和短“8.3”名称匹配(如果存在)。这会产生意外。

要查看短名称,请使用/X命令的DIR选项。

请注意,此行为与DIR命令无关,并且当外卡与任何命令(例如{{1})匹配超过预期时,可能会导致其他(通常令人不愉快的)意外}。

与* nix shell不同,在每个命令中实现用匹配名称列表替换文件模式,而不是由shell本身实现。这可能意味着不同的命令可以实现不同的通配符模式规则,但实际上这是非常罕见的,因为Windows提供API调用来搜索目录中与模式匹配的文件,并且大多数程序以明显的方式使用这些调用。对于使用“常用”工具用C或C ++编写的程序,C运行时库使用Windows API“免费”提供该扩展。

有问题的Windows API是FindFirstFile()及其近亲FindFirstFileEx()FindNextFile()FindClose()

奇怪的是,虽然DEL的文档将其lpFileName参数描述为“目录或路径,文件名可以包含通配符,例如,星号(FindFirstFile())或问题标记(*)“它实际上从未定义?*字符的含义。

文件模式的确切含义在20世纪70年代早期的CP/M操作系统中具有历史记录,强烈影响(有些人可能会说“直接复制”代替“受影响”)MSDOS的设计。这导致了许多“有趣的”工件和行为。从2007年的this blog post开始描述其中一些在频谱的DOS端,Raymond详细描述了如何在DOS中实现文件模式。

答案 1 :(得分:12)

是的。如果您尝试这样做,您会看到它还会搜索短名称:

dir /x *4*

(/ x开关用于短名称)

用于过滤文件名:

dir /b | find "4"

答案 2 :(得分:4)

RBerteig的回答引用:

  

请注意,此行为绝不是DIR命令特有的,   当外卡时,可能导致其他(通常令人不愉快的)惊喜   在任何命令上匹配超过预期,例如DEL。

即使FOR命令也是如此,这是非常讨厌的。

for %A in (*4*) do @echo %A contains a 4

还将搜索短名称。解决方案是再次使用FIND或FINDSTR以更可靠的方式过滤掉名称。

for %A in (*) do @echo %A | >nul findstr 4 && echo %A contains a 4

注意 - 如果在批处理文件中使用该命令,请将%A更改为%% A.

将FOR与FINDSTR结合使用可以是一种通用方法,可以安全地使用任何遇到短文件名问题的命令。只需用问题命令替换ECHO,例如COPY或DEL。

答案 3 :(得分:3)

似乎dir命令搜索也是简短的(8.3方式)文件名。

当我致电dir *1*时,这就是我得到的:

 Volume in drive C is System
 Volume Serial Number is F061-0B78

 Directory of C:\Users\Piotrek\Desktop\Downloads
2012-05-20  17:33        23 639 040 gDEBugger-5_8.msi
2012-05-20  17:30           761 942 glew-1.7.0.zip
2012-05-20  17:11         9 330 176 irfanview_plugins_433_setup.exe
2012-05-24  20:17         4 419 192 SumatraPDF-2.1.1-install.exe
2012-05-15  22:55         3 466 248 TrueCrypt Setup 7.1a.exe
               5 File(s)  1 127 302 494 bytes

列出的文件中有gDEBugger-5_8.msi个文件,其中显然没有1个字符。

当我使用dir命令使用/X开关时,一切都变得清晰,这使得dir使用8.3文件名。 dir /X *1*命令的输出:

 Volume in drive C is System
 Volume Serial Number is F061-0B78

 Directory of C:\Users\Piotrek\Desktop\Downloads


2012-05-20  17:33        23 639 040 GDEBUG~1.MSI gDEBugger-5_8.msi
2012-05-20  17:30           761 942 GLEW-1~1.ZIP glew-1.7.0.zip
2012-05-20  17:11         9 330 176 IRFANV~1.EXE irfanview_plugins_433_setup.exe
2012-05-24  20:17         4 419 192 SUMATR~1.EXE SumatraPDF-2.1.1-install.exe
2012-05-15  22:55         3 466 248 TRUECR~1.EXE TrueCrypt Setup 7.1a.exe
               5 File(s)  1 127 302 494 bytes

引用dir的帮助:

/X          This displays the short names generated for non-8dot3 file
            names.  The format is that of /N with the short name inserted
            before the long name. If no short name is present, blanks are
            displayed in its place.