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/

相关文章:

for-loop - for 循环在 CMD 提示符下工作但不在批处理文件中 - for 循环被复制粘贴

sql - 获取 .BAT 文件或 SQLCMD 以提示用户输入

command-line - 使用批处理和VBS创建快捷方式

regex - 将文件中的部分 url 替换为 sed

windows - Flutter 卡在 'flutter' 命令上 - 没有输出到控制台,并且永远不会完成

Windows 批处理脚本将 run_dt=1/3/2015 拆分为 "/"

linux - 如何在不指定完整路径的情况下运行程序?

android - 解析服务器仪表板不工作窗口

batch-file - 回声关闭但显示消息

batch-file - Windows 批处理中缺少操作数错误