批处理脚本 - 从根位置开始快速递归查找第一个文件夹

时间:2017-04-04 12:54:19

标签: batch-file

我想创建一个脚本,从根位置 D:\ 开始,尽快找到名为目标的第一个文件夹并返回其绝对路径。

根位置(D:\)的文件夹结构可以是这样的:

-DontSearchHereFolder

-Folder1 \ Subfolder1 \ SSubfolder1 \ SSSubfolder1 \

-Folder2 \ Subfolder2 \ SSubfolder2 \的 TargetFolder

-DontSearchHereFolder2

-Folder3 \ Subfolder3 \

脚本输出应为: D:\ Folder2 \ Subfolder2 \ SSubfolder2 \ TargetFolder

现在我尝试了2种方法,但速度不够快:

(1)

jQuery(fucntion(e){
    jQuery('a[target]').each(function(index, element) {
       var targetLink= jQuery(this).attr('target');
       alert(targetLink);
       var newIframe=jQuery('<iframe src="" width="400" height="auto" name='+targetLink+' frameborder="0"></iframe>')
        newIframe.appendTo(jQuery('div#myMain'));
    });

(2)

set TG=\TargetFolder
set root=D:\
cd %root%

for  /f "delims=" %%a in ('dir /b /s /a:d "%root%" ^|findstr /e /i "%TG%"') do set "folderpath=%%~a"

(1)比(2)

更快

问题1:是否可以在命令中指定仅从根目录“向下”搜索最多2个文件夹(例如D:\ Folder1 \ Subfolder1 )?

问题2:是否可以指定应自动跳过的文件夹(例如DontSearchHereFolder1&amp; 2

3 个答案:

答案 0 :(得分:1)

此批次代码完全符合您要求针对速度进行优化的要求。它会忽略第一级上的两个指定目录,并且会搜索最大两个文件夹级别的文件夹。

@echo off
setlocal EnableExtensions DisableDelayedExpansion

set "Root=D:"
set "TG=TargetFolder"
set "Ignore1=DontSearchHereFolder"
set "Ignore2=DontSearchHereFolder2"

for /D %%A in ("%Root%\*") do (
    if "%%~nxA" == "%TG%" set "FolderPath=%%A" & goto Found
    if not "%%~nxA" == "%Ignore1%" (
       if not "%%~nxA" == "%Ignore2%" (
           for /D %%B in ("%%A\*") do (
               if "%%~nxB" == "%TG%" set "FolderPath=%%B" & goto Found
               for /D %%C in ("%%B\*") do if "%%~nxC" == "%TG%" set "FolderPath=%%C" & goto Found
            )
        )
    )
)
echo Could not find folder: "%TG%"
goto EndSearch

:Found
echo Found folder: "%FolderPath%"

:EndSearch
endlocal

字符串比较以区分大小写的方式实现最大速度。

不使用递归子例程调用,因为通常会为此类任务执行最大速度。

根文件夹中要忽略的目录的比较是以批处理脚本编码的,而不是使用数组或文件夹名称列表来获得最大速度。

延迟扩展不用于更快地处理命令行。

但更快的是在C / C ++ / C#中为该任务编写可执行文件,因为处理批处理文件的命令行很可能是搜索文件夹的最多时间。

注意:命令 FOR 会忽略隐藏属性设置的文件夹。

好吧,我用于这样的任务共享软件工具Total Commander,它支持仅在选定的文件夹中搜索特定文件夹,速度不超过X级别。

答案 1 :(得分:0)

这应该考虑到问题中指出的所有限制,但除非在指定的排除项中找到很多文件夹,否则我认为这应该更快,只是试一试

@echo off
    setlocal enableextensions disabledelayedexpansion

    set "source=d:\"
    set "target=TargetFolder"
    set "maxLevels=2"
    set excludeFolders= "DontSearchHereFolder" "DontSearchHereFolder2"

    for %%s in ("%source%") do for /f "tokens=*" %%f in ('
        robocopy "%%~fs." "%%~fs." /l /nfl /njh /njs /nc /ns /s
            /xd %excludeFolders% /lev:%maxLevels%
        ^| findstr /e /i /l /c:"\\%target%\\"
        ^| cmd /v /q /c"set /p .= &&(echo(!.!)"
    ') do echo "%%~f"

答案 2 :(得分:0)

我认为这是最快的方法:

@echo off
setlocal EnableDelayedExpansion
if "%1" neq "" goto %1

set "root=D:\"
set "TG=TargetFolder"
set "exclude=/DontSearchHereFolder1/DontSearchHereFolder2/"

"%~F0" Input | "%~F0" Output > result.txt
set /P "folderpath=" < result.txt
del result.txt
echo First folder: %folderpath%
goto :EOF


:Input
cd "%root%"
for /D %%a in (*) do if "!exclude:/%%a/=!" equ "%exclude%" (
   cd "%%a"
   dir /B /S /A:D "%TG%" 2>NUL
   cd ..
)
exit /B


:Output
set /P "folder="
echo "%folder%"
set "i=0"
for /F "tokens=2" %%a in ('tasklist /FI "IMAGENAME eq cmd.exe" /FO TABLE /NH') do (
   set /A i+=1
   if !i! equ 2 taskkill /PID %%a /F
)
exit /B

要排除的文件夹以斜杠分隔列表形式给出;如果此列表较长,则进程运行得更快,因为会跳过更多文件夹。目标文件夹通过dir /B /S /AD "%TG%"命令在每个非排除文件夹中搜索,这比其他命令的任何组合都要快。一旦在管道的管道侧收到第一个文件夹名称,该过程就结束;通过taskkill命令取消管道左侧的剩余处理。