在dos中为dir命令设置recursion深度

我正在使用以下命令列出一些目录:

dir /b /s /AD > c:\temp\dir_list.txt 

这给了我几乎所需的清单。 但数据太多了,因为一些文件夹有很多子文件夹,我不想在我的列表中看到。

是否有可能将命令的recursion深度限制为-lets say-3?

 c:\dir_1\dir_2\dir_3\dir_foo 

所以如果我在上面的例子中执行命令c:>我不想看到dir_foo目录,但只是dir_n的…

也许没有一个批处理/ VB脚本?

Solutions Collecting From Web of "在dos中为dir命令设置recursion深度"

我相信有可能写一个复杂的命令,列出n级目录。 但是很难记住语法和错误。 每次你想改变层数时,也需要改变。

使用一个简单的脚本更好。

编辑5年后 – 其实,有一个简单的班轮,自Vista以来已经可用。 看到我的新ROBOCOPY解决方案。

这是执行深度优先列表的批处理解决方案。 DIR / S命令执行广度优先列表,但我更喜欢深度优先格式。

 @echo off setlocal set currentLevel=0 set maxLevel=%2 if not defined maxLevel set maxLevel=1 :procFolder pushd %1 2>nul || exit /b if %currentLevel% lss %maxLevel% ( for /d %%F in (*) do ( echo %%~fF set /a currentLevel+=1 call :procFolder "%%F" set /a currentLevel-=1 ) ) popd 

宽度的第一个版本几乎是相同的,除了它需要一个额外的FOR循环。

 @echo off setlocal set currentLevel=0 set maxLevel=%2 if not defined maxLevel set maxLevel=1 :procFolder pushd %1 2>nul || exit /b if %currentLevel% lss %maxLevel% ( for /d %%F in (*) do echo %%~fF for /d %%F in (*) do ( set /a currentLevel+=1 call :procFolder "%%F" set /a currentLevel-=1 ) ) popd 

两个脚本都需要两个参数:

arg1 =要列出的根目录的路径

arg2 =要列出的级别数量。

所以要列出当前目录的3个级别,你可以使用

 listDirs.bat . 3 

要列出不同目录的5个级别,可以使用

 listDirs.bat "d:\my folder\" 5 

毕竟这段时间(5年),而我现在正绊倒在一个简单的命令行上,一直是可用的。 ROBOCOPY自Vista以来一直是标准的Windows实用程序,可通过Windows资源工具包使用到XP。

 robocopy . . /l /s /njh /njs /ns /lev:4 >c:\temp\dir_list.txt 

/lev:n选项包括计数中的根,并且您需要3个子目录级别,这就是为什么我将1加1的值。

输出并不完美,因为根文件夹包含在输出中,每个路径包含固定宽度的前导空白。 您可以方便地使用FOR /F来消除根路径以及主要的空白。

 (for /f "skip=2 tokens=*" %A in ('robocopy . . /l /s /njh /njs /ns /lev:4') do @echo %A) >c:\temp\dir_list.txt 

ROBOCOPY输出包含一个初始空白行,这就是为什么skip必须是2而不是1。

每个路径将以\结尾。 我喜欢这个功能,因为它显而易见,我们列出了文件夹而不是文件。 如果你真的想消除尾随\ ,那么你可以添加一个额外的FOR

 (for /f "skip=2 tokens=*" %A in ('robocopy . . /l /s /njh /njs /ns /lev:4') do @for %B in ("%A.") do @echo %~fB) >c:\temp\dir_list.txt 

但是这个命令正在变得有点笨拙。 应该很容易将这种技术结合到一个实用批处理文件中,该文件将根路径和层次作为参数。 如果将该命令放入批处理脚本中,则必须记住加倍百分比。

这是一个基于@dbenham深度优先解决方案的解决方案,
并能够设定最低水平

 @echo off setlocal set currentLevel=0 set maxLevel=%2 if not defined maxLevel set maxLevel=1 set minLevel=%3 if not defined minLevel set minLevel=0 :procFolder pushd %1 2>nul || exit /b if %currentLevel% lss %maxLevel% ( for /d %%F in (*) do ( if %currentLevel% geq %minLevel% echo %%~FF set /a currentLevel+=1 call :procFolder "%%F" set /a currentLevel-=1 ) ) popd 

要设置最低等级,只需提供它作为第三个参数。
例如:要从第2级到第5级列出,您可以使用

 listDirs.bat target_path 5 2 

或者,您可以通过将此参数保留为空来从基本级别列出

 listDirs.bat target_path 5 

这是dbenham(和elady)的解决方案的一个小小的增强。 它根据深度缩进输出。 它显着提高了可读性

 @echo off setlocal set currentLevel=0 set maxLevel=%2 if not defined maxLevel set maxLevel=1 set minLevel=%3 if not defined minLevel set minLevel=0 :procFolder pushd %1 2>nul || exit /b set "indent=." if %currentLevel% lss %maxLevel% ( for /d %%F in (*) do ( for /l %%i in (1,1,%currentLevel%) do echo|set /p=%indent% if %currentLevel% geq %minLevel% echo %%~fF set /a currentLevel+=1 call :procFolder "%%F" set /a currentLevel-=1 ) ) popd 

人们可以设置缩进字符set "indent ...