在批处理中查找文件名的两个字符串

时间:2015-03-07 07:46:36

标签: batch-file for-loop

这应该很简单..但是,我没有得到它..

SETLOCAL ENABLEDELAYEDEXPANSION
FOR /r "D:\12" %%X IN (*) DO (
    FOR /F %%G IN (%%~nxX) DO for %%P in (server.sams.log* server.tims.log*) do ECHO %%P
)
ENDLOCAL

所以,我想要查找的是文件名中包含sams或tims的任何文件,但忽略文件夹中的任何其他文件。

而且,是的,我知道我可以做以下事情。

FOR /r "D:\12" %%X IN (server.sams* server.tims*) DO (...

但我还有其他要比较的文件名..

我还考虑过做一个比较部分字符串,但似乎也没有工作..是的,它似乎只是单独使用sams或tims而且我试图使用GEQ,LSS等的各种组合来没有成功。 https://superuser.com/questions/541575/comparing-part-of-a-filename-in-a-windows-batch-file

感谢。

2 个答案:

答案 0 :(得分:1)

如果要测试文件是否包含可能列表中的子字符串,最简单的方法是将findstrconditional execution一起使用。

SETLOCAL
FOR /r "D:\12" %%X IN (*) DO (
    findstr /i "sams tims bobs jims steves" "%%X" >NUL && (
        echo %%X: Match found!
    ) || (
        echo %%X: No match.
    )
)

或者,甚至更简单,您可以完全消除所有for循环,只需使用findstr /s /i "sams tims etc" *

无论如何,您当前的代码无效,因为您的for %%P循环只是回显。它实际上并没有比较任何东西。如果您更喜欢使用嵌套循环来检查文件名中是否存在每个子字符串,请将代码更改为:

SETLOCAL ENABLEDELAYEDEXPANSION
FOR /r "D:\12" %%X IN (*) DO (
    FOR /F %%G IN (%%~nxX) DO (
        set "line=%%X"
        for %%P in (server.sams.log server.tims.log) do (
            if /i not "!line!"=="!line:%%P=!" (
                ECHO %%P
            )
        )
    )
)
ENDLOCAL

答案 1 :(得分:0)

@rojo - 我们甚至不需要额外的%% G“FOR”循环,因为这可以正常工作。

SETLOCAL ENABLEDELAYEDEXPANSION
FOR /r "D:\12" %%X IN (*) DO (
    Set FileName=%%~nxX
    for %%P in (sams tims) do (
        if /i not "!FileName!"=="!FileName:%%P=!" (
                    ECHO %%P "!FileName!"
        )
    )
)
ENDLOCAL

你当然可以用%% G替换%% P,但你不需要两个..:)

对此有用的是,你可以做多个这些,例如:

SETLOCAL ENABLEDELAYEDEXPANSION
FOR /r "D:\12" %%X IN (*) DO (
    Set FileName=%%~nxX
    for %%P in (sams tims) do (
        if /i not "!FileName!"=="!FileName:%%P=!" (
                    ECHO %%P "!FileName!"
        )
    for %%P in (jims johns) do (
        if /i not "!FileName!"=="!FileName:%%P=!" (
                    ECHO %%P "!FileName!"
        )
    )
)
ENDLOCAL

感谢您帮助我指出正确的方向!!