我想创建一个脚本,从根位置 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 )
答案 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
命令取消管道左侧的剩余处理。