在诊断需要循环*.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
完全结尾的文件?
答案 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
)