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

Álv*_*lez 4 command-line batch-file

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

bar.log
foo.log
foo.log.ignore
foo.log.log-1676521099
not-related
Run Code Online (Sandbox Code Playgroud)

...我的小测试脚本:

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

...打印这个:

C:\test\bar.log
C:\test\foo.log
C:\test\foo.log.log-1676521099
Run Code Online (Sandbox Code Playgroud)

深入挖掘,我发现Windows的通配符是如何设计的:

C:\>dir "C:\test\*.log" /b
bar.log
foo.log
foo.log.log-1676521099
Run Code Online (Sandbox Code Playgroud)

我的问题是:我怎么能列出结尾的文件究竟.log

Sac*_*Dee 5

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

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


dbe*_*ham 3

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

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

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

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