【问题标题】:batch findstr to certain depth of subfolders批量 findstr 到特定深度的子文件夹
【发布时间】:2014-07-01 19:09:35
【问题描述】:

我有以下代码用于在子目录中搜索 2 个 exe 文件:

@echo off & setLocal EnableDELAYedeXpansion
for %%d in (c) do if exist %%d: (
for /f "delims=" %%a in ('dir/b/s/x %%d:\autolog.exe %%d:\autorun.exe 2^>nul ^| findstr /V /C:".*\.*\.*\.*\.*\.*\.*\.*\.*" /C:".*\.*\.*\.*\.*\.*\.*\.*" /C:".*\.*\.*\.*\.*\.*\.*" /C:".*\.*\.*\.*\.*\.*" /C:".*\.*\.*\.*\*"') do (
set var=%%a;!var!
))
echo %1,!var!, >>C:\test.txt
exit

虽然它可以搜索所有子文件夹(通过使用 /s),但我希望只有在 4 子文件夹级别(例如 c:\sf1\sf2\sf3\ autorun.exe 应该是一个有效的结果,而 c:\sf1\sf2\sf3\sf4\autorun.exe 和任何在树下的任何发现都应该被选择退出并且不作为结果返回)。

我使用所有通配符组合 (* | .| .*) 和 "\V" 来尝试实现它但失败了。为什么它不起作用,或者是否有其他更聪明的方法?

提前致谢

【问题讨论】:

    标签: batch-file


    【解决方案1】:

    这是一个限制到第四文件夹级别的示例,在 findstr 术语中使用正则表达式:

    @echo off
    for /f "delims=" %%a in ('dir /ad /b /s ^| findstr \\.*\\.*\\.*\\ ^| findstr /v \\.*\\.*\\.*\\.*\\') do echo %%a
    pause
    

    【讨论】:

    • 谢谢,代码仅显示所有第 4 级目录时有效,但实际上需要检查该目录中是否存在特定文件。我没有修改你的样本来做到这一点。对不起,如果这听起来很苛刻
    • 只是一个更新,我实际上创建了另一个 findstr 管道,它现在可以完美运行,谢谢。
    • 你也可以用dir "file.ext" /a-d /b /s代替dir /ad /b /s
    【解决方案2】:

    我受到this 答案的启发。 ROBOCOPY 从 Vista 开始可用,它是一个强大的实用程序,不仅可以复制文件。
    例如/L 开关阻止它复制;而/LEV 只允许您复制根目录的前N 级,这样就消除了一个FINDSTR

    打高尔夫球

    @echo off
    SETLOCAL EnableDelayedExpansion
    
    FOR /F "tokens=*" %%F in ('
    ROBOCOPY "C:\." "C:\." autolog.exe autorun.exe /S /LEV:4 /IS /L /NS /NC /NDL /NJH /NJS^|FINDSTR \\.*\\.*\\.*\\
    ') do set "var=%%~fF;!var!"
    echo %1,!var!,>>C:\test.txt
    

    格式化

    @echo off
    ====SETLOCAL EnableDelayedExpansion EnableExtensions
    
    
    set "list="
    set ^"FORCMD=^
     %__APPDIR__%ROBOCOPY.EXE C:\. C:\. autolog.exe autorun.exe^
         /S %=non-empty Subdirectories=%^
     /LEV:4 %=MAX 4 LEVels=%^
        /IS %=Include Same files=%^
         /L %=List only (don't copy)=%^
        /NS %=No Size=%^
        /NC %=No Class=%^
       /NDL %=No Directory List=%^
       /NJH %=No Job Header=%^
       /NJS %=No Job Summary=%^
    |%__APPDIR__%FINDSTR.EXE \\.*\\.*\\.*\\%=MIN 4 LEVels=%" It's convenient to use delayed expansion
    
    
    FOR /F "tokens=*" %%F in ('!FORCMD!') do set "var=%%~fF;!var!"
    ::Due to weird expansion rules
    ::if VAR was undefined, it is set to '~,-1'
    if DEFINED var set "var=!var:~,-1!" Remove trailing ;
    
    
    >>"C:\test.txt" echo(%1,!var!,
    

    【讨论】:

      猜你喜欢
      • 2013-03-01
      • 2013-01-21
      • 2018-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多