|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Найти все папки, содержащих 2 определенные папки (кеш, бекап) |
|
CMD/BAT - Найти все папки, содержащих 2 определенные папки (кеш, бекап)
|
Пользователь Сообщения: 99 |
Здравствуйте
Прошу помощи с CMD скриптом КРАТКО/АЛГОРИТМ в назначенном пути найти все "%папкиХ%" (рекурсия) в корне которых, присутствует одновременно папка "%папкаА%" + "%папкаB%" к всем найденным "%папкиХ%" применить произвольный код завершение ПОДРОБНО В моей системе, семье, браузеры на основе движка Chromium Имена-папки профилей пользователей разные, добавляются/удаляются Цель: очищать кеш, бекапы в папках профилей, имя-путь которых не знаю/меняется Как найти профиль, не зная его названия? - В каждом профиле пользователя, на движке Chromium, есть стандартные папки - значит, папку профиля можно найти если в нем есть "папкаА"+"папкаB" Далее: к всем найденным папкиХ (где есть "папкаА"+"папкаB") применить произвольный код (на бекап и/или очистку) * папка профиля - мои профили названы англ буквами но семья может... и минус, тире, @, пробел, кириллицу добавить в название… Написать самостоятельно не смогу: пытался… искал решение, собирал из отрывков снипетов... навешивал на алгоритм команды... ...так осилить и не смог решил обратиться к вам форумчане за помощью. КАРКАС/АЛГОРИТМ @echo off & chcp 866 :: EnableDelayedExpansion - желательно обойтись без него :: где искать - "переключатель" (all =на всех логических дисках) "search_mode=all" :: где искать - папка по умолчанию "search_path=c:\Users\%USERNAME%\AppData" :: папки-маркеры расположенные в папке-профиле "search_marker_dir1=Cache" "search_marker_dir2=Code Cache" :: если «search_mode=all» - поиск по всем лог. дискам / не равен – поиск по умолчанию if /i "%search_mode%"=="all" ( for %%d in (c d e f g h i j k l m n o p q r s t u v w x y z) do set search_path=%%d call search_pfofiles ) else ( call search_pfofiles ) goto :exittt :: ... :exittt echo OK pause & exit :search_pfofiles for /D /R "%search_path%" /d поиск папки %%f рекурсивно in ( * ) do ( if exist "%%f\%search_marker_dir1%\" if exist "%%f\%search_marker_dir2%\" ( :: где %%f = найденЫЕ точно папкИ-профилей :: произвольные действия-команды echo %%f >> naprimer_test_file.txt ) ) goto :eof 0 ![]() ясно понятно, что я "необразованный" в постановке кода в for.... ясно, внутри for ставить if exist... скорее всего создает доп. нагрузку/время на анализ-сравнение но.. другого решения в голове нет, а реализации тем более( Помогите пожалуйста скриптом Всем откликнувшимся, заранее, огромное спасибо! PS, ОФФТОП, FAQ
Зачем вообще? - часть в общий cmd с необходимыми задачами + бекап закладок + очистка кешей браузера * тестовый день в Firefox создал кеш на 750-800мб, кеш же моих постоянных 10+ профилей =200-2000мб/мес на профиль) * да, правильней выносить кеш в %TEMP% / отдельный диск / в оперативку но частая переустановка системы, запоминание что где, не дает гарантии от "забыть" Почему не специальные утилиты очистки и бекапа? - потихоньку собираю cmd под себя, из разных сниппетов - конкретно те задачи, которые нужны - установка, запуск, сопряжение, расписание разрозненного софта в разной последовательности, после перекидывание файлов... и в довесок, по любому, на старте и финише, использование cmd... Почему не искать сразу папки кешей Cache/Code Cache или файл закладок? - в путях c:\Users\%USERNAME%\AppData\Roaming\ c:\Users\%USERNAME%\AppData\Local\ могут встретиться папки с схожим названием кешей/закладок а если поиск производиться по всем логическим дискам - тем более Сам создаешь профили = знаешь путь, зачем нагружать систему поиском? - с портабл бразуером - ок, хорошо - с стейбл системой - ок, хорошо - но при добавление новых профилей - править и cmd на очистку - можно забыть... - на разных пк семьи, могут быть разные профили и везде найти+править cmd... Почему папки, а не файлы в качестве маркеров? - посмотрел профили на разных хромиум браузерах: имеющиеся схожие файлы, большей частью могут быть удалены при глубокой очистке (журналы и тп) или часть имен файлов отличается/отсутствуют в зависимости от «конторы браузера» а нижеследующие папки есть у всех User Data\Default\blob_storage\ User Data\Default\BudgetDatabase\ User Data\Default\Cache\ User Data\Default\Code Cache\ User Data\Default\databases\ User Data\Default\GPUCache\ User Data\Default\Service Worker\ User Data\Default\Sessions\ User Data\Default\Session Storage\ * плюс если кому понадобится, заметка: пути профилей Default по умолчанию c:\Users\%USERNAME%\AppData\Local\Google\Chrome\User Data\Default\ c:\Users\%USERNAME%\AppData\Local\Chromium\User Data\Default\ c:\Users\%USERNAME%\AppData\Local\BraveSoftware\Brave-Browser\Default\ c:\Users\%USERNAME%\AppData\Local\Yandex\YandexBrowser\User Data\Default\ c:\Users\%USERNAME%\AppData\Local\Microsoft\Edge\User Data\Default\ c:\Users\%USERNAME%\AppData\Local\Vivaldi\User Data\Default\ c:\Users\%USERNAME%\AppData\Local\Maxthon\Application\User Data\Default\ c:\Users\%USERNAME%\AppData\Local\Opera\Opera\Default\ c:\Users\%USERNAME%\AppData\Roaming\Opera\Opera\ c:\Users\%USERNAME%\AppData\Roaming\Opera Software\Opera\ c:\Users\%USERNAME%\AppData\Roaming\Opera Software\Opera Beta\ c:\Users\%USERNAME%\AppData\Roaming\Opera Software\Opera Stable\ (профиль в Roaming, а кеш по умолчанию хранится в Local...) c:\Users\%USERNAME%\AppData\Roaming\Mozilla\Firefox\Profiles\*******.default-release c:\Users\%USERNAME%\AppData\Roaming\Mozilla\Firefox\Profiles\*******.default Зачем столько браузеров? - постоянных 2-3 - остальные установил посмотреть структуру папок профилей |
|
Отправлено: 05:28, 14-05-2022 |
Ветеран Сообщения: 2728
|
Профиль | Отправить PM | Цитировать @Echo Off cls Set "BoxIn=Z:\Папка для поиска" Set "BoxA=Папка A" Set "BoxB=Папка B" If Exist "%BoxIn%\%BoxA%\" If Exist "%BoxIn%\%BoxB%\" Call :AnyDo "%BoxIn%" "%BoxIn%\%BoxA%\" "%BoxIn%\%BoxB%" FOR /F "usebackq delims=" %%d IN (`2^>nul Dir /B /S /A:D "%BoxIn%\"`) Do ( If Exist "%%d\%BoxA%\" If Exist "%%d\%BoxB%\" Call :AnyDo "%%d" "%%d\%BoxA%" "%%d\%BoxB%" ) Pause Exit /B 0 :AnyDo Echo -------- Что то делаем %1 Echo %2 Echo %3 Exit /B 0 |
------- Отправлено: 10:26, 14-05-2022 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Пользователь Сообщения: 99
|
Профиль | Отправить PM | Цитировать Цитата megaloman:
Замечательно! Почти. Прогнал тестов 30+ На старом винте 5400 работает быстро. Рад! Благодарю! ![]() "но" - сам удивился: А) Поиск по пути c:\Users\%USERNAME% - рекурсивно находятся только(!) конечные-самые глубокие папки, содержащие 2 маркера-папки: ...\Edge\User Data\Default\Storage\ext\ihmafllikibpmigkcoadcmckbfhibefp\def\ ...\Edge\User Data\Default\Storage\ext\ihmafllikibpmigkcoadcmckbfhibefp\def\Cache" ...\Edge\User Data\Default\Storage\ext\ihmafllikibpmigkcoadcmckbfhibefp\def\Code Cache" но, вот вышестоящая профиль-папка "Default" (в ней есть Cache и Code Cache) - не находится ...\Edge\User Data\Default\ ...\Edge\User Data\Default\Cache\ ...\Edge\User Data\Default\Code Cache\ (не единично, в некоторых профилях браузеров ситуация идентичная) В) При поиске от корня диска (перебор лог дисков) - тогда находятся все(!) варианты, и "глубокие" и "нужные" Приношу свои извинения, но прошу, помогите доработкой-кодом: когда и при поиске по пути c:\Users\%USERNAME%... находились все варианты (равно как если поиск от корня диска) Спасибо заметка 1
заметка 2
были проблемы с кодировкой при тестовом выводе Echo %1 >> "с:\test.txt" в начале скрипта и прописан chcp 866, сохранён как 866... но в "логе", полученные пути-папки, содержащие кириллицу, выходили крякозяброй (при выводе на экран все было ок) вылечилось странно - из скрипта создал новый файл для лога... PS Огромная вам благодарность Megaloman Давно не заходил на форум... и рад, что вы еще здесь, откликаетесь, помогаете людям Ваши уроки, снипеты, заметки и мне сильно помогали Спасибо вам еще раз! |
|
Отправлено: 05:09, 19-05-2022 | #3 |
Ветеран Сообщения: 2728
|
Профиль | Отправить PM | Цитировать Цитата blacks2:
Цитата blacks2:
Вот вариант @Echo Off cls >nul chcp 1251 Set "BoxIn=Z:\Users\%USERNAME%\Edge\User Data\Default" Set "BoxA=Папка A" Set "BoxB=Папка B" Set "Log=Z:\Users\%USERNAME%\LogFile.log" >"%Log%" cd. FOR /F "usebackq delims=" %%d IN (`2^>nul Dir /B /S /A:D "%BoxIn%" ^|FIND /I "\%BoxA%"`) Do ( If Exist "%%~dpd%BoxA%" If Exist "%%~dpd%BoxB%" ( >>"%Log%" (Echo +++ "%%~dpd"&Echo "%%d"&Echo "%%~dpd%BoxB%") Call :AnyDo "%%~dpd" "%%d" "%%~dpd%BoxB%" ) ) Pause Exit /B 0 :AnyDo Echo -------- Что то делаем %1 Echo %2 Echo %3 Exit /B 0 |
||
------- Отправлено: 18:46, 19-05-2022 | #4 |
Пользователь Сообщения: 99
|
Профиль | Отправить PM | Цитировать Цитата megaloman:
Благодарю за скорый ответ Megaloman ! За представленная вами v.2. Поиск вроде бы быстрее стал работать (субъективно) Megaloman - V.2 A. Вот тут есть недочет/фича/баг ![]() V.2 - находит И папки, если они входят в путь (например ..\Acrobat\Cache\Code Cache) V.1 - находит правильно: ..\Acrobat\Cache\ ..\Acrobat\Code Cache\ * где Acrobat - получается искомая папка профиля * а маркера-папки = "Code Cache" + "Cache" находятся внутри профиля Результат работы V.2 :
(1) "C:\Users\_________\AppData\LocalLow\Adobe\AcroCef\DC\Acrobat\Cache\"
(2) "C:\Users\_________\AppData\LocalLow\Adobe\AcroCef\DC\Acrobat\Cache\Cache" (3) "C:\Users\_________\AppData\LocalLow\Adobe\AcroCef\DC\Acrobat\Cache\Code Cache" ------ (1) "C:\Users\_________\AppData\LocalLow\Adobe\AcroCef\DC\Acrobat\Cache\" (2) "C:\Users\_________\AppData\LocalLow\Adobe\AcroCef\DC\Acrobat\Cache\blob_storage" (3) "C:\Users\_________\AppData\LocalLow\Adobe\AcroCef\DC\Acrobat\Cache\Code Cache" ------ (1) "C:\Users\_________\AppData\LocalLow\Adobe\AcroCef\DC\Acrobat\Cache\" (2) "C:\Users\_________\AppData\LocalLow\Adobe\AcroCef\DC\Acrobat\Cache\Code Cache" (3) "C:\Users\_________\AppData\LocalLow\Adobe\AcroCef\DC\Acrobat\Cache\Code Cache" ------ (1) "C:\Users\_________\AppData\LocalLow\Adobe\AcroCef\DC\Acrobat\Cache\" (2) "C:\Users\_________\AppData\LocalLow\Adobe\AcroCef\DC\Acrobat\Cache\Session Storage" (3) "C:\Users\_________\AppData\LocalLow\Adobe\AcroCef\DC\Acrobat\Cache\Code Cache" B. Поиск по всем логическим дискам Работает только если ставить слеш после двоеточия: BoxI=c:\ * Без слеша ищет исключительно в c:\Users\%USERNAME% * Первый пример работал с BoxI=c: ИТОГ Теперь даже не знаю: какой вариант лучше? Если выпилить лог из V.2, останется: FOR /F "usebackq delims=" %%d IN (`2^>nul Dir /B /S /A:D "%BoxI%" ^|FIND /I "\%BoxA%"`) Do ( If Exist "%%~dpd%BoxA%" If Exist "%%~dpd%BoxB%" Call :AnyDo "%%~dpd" "%%d" "%%~dpd%BoxB%" ) = может даже быстрее... Но баг-фича поиска по путям описанный выше, + c:\ И определить... какой вариант лучше, по командам-функциям/скорости/правильности... V.1 или V.2 сложно - знаний не хватает КОДИРОВКА + ЛОГ (РЕШЕНО)
Спасибо, походу по кодировке я справился ранее:
Пересоздал лог файл из cmd - видно изначальная кодировка файла лога была другая, а просматривал я в +другой нежели той, в которой cmd писал и в которой записан сам лог файл) Логи открывал в Notepad++ +ПРИМЕР CMD chcp 1251 (записан как UTF8) - лог открыт как ___ (np++ автоматом в UTF8 открывает) = все ок CMD chcp 866 (записан как 866) - лог открыт как 866 (np++ автоматом в ANSI открывает) = все ок А В ЛОГ ВЫВОЖУ ТАК: :AnyDo Echo. & Echo. >> "%Log%" Echo ------ & Echo --- >> "%Log%" Echo (1) %1 & Echo %1 >> "%Log%" Echo (2) %2 & Echo %2 >> "%Log%" Echo (3) %3 & Echo %3 >> "%Log%" Exit /B 0 - задачи по логам особо не стояло - просто при тестах делаю вывод чтоб видеть * но ваш пример Megaloman по любому полезен 5+ НАХОДИТ ТОЛЬКО КОНЕЧНЫЕ ПАПКИ (РЕШЕНО)
По поводу основного бывшего вопроса "находит только конечные папки"
Тут моя вина Вы правы Megaloman! Изначально: Тестил ваш бланковый пример v.1 - все было ок Про "конечные папки" не обратил внимания в первых тестах И начал быстро на него навешивать свои call`ы для последующего встраивания Попутно тестировал, и тут только заметил "конечные" Подумал, что ваша ошибка... После вашего v.2 решил бланковый v.1 заново попробовать - и все работает - даже не поверил с 2-4 попыток)) = находит как и "вышестоящие" так и "конечные" Каюсь(моя ошибка в чем-то была, не нашел). +РЕЗУЛЬТАТ (1) "c:\Users\_________\AppData\Local\Microsoft\Edge\User Data\Default" (2) "c:\Users\_________\AppData\Local\Microsoft\Edge\User Data\Default\Cache" (3) "c:\Users\_________\AppData\Local\Microsoft\Edge\User Data\Default\Code Cache" (1) "c:\Users\_________\AppData\Local\Microsoft\Edge\User Data\Default\Storage\ext\ihmafllikibpmigkcoadcmckbfhibefp\def" (2) "c:\Users\_________\AppData\Local\Microsoft\Edge\User Data\Default\Storage\ext\ihmafllikibpmigkcoadcmckbfhibefp\def\Cache" (3) "c:\Users\_________\AppData\Local\Microsoft\Edge\User Data\Default\Storage\ext\ihmafllikibpmigkcoadcmckbfhibefp\def\Code Cache" Можно, а зачем? Это ничего не меняет.
Цитата megaloman:
и goto :EOF в основном, на автомате, использую, когда список команд по CALL вызываю |
|||
Отправлено: 05:51, 24-05-2022 | #5 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
2012 R2 - Запрет на удаление папки, но разрешить все действия внутри папки | subrain | Windows Server 2012/2012 R2 | 7 | 17-02-2021 09:38 | |
CMD/BAT - [решено] Создание папки из части имени файла и перемещение в нее файлов содержащих эту часть | artbiokron@vk | Скриптовые языки администрирования Windows | 10 | 17-03-2020 10:32 | |
Прочие - бекап сетевой папки на яндекс диск (webdav) | TGR | Программное обеспечение Windows | 4 | 19-06-2017 22:18 | |
CMD/BAT - Копирование бекап-данных с папки Акросина в папки облаков weiyun.com - прошу помощи! | novard | Скриптовые языки администрирования Windows | 0 | 14-11-2013 05:17 | |
Скрипт качает бекап с фтп. Как застравить качать в разные папки? | mooseyaka | Программирование и базы данных | 4 | 28-05-2007 13:41 |
|