我有一个包含文件
file.txt
、file1.txt
和 file2.txt
的目录。我正在尝试编写一个仅处理最后两个的批处理文件。然而,当我说 for %%f in (file*.txt)
时,它会匹配所有 3 个。file?.txt
也是如此,考虑到 ?
通配符专门代表单个字符,这有点令人惊讶。
正确的写法是什么,所以我只会得到以
file
加上后面的内容,最后加上 .txt
的文件?
在几乎所有命令中,
*
代表无字符或多个字符,?
代表无字符或一个字符。然而,您可以通过使用内置实用程序来实现这一目标,该实用程序实际上使用 ?
来表示一个字符,where.exe
。
您可以将其与
for /f
循环一起使用来准确隔离您想要的内容:
@Echo Off
SetLocal EnableExtensions DisableDelayedExpansion
For /F "EOL=? Delims=" %%G In ('Set "PathExt=" ^& %SystemRoot%\System32\where.exe ".":"file?.txt"') Do Echo %%~nxG
EndLocal
在上面的脚本中,我对当前目录使用了相对的
.
,正如您自己的命令示例所暗示的那样。
使用
where.exe
具有匹配所有文件(包括隐藏文件和系统文件)、输出完整路径(在上述情况下 %%G
)以及完全匹配扩展名 .txt
(例如 Dir *.doc
)的额外好处
和 For %G In (*.doc) Do Echo %G
通常也会匹配 .docx
文件,因为匹配 8.3 命名模式)。