1

在 Windows Command Shell 中,如何获得 FOR 循环或 DIR 命令以匹配提供的文件扩展名模式?或者换一种说法,如何进行非贪心扩展匹配?

比如一个目录包含floo.tif, floorbar.tiff,floormatic.tifw我只想操作floo.tif

for %%a in (floo*.tif) do @echo %%a

结果是:

floo.tif
floorbar.tiff
floormatic.tifw

这是期望的结果:

floo.tif

dir *.tif有相同的结果。

4

4 回答 4

2

我想到的是:

dir /b | findstr /i "^floo.*\.tif$"

或者

dir /b floo*.tif | findstr /i "tif$"

两者都将阻止匹配 .tiff 和 .tifw,从而为您提供预期的结果。

的正则表达式词汇量findstr非常有限。例如,您无法\w匹配单词字符,并且(foo|bar|baz)不支持表示法。但至少它提供了比标准通配符匹配更精细的控制。执行findstr /?以查看支持的语法。

for /f "delims=:" %%I in ('dir /b floo*.tif ^| findstr /i "tif$"') do (
    rem process each %%I match
)
于 2013-01-25T02:46:51.363 回答
1
for /f "eol=: delims=" %%a in (
  'dir /b /a-d floo*.tif^|findstr /ix "floo.*\.tif"'
) do echo %%a
于 2013-01-25T02:10:43.347 回答
1

我有一个 Win32 命令行实用程序,用于查找我很久以前编写的文件名,并且由于它与长文件名匹配,因此不会遇到该问题: vfind.exe。(源代码也可用于它。)

我这样使用它:

for /f "delims=" %%i in ('vfind floo*.tif') do @echo %%a
于 2013-01-25T00:54:06.870 回答
1

这就是我最终为手头的项目所做的,不过下次我会考虑使用@dbenham 和@rojo 推荐的@Loadmaster 的vfind 或findstr。

for %%a in (*.tif) do (
  if /i "%%~xa"==".tif" @echo Doing something to %%a...
  )

优点if是不需要运行任何其他程序,因此它更快,更紧凑,更容易在以后进行心理解码。vfind 的优点是它完全直接和清晰,而 findstr 在模式匹配中提供了更多的控制。

于 2013-01-25T20:26:24.080 回答