我目前使用下面的命令列出一些目录:
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脚本?
我目前使用下面的命令列出一些目录:
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脚本?
我敢肯定,这是可以编写一个复杂的命令将列出目录的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
这么长的时间(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
但该命令变得有点笨拙的打字。 它应该很容易将这一技术引入实用批处理文件,需要根路径和水平作为参数。 你必须记住,如果你把一个批处理脚本中的命令的百分比的两倍。
这是一种基于@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 ...