在dos中为dir命令设置Recursive-Depth
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在dos中为dir命令设置Recursive-Depth相关的知识,希望对你有一定的参考价值。
我目前正在使用以下命令列出一些目录:
dir /b /s /AD > c: empdir_list.txt
这给了我几乎所需的清单。但这是太多的数据,因为有些文件夹有很多子文件夹,我不希望在我的列表中看到。
是否有可能将命令的递归深度限制为-lets-3?
c:dir_1dir_2dir_3dir_foo
所以如果我在c:>中执行上面例子中的命令,我不想看到dir_foo目录,只看dir_n的目录......
也许没有批处理/ vb脚本?
我确信可以编写一个列出n级目录的复杂命令。但是很难记住语法和容易出错的情况。每次想要更改级别数时,还需要更改。
使用简单的脚本要好得多。
编辑5年后 - 实际上,有一个简单的一个衬垫,自Vista以来一直可用。 See my new ROBOCOPY solution.
这是一个执行深度优先列表的批处理解决方案。 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年),我刚刚在一个简单的命令行上偶然发现了一直可用的衬垫。自Vista以来,ROBOCOPY
一直是标准的Windows实用程序,可通过Windows资源工具包提供给XP。
robocopy . . /l /s /njh /njs /ns /lev:4 >c: empdir_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: empdir_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: empdir_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
要设置最低级别,请将其作为第3个参数提供。 例如:要从级别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 ...
中设置缩进字符
以上是关于在dos中为dir命令设置Recursive-Depth的主要内容,如果未能解决你的问题,请参考以下文章
常用DOS命令 color,dir,copy,shutdown,mkdir(md),rmdir(rd),attrib,cd