通配符以通过精确扩展获取文件

时间:2013-12-24 12:34:48

标签: batch-file command-line

在诊断需要循环*.log扩展名的文件的较大批处理脚本时,我发现了一个有趣的行为。在包含以下文件的示例目录中:

bar.log
foo.log
foo.log.ignore
foo.log.log-1676521099
not-related

...我的小测试脚本:

@echo off
setlocal enabledelayedexpansion
set DEF_LOG="C:\test\*.log"
for %%i in (%DEF_LOG%) do (
    echo %%i
)

...打印出来:

C:\test\bar.log
C:\test\foo.log
C:\test\foo.log.log-1676521099

深入挖掘,我发现了Windows通配符的设计方式:

C:\>dir "C:\test\*.log" /b
bar.log
foo.log
foo.log.log-1676521099

我的问题是:如何列出所有以.log 完全结尾的文件?

3 个答案:

答案 0 :(得分:5)

最简单快捷的方法是使用您的扩展程序测试修饰符%% ~x。

@echo off&cls
for /f "delims=" %%a in ('dir /b') do if /i "%%~xa"==".log" echo %%a
pause

答案 1 :(得分:3)

行为的来源是短文件名。除非禁用,否则将为超过旧8.3格式的文件名分配一个与8.3格式匹配的短名称。如果扩展名超过3个字符,则短名称将包含长名称扩展名的前3个字符。执行dir /x "C:\test\*.log"以查看短名称。

在查找匹配项时,所有命令都会测试长名称和短名称。

获得所需结果的常用方法是使用DIR / B管道传输到FINDSTR。请注意,在扩展FOR变量时应避免使用延迟扩展,因为这会破坏包含!的值。 !字符可能出现在文件名中。

@echo off
pushd "C:\test"
for /f "eol=: delims=" %%F in ('dir *.log^|findstr /lie ".log"') do echo %%~fF
popd

答案 2 :(得分:2)

使用内部循环检查仅获取具有所需扩展名的文件

@echo off
setlocal enabledelayedexpansion

rem set desired extension for additional filter
set extn=.log
set DEF_LOG="C:\temp\*.log"

for %%i in (%DEF_LOG%) do (
    rem if file extension is equal to our ext
    if "%%~xi"=="%extn%" echo %%i
)