如何通过批处理文件获取特殊目录列表?

时间:2017-08-17 06:53:21

标签: batch-file directory

以下是我使用的目录。

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

2 个答案:

答案 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

说明:

  • 循环文件
  • 计算文件夹名称
  • 中显示的金额\
  • 如果小于或等于4,则返回文件夹名称

要在文件夹级别显示文件夹,请将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

它使用递归函数,迭代目录树。对于找到的每个文件夹,如果我们不在所需级别,则枚举子文件夹并为每个文件夹再次调用该函数。