.exe
我有一个目录,其中包含一个需要使用 DIR 查找的单个文件。但是,同一目录中还有以 结尾的文件.vshost.exe
。我总是最终得到与我的*.exe
模式匹配的两个文件。
即目录包含test.exe
和test.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="
FOR
ECHO %%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 中的点之外的其他点的字符串