奇怪的Windows DIR命令行为

当我在名字中查找一个带有数字的文件时,我意外地发现了这个问题。 当我input:

dir * 号码 *

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

cmd.exe命令提示符处,它返回的各种文件不会出现在任何符合search条件的文件中。 有什么奇怪的是,根据目录,一些数字将工作,而不是其他人。 例如,在与网站相关的目录中,input以下内容:

 dir *4* 

而返回的是:

 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个文件264,410字节
                0 Dir(s)362,280,906,752字节免费

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

问题是摆在堆栈溢出,因为在批处理程序中DIR命令经常与FOR组合。 奇怪的DIR行为似乎使批处理程序可能不可靠,如果他们使用DIR命令。

编辑:(附加说明)。 虽然已经过了很多时间,但是我发现了另外一个怪癖,几乎要花费我很多的工作。 我想删除特定目录树中的所有.htm文件。 我在做之前意识到*.htm.html文件匹配。 另外, *.man.manifest匹配,可能还有其他的。 删除该特定目录中的所有.html文件,至less可以说是令人不安的。

Solutions Collecting From Web of "奇怪的Windows DIR命令行为"

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

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

请注意,这种行为与DIR命令没有任何特定的关系,当通配符比任何命令(例如DEL更符合预期时,可能会导致其他(通常令人不愉快的)意外。

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

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

奇怪的是,尽管FindFirstFile()的文档将其lpFileName参数描述为“目录或路径,而文件名可以包含通配符,例如星号( * )或问号( ? )”什么*? 字符的意思。

文件模式的确切含义在20世纪70年代早期的CP / M操作系统中具有历史意义,这些操作系统强烈地影响了MSDOS的设计(有些人可能会说“被直接复制”而不是“受影响”)。 这导致了一些“有趣”的文物和行为。 在DOS的最后一部分,我们将在2007年的这篇博客文章中介绍一些这方面的知识 ,Raymond在文中描述了DOS中如何实现文件模式。

是的。 你会发现,如果你尝试这样的话,它还会搜索短名称:

 dir /x *4* 

(/ x开关是用于短名称)

用于过滤文件名使用:

 dir /b | find "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结合起来可以成为一种通用的方法来安全地使用任何遇到短文件名的问题的命令。 只需用问题命令(如COPY或DEL)替换ECHO即可。

看起来像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.