设置递归深度在DOS中的dir命令(Set Recursive-Depth for dir comm

2019-07-31 16:40发布

我目前使用下面的命令列出一些目录:

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脚本?

Answer 1:

我敢肯定,这是可以编写一个复杂的命令将列出目录的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

广度第一个版本几乎是一样的,只不过它需要循环的额外费用。

@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


Answer 2:

这么长的时间(5年)后,我刚才简单的命令行上跌倒一个衬里,其已经可以一直。 ROBOCOPY一直因为Vista中的一个标准的Windows实用程序,可用于XP通过Windows资源工具包。

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

但该命令变得有点笨拙的打字。 它应该很容易将这一技术引入实用批处理文件,需要根路径和水平作为参数。 你必须记住,如果你把一个批处理脚本中的命令的百分比的两倍。



Answer 3:

这是一种基于@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


Answer 4:

这是对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 ...



文章来源: Set Recursive-Depth for dir command in dos