How to traverse folder tree/subtrees in a windows batch file?

前端 未结 4 1015
刺人心
刺人心 2020-12-31 05:12

In a windows batch file, is there a way to traverse a folder/subfolders hierarchy doing some action on each file?

相关标签:
4条回答
  • 2020-12-31 05:12

    You can use the FOR command with the /r switch, which will walk the directory tree executing whatever you specify in the DO statement on each directory. There you can nest another FOR statement, using a dir /b *.* in the SET block.

    0 讨论(0)
  • 2020-12-31 05:30

    Yes, you can do this using the for command with the /r switch, e.g.:

    for /r %%f in (*) do echo %%f
    

    See also this question for an example.

    0 讨论(0)
  • 2020-12-31 05:39

    Fortunately I have quite similar purpose regarding this thread. I believe INSTRUCTION

    dir /b /s /ad *.* [enter]
    

    will produce DIRECTORY TREE as result

    complete_path\dir_01_lev_01
    complete_path\dir_02_lev_01
    complete_path\dir_03_lev_01
    complete_path\dir_01_lev_01\dir_11_lev_02
    complete_path\dir_01_lev_01\dir_12_lev_02
    complete_path\dir_02_lev_01\dir_13_lev_02
    complete_path\dir_02_lev_01\dir_14_lev_02
    complete_path\dir_02_lev_01\dir_15_lev_02
    complete_path\dir_03_lev_01\dir_16_lev_02
    

    But I want result as below

    complete_path\dir_01_lev_01
    complete_path\dir_01_lev_01\dir_11_lev_02
    complete_path\dir_01_lev_01\dir_12_lev_02
    complete_path\dir_02_lev_01
    complete_path\dir_02_lev_01\dir_13_lev_02
    complete_path\dir_02_lev_01\dir_14_lev_02
    complete_path\dir_02_lev_01\dir_15_lev_02
    complete_path\dir_03_lev_01
    complete_path\dir_03_lev_01\dir_16_lev_02
    

    So, this SCRIPT is BORN :)

    @echo off
    rem
    rem ::: My name is Tree-Folder-8-Level.cmd
    rem
    setlocal
    rem ::: Put started PATH here
    set i01=complete_path
    for /f "delims=" %%a in ('dir "%i01%" /ad /on /b') do call :p001 "%%a"
    endlocal
    goto :eof
    
    :p001
    rem ::: Display 1st LEVEL of started PATH
    echo %~1
    for /f "delims=" %%b in ('dir "%i01%\%~1" /ad /on /b') do call :p002 "%~1\%%b"
    goto :eof
    
    :p002
    rem ::: Display 2nd LEVEL of started PATH
    echo %~1
    for /f "delims=" %%c in ('dir "%i01%\%~1" /ad /on /b') do call :p003 "%~1\%%c"
    goto :eof
    
    :p003
    rem ::: Display 3rd LEVEL of started PATH
    echo %~1
    for /f "delims=" %%d in ('dir "%i01%\%~1" /ad /on /b') do call :p004 "%~1\%%d"
    goto :eof
    
    :p004
    rem ::: Display 4th LEVEL of started PATH
    echo %~1
    for /f "delims=" %%e in ('dir "%i01%\%~1" /ad /on /b') do call :p005 "%~1\%%e"
    goto :eof
    
    :p005
    rem ::: Display 5th LEVEL of started PATH
    echo %~1
    for /f "delims=" %%f in ('dir "%i01%\%~1" /ad /on /b') do call :p006 "%~1\%%f"
    goto :eof
    
    :p006
    rem ::: Display 6th LEVEL of started PATH
    echo %~1
    for /f "delims=" %%g in ('dir "%i01%\%~1" /ad /on /b') do call :p007 "%~1\%%g"
    goto :eof
    
    :p007
    rem ::: Display 7th LEVEL of started PATH
    rem :::     and 8th LEVEL of started PATH
    echo %~1
    for /f "delims=" %%h in ('dir "%i01%\%~1" /ad /on /b') do echo %~1\%%h
    goto :eof
    

    Brighter ideas are welcome. :)

    0 讨论(0)
  • 2020-12-31 05:39
    dir /b /s /ad *.* | sort
    

    That should give the same results regardless of the path depth

    0 讨论(0)
提交回复
热议问题