batch-file - 命令提示符中通配符和 DIR 命令的奇怪行为

标签 batch-file command-line cmd dir

我注意到,当在 Windows 命令行中使用 DIR 时,对于一种特定情况,通配符无法按我的预期运行。示例:

dir *.doc

运行类似于

dir *.doc*

我仅在通配符目录位于句点之前时才注意到此行为(这是一种重要且常见的情况)。更奇怪的是,如果您运行以下任一命令:

dir *.d
dir *.do

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

dir *.tar

不会返回file.tar.gz,但返回file.targa

为什么会出现这种情况以及如何避免?

最佳答案

DIR 命令与长名称和短名称相匹配。

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

例如,在我的本地硬盘上,名称为“file.targa”的文件被分配了一个短名称“file~1.tar”。短名称的规则没有记录,分配的名称会根据创建文件时文件夹中已存在的名称而有所不同。但有一点是一致的,即长扩展名会被截断为长扩展名的前三个字符。

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

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

解决方法

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

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

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

关于batch-file - 命令提示符中通配符和 DIR 命令的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29087611/

相关文章:

windows - 如何在 Windows 上将控制台输入 ( yes/no ) 作为批处理文件的一部分提供。

command-line - VLC 播放器中的命令行 YouTube - 质量控制?

java - Visual Basic 6 cmd.exe 编译 - 弹出窗口

windows - 如何强制 `findstr`忽略 `Cannot open`返回

apache - 无法启动服务 -"contact the service vendor, and refer to service-specific error code 1"

java - 我们如何通过批处理文件运行 cucumber 测试?

javac错误: "Cannot find symbol"

batch-file - 变量名中的字符转义

Windows 批处理编程——此时出乎意料

windows - 命令行字符串的最大长度