【问题标题】:Strange Behavior with Wildcards and DIR Command in Command Prompt命令提示符中通配符和 DIR 命令的奇怪行为
【发布时间】:2015-03-16 21:51:37
【问题描述】:

我注意到当在 Windows 命令行中使用 DIR 时,通配符无法按我预期的那样工作。示例:

dir *.doc

运行类似

dir *.doc*

只有当通配符目录位于句点之前(这是一个重要且常见的情况)时,我才注意到这种行为。更奇怪的是,如果你运行任何一个:

dir *.d
dir *.do

它将按预期执行。只有当您点击 3 个字符扩展时,才会出现奇怪的行为。我提到它的运行类似于上面的命令,因为如果 *.不是它不会返回文件的扩展名。例如:

dir *.tar

返回 file.tar.gz 但返回 file.targa

为什么会这样?如何避免?

【问题讨论】:

  • Microsoft 的 Raymond Chen 在 blog post here 中详细介绍了这个问题,解释了这个解析问题及其根源。
  • @KenWhite - 该博文仅适用于 DOS。 Windows 的通配符规则非常不同。
  • @dbenham:阅读文章。 Raymond 特别提到,即使在今天的 CMD.EXE 的解析器下,一些解析问题仍然存在。 (接近文章结尾。)正如我所说,它解释了问题及其起源。我发布了评论和链接,而不是答案。
  • @KenWhite - 这是一篇有用的文章,因为它解释了一些奇怪的通配符行为的推导。但它并没有解释这个特定的问题。这个问题都是关于短文件名的。该文章确实提到了长名称与 8.3 名称,但它并没有真正提供足够的信息来解释问题中描述的行为。

标签: batch-file command-line cmd dir


【解决方案1】:

DIR 命令同时匹配长名称和短名称。

不符合旧 8.3 DOS 标准的 Windows 文件名会自动获得符合标准的短文件名别名。 (这可以在 NTFS 驱动器上禁用)

例如,一个名为“file.targa”的文件在我的本地硬盘驱动器上被分配了一个短名称“file~1.tar”。短名称的规则没有记录,分配的名称取决于创建文件时文件夹中已经存在的名称。但一致的一点是,长扩展名被截断为长扩展名的前三个字符。

鉴于 DIR 搜索长名称和短名称,您现在可以看到“*.tar”与“file~1.tar”匹配,后者是“file.targa”的短名称

几乎每个使用通配符文件掩码执行的命令都存在此问题,包括 FOR、COPY、MOVE、REN 等。

解决方法

如果您的卷是 NTFS,那么您(或您的管理员)可以禁用短名称。但是现有的短名称仍然存在,它只会禁用为将来的文件生成短名称。这不是一个非常实用的解决方案,因为您可能无法知道是否存在任何短文件名。

如果您只需要一个文件列表,而不需要其他 DIR 信息,那么您可以通过 FINDSTR 管道传输 DIR /B 的结果以获得所需的结果。

dir /b *.tar | findstr /le ".tar"

【讨论】:

    【解决方案2】:

    扩展名是最后一个点之后的部分。最后一个点之前的任何内容都是文件名,包括作为普通字符的点。

    还要记住 dir 匹配短名称和长名称。

    【讨论】:

    • 你的最后一句话是关键。
    猜你喜欢
    • 2012-06-21
    • 2012-10-02
    • 1970-01-01
    • 2010-11-30
    • 2017-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多