windows - 奇怪的 Windows DIR 命令行为

标签 windows command-line batch-file cmd dir

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

目录 *编号*

(其中数字代表 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 文件至少可以说是令人沮丧的。

最佳答案

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

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

请注意,此行为在任何方面都不特定于 DIR 命令,并且当通配符在任何命令上匹配的次数超过预期时,可能会导致其他(通常是令人不快的)意外,例如 删除

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

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

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

文件模式的确切含义在 CP/M 中有历史记录操作系统可以追溯到 1970 年代初期,强烈影响(有些人可能会说“被直接复制”而不是这里的“影响”)MSDOS 的设计。这导致了许多“有趣”的工件和行为。 this blog post 中描述了 DOS 范围内的其中一些内容。从 2007 年开始,Raymond 准确描述了文件模式是如何在 DOS 中实现的。

关于windows - 奇怪的 Windows DIR 命令行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11107044/

相关文章:

windows - 如何使用命令行从网络驱动器中提取文件名

linux - 如何将图像名称列表从 csv 文件传递​​给 find 命令?

windows - SQL Server 命令行实用程序 (sqlcmd.exe) 的 Oracle 等效项是什么?

batch-file - 批处理 : replace a line in a text file

windows - 安全描述符 (SD) 中的主要组

windows - 如何复制整个目录结构?

C++ WinApi : ReadDirectoryChangesW() Receiving Double Notifications

windows - 如何通过 bat 文件关闭、重新启动或注销 Windows?

batch-file - 如何在被调用的可执行文件运行时调用和关闭?

windows - DOSKEY 别名在批处理脚本中不起作用 (Windows 7)