【发布时间】:2021-03-03 13:28:39
【问题描述】:
我正在运行一个遍历网络文件夹并保存找到的文件的脚本,但是运行时间太长。我已经尝试将 findstr 隔离到一个文件夹中并且它在正常的时间运行,所以我认为它与 FOR 循环有关。
@echo off
setlocal
set SERVERS=server1 server2 server3 server4
cls
echo Type below the query parameters:
set /p year=Year (4 digits):
set /p month=Month (2 digits):
set /p day=Day (2 digits):
set /p query=Query string:
cls
echo Results:
del /F /Q "C:\Users\%USERNAME%\Desktop\found_files\*" 2>nul
if not exist "C:\Users\%USERNAME%\Desktop\found_files" mkdir "C:\Users\%USERNAME%\Desktop\found_files"
for /f "tokens=*" %%a in ('for %%i in ^(%SERVERS%^) do @findstr /S /I /M /C:"%query%" "\\%%i\folder_structure\*%year%-%month%-%day%*.xml"') do copy /Y "%%a" "C:\Users\%USERNAME%\Desktop\found_files" >nul & echo %%a & set found=1
echo.
if "%found%"=="1" (
echo File^(s^) saved successfully!
) else (
echo No files found!
)
echo.
pause
if "%found%"=="1" explorer C:\Users\%USERNAME%\Desktop\found_files
【问题讨论】:
-
嵌套
for循环会减慢您的代码速度,但不一定达到您所经历的程度。我怀疑瓶颈来自访问 UNC 路径上的文件,临时将该路径安装为网络驱动器会加快速度,但我无法测试。 -
记住重定向和使用 echo 在每次迭代的基础上输出结果会大大减慢速度。
-
@T3RR0R - 在每次迭代中重定向到 nul 应该不会产生太大影响,因为它永远不会花费时间来打开文件。我在一个紧密的循环中测试了 10000 个
>nul重定向,只用了 1.6 秒,而在循环外重定向一次只用了 1.2 秒。这是一个区别,但可能无关紧要。使用>>"file"之类的东西时,迭代重定向变得非常慢,因为它必须重新打开文件并将文件重新定位到每次迭代的末尾。 -
@SomethingDark - 我一直认为将网络驱动器映射到 UNC 路径只不过是一种方便,或者是一种将路径与不理解 UNC 路径的命令一起使用的方法。我怀疑它会节省任何处理时间。但我想在尝试之前我们不会知道。映射 UNC 路径的最简单方法是使用
PUSHD。
标签: for-loop batch-file findstr unc