如何在Windows /命令行/文件打开对话框中匹配确切的文件扩展名?

时间:2016-07-21 13:17:48

标签: windows batch-file cmd

我正在尝试获取只有具有给定扩展名的文件的目录列表。乍一看,这似乎是一件简单的事情,但请查看这个简单的例子:

C:\CODE\metcal>dir /b *.exe
metcal.exe
metcal.exe1

请注意,这会将metcal.**exe**metcal.**exe1**作为匹配项返回。

使用python文件会发生类似的事情:

C:\CODE\metcal>dir /b *.py
metcal.py
metcal.pyc

再次注意Windows已确定*.py采用以*.py开头的任何内容,因此它也会捕获.pyc个文件。

有没有办法只获得完全匹配的扩展名?在上面的python文件示例中,我希望发生以下情况(显然使用正确的语法替换* .py)

C:\CODE\metcal>dir /b *.py
metcal.py

作为一个注释,Windows下的匹配并不像看起来那么简单。

*.exe匹配foo.exe, foo.exe1, foo.exeabcde foo.exe.bak

在SO上还有其他与长/短文件名相关的问题。这里的* .py和* .pyc示例不应该引入名称修改机制。

**我已经在XP和Win7机器上进行了实验,这种行为在cmd提示符和文件打开对话框中不一致。这种不一致的行为让我怀疑这个问题与某些人的设置有关。 **

3 个答案:

答案 0 :(得分:0)

因此,如果您只想获得这些扩展程序(.py.pyc),您应该尝试这样:

@echo off
dir /b *.py*
pause

答案 1 :(得分:0)

这是因为扩展名上的Windows通配符会同时检查长名和短名,如以下答案所示: https://superuser.com/questions/238900/winxp-dir-command-3-and-4-char-extensions-are-the-same#238930

解决方案是禁用8.3名称创建,然后将其剥离到ntfs卷上,这也将提高性能。

Microsoft Docs: Fsutil 8dot3name

备注: 永久删除8dot3文件名并且不修改指向8dot3文件名的注册表项可能会导致应用程序意外失败,包括无法卸载应用程序。建议您先备份目录或卷,然后再尝试删除8dot3文件名。

答案 2 :(得分:0)

您可以使用 Windows Subsystem for Linux 中的 Unix ls 命令来执行此操作,假设您已安装 WSL。它可以从 Microsoft 免费获得。在 Windows 命令提示符下,键入 wsl 后跟 ls 命令以列出您想要的文件。

因此,对于您的示例,wsl ls metcal.py 仅返回 metacal.py。要获得与 dir 相同的结果,请使用 wsl ls metcal.py*