忽略具有多个扩展名的文件的 DIR 命令

忽略具有多个扩展名的文件的 DIR 命令

.exe我有一个目录,其中包含一个需要使用 DIR 查找的单个文件。但是,同一目录中还有以 结尾的文件.vshost.exe。我总是最终得到与我的*.exe模式匹配的两个文件。

即目录包含test.exetest.vshost.exe(两个文件具有相同的名称,只是扩展名不同。)

我怎样才能只匹配.exe, 而不匹配.vshost.exe? 我觉得使用 * 和 ? 应该相对容易,但我似乎找不到太多关于排除此类文件的信息。谢谢。

答案1

不幸的是,这是不可能的仅有的DIR命令,但它可以与该FINDSTR命令结合使用。

我关注的是更普遍的问题,而不是有关.exe文件的具体问题,但您可以轻松修改它以缩小范围。

FINDSTR命令支持对输出进行正则表达式搜索,这使我们能够过滤掉文件名中包含多个句点的文件。

DIR /B | FINDSTR /V /R "[^\.]*\.[^\.]*\.[^\.]*$"

我建议FOR按如下方式包装到循环中以对返回的文件列表执行某些操作:

FOR /F "tokens=*" %%a IN ('DIR /B ^| FINDSTR /V /R "[^\.]*\.[^\.]*\.[^\.]*$"') DO ECHO %%a

分解

在此说明中,<...>是稍后将解释的内容的占位符。它只是为了简化。

  • FOR /F "tokens=*" %%a IN ('<...>') DO ECHO %%a
    在循环中 使用"tokens=*"或可以处理带空格的文件名。将其替换为您想要运行的任何命令。"delims="FORECHO %%a
  • DIR /B
    使用命令/B上的开关DIR将使用裸格式,仅包括文件名。这是FINDSTR命令按我们想要的方式运行所必需的。
  • ^|
    |在循环的命令部分使用字符时, 转义该字符非常重要FOR。否则,您将收到语法错误,因为它认为您正在尝试将不完整的FOR循环导入到其他内容中。
  • FINDSTR /V /R "<...>"
    /V开关指示FINDSTR从列表中删除匹配项,并且该/R开关打开正则表达式模式。
  • [^\.]*\.[^\.]*\.[^\.]*$
    • [^\.]*将匹配不包含该字符的任何字符串.
    • \.将匹配该.字符。
    • $是“行尾”字符,这意味着这个正则表达式必须位于文件名末尾。这样我们就可以匹配文件名中含有任意数量句点的文件,例如test.vhost.exe.bak

进一步阅读

答案2

这应该有效:

dir *.exe /b | findstr /i ".*[^\.]*.*\.exe$"

换句话说:在 .exe 文件中查找不包含除 .exe 中的点之外的其他点的字符串

相关内容