|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Случайный перебор по списку без повторения |
|
CMD/BAT - [решено] Случайный перебор по списку без повторения
|
Старожил Сообщения: 415 |
Профиль | Отправить PM | Цитировать Прошу помощи в оптимизации скрипта. Цель - выбрать все файлы из вложенных папок, подходящие под определённое условие (черный список\белый список) и запустить их в случайном порядке без повторений. В принципе задача довольно простая, и мною за десять минут был набросан приведённый ниже скрипт. Оттестировал на домашнем компьютере с папкой в пару сотен файлов, всё отлично работает. Но после запуска на довольно слабом по современным меркам компьютере и объеме файлов в ~16 тысяч столкнулся с заметными подвисаниями в пару десятков секунд перед переходом к следующему файлу. Собственно, проблема в функции :RebuildArray, которая каждый раз при запуске случайного файла, удаляет его из массива, генерируемого при старте скрипта. Думал над тем, как её ускорить - ничего не приходит в голову. Нужен именно батник, использование perl\python\чего-нибудь ещё - невозможно.
@Echo Off SetLocal EnableDelayedExpansion ::========Настройки======== :: Путь к рабочей директории, будут обработаны все файлы и поддиректории в ней Set BasePath=D:\Video\MLP :: Черный список - всё, что здесь перечислено, исключается из обработки. :: Проверяются пути и имена файлов или их части, каждое значение должно быть заключено в кавычки. Set BlackList=".ass" ".srt" :: Белый список - действует аналогично черному списку, но в обработку попадает лишь перечисленное. :: Белый список применяется ДО черного, но не отменяет его действие Set WhiteList="Season_1" "Season_2" "Season_3" :Main :: Запуск в случайном порядке без повторений всех найденных файлов (ассоциированной с этим файлом программой) Call :MakeArray||(Echo ERROR: No files found&Exit /B 1) For /L %%? In (1,1,%ArraySize%) Do ( Call :GetRandomElement||(Echo ERROR: No more files in the queue&Exit /B 1) Call Set "File=%%Array[!Selected!]%%" :: Вывод сообщения и запуск файла, переход на следующий после подтверждения CLS For /F "delims=" %%F In ("!File!") Do ( Echo. Echo Location: %%~dpF Echo File: %%~nxF Echo. ) Start "" "!File!" Echo Press any key to next file [%%?/%ArraySize%] Pause>nul Call :RebuildArray ) Exit /B :MakeArray :: Создаём массив из подходящих под условия файлов Set ArraySize=0 :: Подготовка к работе черного и белого списков For %%? In (Include Exclude) Do (Set %%?=) For %%L In ("Include:WhiteList:/I" "Exclude:BlackList:/V /I") Do For /F "tokens=1-3 delims=:" %%A In ("%%~L") Do ( If Not "!%%B!"=="" ( For %%W In (!%%B!) Do (Set %%A=!%%A! /C:"%%~W") Set "%%A=|FindStr %%C!%%A!" ) ) :: Построение массива For /F "delims=" %%F In ('Dir "!BasePath!" /A-D /B /S!Include!!Exclude!') Do ( Set /A ArraySize+=1 Set "Array[!ArraySize!]=%%F" ) If "!ArraySize!"=="0" Exit /B 1 Exit /B :GetRandomElement :: Если в массиве не осталось элементов, кидаем ошибку If %ArraySize% LEQ 0 Exit /B 1 :: Инициализируем ГПСЧ и получаем номер случайного элемента массива Echo !Random!!Random!>nul Set /A Selected=1+%ArraySize%*!Random!/32768 Exit /B :RebuildArray :: Пересобираем массив со сдвигом значений, исключая из него выбранный элемент Set Array[%Selected%]= For /L %%E In (%Selected%,1,%ArraySize%) Do ( :: Проверка на конечный элемент массива If "%Selected%"=="%ArraySize%" ( Set /A ArraySize-=1 Exit /B ) Set /A Next=%%E+1 Call Set Array[%%E]=%%Array[!Next!]%% ) Set /A ArraySize-=1 Exit /B |
|
Отправлено: 10:42, 22-01-2014 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата Anonymоus:
|
|
Отправлено: 11:06, 22-01-2014 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Старожил Сообщения: 415
|
Профиль | Отправить PM | Цитировать Цитата Iska:
|
|
Отправлено: 11:15, 22-01-2014 | #3 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Anonymоus, пробуйте (требуется установленный .Net Framework):
|
Отправлено: 05:06, 26-01-2014 | #4 |
Старожил Сообщения: 415
|
Профиль | Отправить PM | Цитировать Iska, благодарю за скрипт, протестировал на большом количестве файлов, по быстродействию намного быстрее батника. Правда, при тестировании всплыла проблема с кодировкой в путях с использованием кириллицы. На месседжбоксе перед запуском файла видно, что путь выглядит как "E:\HSA\„ў*з\2012\05\dump_ra.7z", соответственно после нажатия на "OK" получаю ошибку:
|
|
Отправлено: 14:23, 26-01-2014 | #5 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Попробуйте так:
|
Отправлено: 15:57, 26-01-2014 | #6 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
CMD/BAT - [решено] Перебор свободных IP по списку и выбор свободного | Debugger | Скриптовые языки администрирования Windows | 4 | 11-02-2012 17:42 | |
CMD/BAT - Перемещение файлов по списку | Arsenik77 | Скриптовые языки администрирования Windows | 4 | 04-12-2011 20:43 | |
Прочие БД - Извлечение файлов по списку | Aviator | Программирование и базы данных | 1 | 22-02-2011 02:44 | |
V. 5.5/2000/2003 - задача по списку рассылки | Yampo | Microsoft Exchange Server | 14 | 18-03-2010 10:11 | |
Перемещение по списку в Excel | Evita | Хочу все знать | 3 | 16-03-2006 01:13 |
|