以下是我使用的目录。
C:\test>dir /s /b /a:d
C:\test\A
C:\test\A\a
C:\test\A\b
C:\test\A\a\a
C:\test\A\a\b
C:\test\A\a\a\20160101
C:\test\A\a\a\20160816
C:\test\A\a\b\20160101
C:\test\A\a\b\20160816
C:\test\A\b\a
C:\test\A\b\b
C:\test\A\b\a\20160101
C:\test\A\b\a\20160816
C:\test\A\b\b\20160101
C:\test\A\b\b\20160816
使用dir /s /b /a:d
获取所有文件夹目录。
如何通过批处理文件将文件列表放在3层测试文件夹下?
我想得到以下列表:
C:\test\A
C:\test\A\a
C:\test\A\b
C:\test\A\a\a
C:\test\A\a\b
C:\test\A\b\a
C:\test\A\b\b
答案 0 :(得分:1)
@echo off
cls
for /f "delims=" %%I in ('dir /s /b /ad') do (
call :countAppr "%%~I"
)
exit /b
:countAppr
set "string=%~1"
set count=0
:again
set "oldstring=%string%"
set "string=%string:*\=%"
set /a count+=1
if not "%string%" == "%oldstring%" goto :again
if %count% leq 4 echo( %~1
exit /b
说明:
\
要在文件夹级别显示仅文件夹,请将leq
更改为equ
。深度也可以改变。
注意:部分脚本是根据Stephan的回答here复制和编辑的。
答案 1 :(得分:1)
一个简单的解决方案是使用robocopy
命令。虽然用于文件复制操作,但它包含/L
开关,请求不复制但要列表。调整开关以删除您可以使用的不需要的信息
robocopy . . /e /nfl /njh /njs /ns /lev:4 /l
这将递归(/e
)列出(/l
)当前文件夹下的所有选定元素,不显示文件信息(/nfl
),没有作业标题(/njh
),没有摘要(/njs
),没有文件/大小计数器(/ns
),用于深层搜索四个级别(当前文件夹加上下面三个必需级别)
robocopy
命令的输出包括行开头的一些制表符/空格。如果您需要删除它们,可以使用类似
for /f "tokens=*" %a in ('robocopy . . /e /nfl /njh /njs /ns /lev:4 /l') do echo %a
或者,从批处理文件
for /f "tokens=*" %%a in ('robocopy . . /e /nfl /njh /njs /ns /lev:4 /l') do echo %%a
已编辑如果robocopy
使用有问题(系统中不可用/不允许),或者您需要(来自评论)将输出限制为仅限最后一级,则可以使用像
@echo off
setlocal enableextensions disabledelayedexpansion
rem Retrieve folder from command line, default current folder
for /f "delims=" %%a in ("%~f1\.") do set "target=%%~fa"
echo ----------------------------------------------------------------------
rem Call subroutine searching for ALL folders up to 3 levels
call :treeDump target 3
echo ----------------------------------------------------------------------
rem Call subroutine searching for folders ONLY 3 levels deep
call :treeDump target 3 true
goto :eof
rem Recursive folder search
:treeDump targetVar maxLevel forceLevel
rem targetVar = name of variable containing the folder to iterate
rem maxLevel = how many levels to search under target
rem forceLevel = only show the last requested level
setlocal disabledelayedexpansion
rem Check we are not searching too deep
2>nul set /a "nextLevel=%~2-1", "1/(%~2+1)" || goto :eof
rem Retrieve folder to iterate
setlocal enabledelayedexpansion & for %%a in ("!%~1!") do endlocal & (
rem Determine if current level must be shown
if "%~3"=="" (
echo %%~fa
) else (
if %nextLevel% lss 0 echo %%~fa
)
rem If not at the last level, keep searching
if %nextLevel% geq 0 for /d %%b in ("%%~fa\*") do (
set "target=%%~fb"
call :treeDump target %nextLevel% "%~3"
)
)
goto :eof
它使用递归函数,迭代目录树。对于找到的每个文件夹,如果我们不在所需级别,则枚举子文件夹并为每个文件夹再次调用该函数。