2

Я пытаюсь выполнить поиск по сетевому пути в папке из 152 000 документов, список файлов для поиска - 1500, через 5 часов было найдено только 50 документов.

Этот сценарий был написан другим пользователем, который помог мне. Я пытаюсь увидеть, есть ли способ ускорить его:

@echo off
for /f "usebackq delims=" %%a in ("C:\cleanup\addr.txt") do (
for /r "Z:\Attachments\PDF\" %%b in ("%%a*") do xcopy "%%b" "C:\cleanup\XMLFix\%%~pb" /s
)
pause

Я думаю, что этот скрипт берет первое имя файла, просматривая 152 000 документов, пока не находит совпадения, а затем снова ищет 152 000 документов для второго документа и так далее.

Можно ли записать его так, чтобы он содержал все имена файлов в буфере и просто просматривал 152 000 документов один раз?

2 ответа2

2

Это не проверено, но я думаю, что это будет работать, и это должно быть относительно быстро. Исходя из того, что ваш текущий метод занимает ~ 6 минут на файл, я предсказываю, что этот метод должен занять менее 10 минут, чтобы закончить. Он читает всю иерархию папок только один раз, а затем проверяет результат по всем записям addr.txt за один проход.

@echo off
pushd "c:\cleanup"

:: Prepare addr.txt to be used as /g option for FINDSTR
(for /f "usebackq delims=" %%F in ("addr.txt") do echo \\%%~nxF) >addr.txt.mod

:: Get a list of full paths to all files in hierarchy
dir /b /a-d /s "z:\attachments\pdf\*" >files.txt

:: Match files in files.txt against files in addr.txt.mod
for /f "delims=" %%F in ('findstr /ileg:addr.txt.mod files.txt') do (
  REM %%F contains the full path of a matching file
  xcopy "%%F" "C:\cleanup\XMLFix%%~pF"
)

:: Delete temp files
del addr.txt.mod files.txt

popd
0

Это действительно будет очень медленно с набором циклов for по той единственной причине, что даже когда он найдет файл, он продолжит поиск этого же файла в остальных 152000 документах. Таким образом, время потрачено 1500x152000.

VBScript может сделать это намного быстрее, потому что тогда вы можете выйти из цикла.

Целое может быть оптимизировано, даже если список файлов можно сузить до разделов, где он не будет искать все, если вы заранее знаете, что файлы не будут находиться в определенном месте, но это может быть необязательно.

Наконец, учитывая, что выполнение этого по сети невероятно замедлит работу, было бы неплохо скопировать все 152000 документов локально и выполнить поиск и копирование в них.

Если вы пишете VBScript и вам нужно выполнить это по сети, убедитесь, что VBScript редактирует список файлов и удаляет все файлы из списка, который он уже нашел. Это гарантирует, что вы можете остановить скрипт в любое время и продолжить позже.

Хотя SuperUser не является сервисом написания скриптов, я помогу вам дать то, какие команды вам понадобятся:

' Copy files to...
sDestination = "c:\some\path"

' get filenames in folder
sPath = "c:\some\path"
Set fso = createobject("Scripting.FileSystemObject")
Set oFolderContent = fso.GetFolder(sPath)

' open textfile and read its content
set oFileList = fso.OpenTextFile(sFilename, 8, false)

' Loop to go through all files in a folder
For Each oFile In oFolderContent.files
' Loop to go through all folders in a folder
For Each oFile In oFolderContent.folders

'break out of a for loop
exit for

'copy a file
fso.CopyFile oFile, sDestination

Если это слишком сложно, я предлагаю получить помощь в переполнении стека.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .