批量循环通过“过滤”文件列表

时间:2014-03-17 11:01:51

标签: batch-file for-loop

我想迭代一个以.txt而不是.old.txt结尾的文件列表。
应该列出file1.txt,但不应该列出file4.old.txt。

我知道这用于迭代文件:

for /r .\logs %%G in (*.txt ) do (
    echo %%G
)

但是当我尝试添加if:

for /r .\logs %%G in (*.txt ) do (
    if x%%G:.old.txt=%==x%%G (
        echo %%G
    )
)

我得到:=G was unexpected at this time

我尝试将值分配给"正常"变量:

for /r .\logs %%G in (*.txt) do (
    set F=%%G

    if x%F:.old.txt=%==x%F% (
        echo %F%
    )
)

但无济于事,我只打印了几次文件......

有什么想法吗?谢谢!

3 个答案:

答案 0 :(得分:2)

for /f "Delims=" %%a in ('dir /s /b /a-d *.txt^|findstr /ive "\.old\.txt"') do echo %%a

答案 1 :(得分:1)

for /r .\logs %%G in (*.txt ) do (
    echo %%G|findstr /v /i /e /l ".old.txt"
    )
)

应该过滤掉那些文件名。

真正的问题无疑是“为什么我试过的代码没有像我预期的那样工作?”

第一次尝试时,不可能对元变量进行子串(例如。%%G

对于第二个,您需要使用delayed expansion才能在块中使用变量的更改值。在SO上有很多这种现象的例子 - 只需寻找delayed expansion

我建议的解决方案的工作方式是过滤%%Gfindstr的值,该值正在寻找/e - 结束的字符串,/i不区分大小写,/v NOT-matching /l提供了文字字符串。

答案 2 :(得分:1)

setlocal EnableDelayedExpansion

for /r .\logs %%G in (*.txt) do (
    set F=%%G
    if "!F:.old.txt=!" == "!F!" (
        echo !F!
    )
)