在dos中为dir命令设置Recursive-Depth

Sauer 14 windows directory recursion cmd directory-structure

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

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

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

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

c:\dir_1\dir_2\dir_3\dir_foo

所以,如果我在上面的例子在C执行命令:"我不希望看到的dir_foo目录,但只是dir_n的...

也许没有批处理/ vb脚本?

dbenham.. 20

我确信可以编写一个列出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

  • 好极了!效果很好.但是有一个小"虫子".如果它涉及一个文件夹,系统不允许访问,它会上升到一个目录并使用旧列表在那里工作.但我不在乎!不管怎么说,还是要谢谢你!这正是我想要的! (2认同)

dbenham.. 9

经过所有这段时间(5年),我刚刚在一个简单的命令行上偶然发现了一直可用的衬垫.ROBOCOPY自Vista以来一直是标准的Windows实用程序,可通过Windows资源工具包提供给XP.

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

说明

    /L :: List only - don't copy, timestamp or delete any files.
    /S :: copy Subdirectories, but not empty ones.
  /NJH :: No Job Header.
  /NJS :: No Job Summary.
   /NS :: No Size - don't log file sizes.
/LEV:n :: only copy the top n LEVels of the source directory tree.

/lev:n选项包括计数中的根,并且您需要3个子目录级别,这就是我为该值添加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

但是命令变得有点笨拙.将此技术合并到一个实用程序批处理文件中应该很容易,该文件将根路径和级别作为参数.如果将命令放在批处理脚本中,则必须记住将百分比加倍.