Страница 1 из 2
Запуск из батника опции поиска файлов по файл-списку
Добавлено: Вс июл 22, 2018 22:27
BeardFury78
Есть некий батник. В конце результата создается файл со списком путей файлов (а именно g:\result.txt). Нужно добавить в конце батника команду чтобы открывался Total Commander и запустил поиск по файлу чтобы в результате вывелись файлы по списку путей. Возможно ли и как?
Добавлено: Вс июл 22, 2018 22:55
Flasher
BeardFury78
А зачем? Что в батнике? У нас есть топики по теме (
1,
2,
3 и т. д.).
Создаётся шаблон
FileList c @<путь к списку> для поля "Место поиска:".
Строка запуска из батника: TOTALCMD.EXE /S=F:L
FileList
Но лучше из vbs, чтобы запустить поиск с выводом на панель, предварительно сделав
это:
Код: Выделить всё
With CreateObject("WScript.Shell")
PID = .Exec("%COMMANDER_EXE% /S=F:LFileList").ProcessID
Do: A = .AppActivate(PID) :Loop Until A : .SendKeys "~%-"
End With
Добавлено: Пн июл 23, 2018 06:36
BeardFury78
Flasher
В батнике такой скрипт
Код: Выделить всё
del /s g:\result.txt
split -l 8500 -a 4 g:\patterns.txt
for %%f in (g:\x????) do (
grep -if %%f g:\paths.txt >> g:\result.txt
)
del /s g:\x????
Просто нужно время от времени запускать поиск по определенному файлу, а он слишком большой, нужно разбивать на части. И вот захотелось потом запускать автоматически Total Commander с поиском по файлу-результату. Вашу команду попробовал, запустился Total Commander со строкой в поле поиска, приходится вручную запускать, но ничего. Спасибо большое за подсказку![/quote]
Добавлено: Пн июл 23, 2018 13:06
Flasher
BeardFury78
Так зачем вручную, если я vbs дал?
И зачем в батнике вообще перебор в цикле? Сам grep не справляется с поисками?
Можно второй строкой прописать команду, если лень с самим vbs заморачиваться:
Код: Выделить всё
.Run "%COMMANDER_PATH%\Utils\busybox.exe grep -f g:\patterns.txt -hriw g:\paths.txt>g:\result.txt", 0, 1
busybox — утилита-комбаин вместо Cygwin-ов, MinGW, Gow, UnxUtils и т. п. сборников. Функционал несколько урезан, но как правило в повседневке хватает.
Добавлено: Пн июл 23, 2018 14:27
BeardFury78
Flasher
В том и дело. что файлы (паттерн и список) слишком большие, памяти не хватает, приходится разбивать файл паттерна на куски.
Добавлено: Пн июл 23, 2018 14:33
Flasher
BeardFury78
Ну, сколько весят файлы и сколько свободной памяти?
Там ниже busybox64.exe предлагается. С ней как?
На первый вопрос ответа не вижу.
Добавлено: Пн июл 23, 2018 15:52
BeardFury78
Flasher
Файл паттерн - 50 мб, файл-список - 100 мб. Поиск сразу занимает больше 5 гб и Windows зависает. Был бы рад перескочить на vbs, если бы там был скрипт аналогичный батнику, а самостоятельно ваять не умею. У меня Cygwin установленный, busybox имхо мне не нужен, аналогичные же утилиты, смысл плодить утилиты не вижу...
Добавлено: Пн июл 23, 2018 16:35
Flasher
BeardFury78
Поиск предложенной мной строкой?
В батнике if, а у меня ключ -f. Советую сверить показания.
Как можно писать ерунду про аналогичные утилиты? busybox - это одна независимая портабельная программа с жалкими 475 либо 541 килобайтами, а Cygwin - это целый установочный пакет программ и библиотек с кучей всякого другого ненужного барахла (в т. ч. в реестре) с весом под 110 и более мегабайт.

Добавлено: Пн июл 23, 2018 17:01
BeardFury78
Flasher
И без ключа i тоже зависает, да и нужен мне этот ключ чтобы находило вне зависимости от регистра...
Добавлено: Пн июл 23, 2018 17:19
Flasher
BeardFury78
Не знал, что перед f может учитываться ещё что-то. Вообще ключи r и w (у меня есть) тоже нужны.
Позже посмотрю, что лучше:
sqlite3, LogParser или OLEDB.4.0.
А пока можно путь к своему батнику прописать вместо первого параметра приведённой строки.
Какая кодировка у файлов, кстати?
Добавлено: Пн июл 23, 2018 17:50
BeardFury78
Flasher
Сделал так
Код: Выделить всё
.Run "g:\pathssearch.bat", 0, 1
With CreateObject("WScript.Shell")
PID = .Exec("%COMMANDER_EXE% /S=F:LFileList").ProcessID
Do: A = .AppActivate(PID) :Loop Until A : .SendKeys "~%-"
End With
Наверное не правильно сделала, ибо выдает ошибку:
Строка: 1
Символ: 3
Ошибка: Неверная или неквалифицированная ссылка
Добавлено: Пн июл 23, 2018 17:51
Flasher
Flasher писал(а):Можно второй строкой прописать команду ...
А не первой. Нужна вставка между первой и второй.
Также см. вопрос выше.
BeardFury78 писал(а):Наверное не правильно сделала

Это не опечатка? Жена под ником мужа орудует?

Добавлено: Пн июл 23, 2018 18:32
BeardFury78
Flasher
Виноват, опечатался
Скрипт заработал.
Кодировка у файлов UTF-8 with BOM.
Добавлено: Пн июл 23, 2018 18:35
Flasher
BeardFury78
А пункт с TCKB выполнен? Файлы на панель вываливаются?
С кодировкой ясно. Значит, OLEDB отпадает..
Добавлено: Пн июл 23, 2018 19:07
BeardFury78
Эх, форум во время отправки сообщения засбоил и долго не пускал, пришлось по новой набирать...
Как оказалось, строки 5664 в WCMD_RUS.INC имела вид
5664="Ф&айлы на панель"
Решил просто сделать
5664="Ф&айлы &- на панель"
После этого закрыл Тотал, запустил скрипт и после этого Тотал запустился, но в фоне, пришлось кликать на иконку, там оказалось окно поиска, но не в стадии процесса поиска, все еще нужно кликать на кнопку поиска.
Потом еще раз запустил скрипт, но внутри Тотала и я уже не закрывал программу и стал ждать. После завершения скрипта открылось окно поиска, но опять ничего не нажалось. Но после того как я закрыл это окно, то создалось еще одно новое окно поиска, но с пустым полем "Место поиска" и кнопка нажалась, но поиск велся по всем дискам компьютера. Такая вот история.
Убрал первый амперсанд у строки (который после Ф идет), не помогло, симптомы те же. Еще раз запустил скрипт, специально дождался окна поиска и после этого еще 5 минут прождал, кнопка не нажалась, но после закрытия еще раз создалось окно и немедленно начало поиск по компьютеру.
Как оказалось, был конфликт, в батнике на последней строке было
Код: Выделить всё
"e:\Programs Files\Total Commander\TOTALCMD64.EXE" /S=F:Lsearchpaths
в vbs
Код: Выделить всё
PID = .Exec("%COMMANDER_EXE% /S=F:LFileList").ProcessID
убрал в батнике последнюю строку и на этот раз создалось только окно поиска с пустым полем и с поиском по всему компьютеру. Что не так сделано?
Батник полностью:
Код: Выделить всё
del /s g:\result.txt
split -l 8500 -a 4 g:\patterns.txt
for %%f in (g:\x????) do (
grep -if %%f g:\paths.txt >> g:\result.txt
)
del /s g:\x????
Скрипт полностью
Код: Выделить всё
With CreateObject("WScript.Shell")
.Run "g:\pathssearch.bat", 0, 1
PID = .Exec("%COMMANDER_EXE% /S=F:LFileList").ProcessID
Do: A = .AppActivate(PID) :Loop Until A : .SendKeys "~%-"
End With[quote][/quote]
Блин, торможу... сейчас еще проверю.