Batch file 批处理脚本-从根位置开始快速递归查找第一个文件夹
我想制作一个脚本,从根位置D:\开始,尽快找到名为Target的第一个文件夹,并返回其绝对路径 根位置(D:\)的文件夹结构可以如下所示: -DontSearchhere文件夹 -文件夹1\s子文件夹1\s子文件夹1\s子文件夹1\ -Folder2\Subfolder2\SSubfolder2\TargetFolder -不要在此处折叠2 -文件夹3\子文件夹3\ 脚本的输出应为:D:\Folder2\Subfolder2\SSubfolder2\TargetFolder 目前我尝试了两种方法,但速度不够快: (1) (2) (1)比(2)快 问题1:是否可以在命令中指定从根目录(例如D:\Folder1\Subfolder1)最多搜索2个文件夹Batch file 批处理脚本-从根位置开始快速递归查找第一个文件夹,batch-file,Batch File,我想制作一个脚本,从根位置D:\开始,尽快找到名为Target的第一个文件夹,并返回其绝对路径 根位置(D:\)的文件夹结构可以如下所示: -DontSearchhere文件夹 -文件夹1\s子文件夹1\s子文件夹1\s子文件夹1\ -Folder2\Subfolder2\SSubfolder2\TargetFolder -不要在此处折叠2 -文件夹3\子文件夹3\ 脚本的输出应为:D:\Folder2\Subfolder2\SSubfolder2\TargetFolder 目前我尝试了两种方法
问题2:是否可以指定应自动跳过的文件夹(例如DontSearchHereFolder1和2)这应考虑问题中指出的所有限制,但除非在指定的排除项中找到大量文件夹,否则我不认为这应该更快,请尝试一下
@echo关闭
setlocal enableextensions disabledelayedexpansion
设置“source=d:\”
设置“target=TargetFolder”
设置“MaxLevel=2”
set excludeFolders=“DontSearchHereFolder”“DontSearchHereFolder2”
对于在(“%source%”中的%%s,请执行for/f“令牌=*”%%f在(“%source%”)中
机器人副本“%%~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(!)”
“)执行回显“%%~f”
此批处理代码正是您所要求的优化速度的批处理代码。它会忽略第一级上的两个指定目录,并搜索两个文件夹级别最深的文件夹
@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级的特定文件夹,速度极快。我认为这是最快的方法:
@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
@echo关闭
setlocal EnableDelayedExpansion
如果“%1”neq“转到%1
设置“root=D:\”
设置“TG=TargetFolder”
设置“排除=/DontSearcherFolder1/DontSearcherFolder2/”
“%$F0”输入|“%$F0”输出>结果.txt
设置/P“folderpath=“NUL
光盘
)
退出/B
:输出
设置/P“文件夹=”
回显“%folder%”
设置“i=0”
对于('tasklist/FI“IMAGENAME eq cmd.exe”/FO TABLE/NH')中的/F“tokens=2”%%a,请执行以下操作(
设置/A i+=1
if!i!eq 2任务终止/PID%%a/F
)
退出/B
要排除的文件夹在斜杠分隔的列表中给出;如果此列表较长,则进程运行更快,因为跳过了更多文件夹。目标文件夹通过
dir/B/S/AD“%TG%”在每个未排除的文件夹中搜索
命令,这比任何其他命令的组合都要快。当管道右侧收到第一个文件夹名称时,该过程即告结束;管道左侧的剩余处理将通过taskkill
命令取消。您的解决方案效果很好!比我的解决方案快得多。谢谢!
@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
@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