Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Найти все папки, содержащих 2 определенные папки (кеш, бекап)

Ответить
Настройки темы
CMD/BAT - Найти все папки, содержащих 2 определенные папки (кеш, бекап)

Пользователь


Сообщения: 99
Благодарности: 2

Профиль | Отправить PM | Цитировать


Здравствуйте

Прошу помощи с 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

 

Ветеран


Contributor


Сообщения: 2546
Благодарности: 1593

Профиль | Отправить 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
Благодарности: 2

Профиль | Отправить PM | Цитировать


Цитата megaloman:
Set "BoxIn=Z:\Папка для поиска"
Set "BoxA=Папка A"
Set "BoxB=Папка B" »
...

Замечательно! Почти.
Прогнал тестов 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
При использовании поиска по разным логическим дискам, где:
Код: Выделить весь код
:AnyDo
    ...
Exit /B 0
Можно ли "Exit /B 0" - заменить на "goto :EOF" (или неуместно?)
заметка 2

были проблемы с кодировкой при тестовом выводе
Echo %1 >> "с:\test.txt"
в начале скрипта и прописан chcp 866, сохранён как 866...
но в "логе", полученные пути-папки, содержащие кириллицу, выходили крякозяброй
(при выводе на экран все было ок)
вылечилось странно - из скрипта создал новый файл для лога...





PS
Огромная вам благодарность Megaloman
Давно не заходил на форум...
и рад, что вы еще здесь, откликаетесь, помогаете людям
Ваши уроки, снипеты, заметки и мне сильно помогали
Спасибо вам еще раз!

Отправлено: 05:09, 19-05-2022 | #3


Ветеран


Contributor


Сообщения: 2546
Благодарности: 1593

Профиль | Отправить PM | Цитировать


Цитата blacks2:
Можно ли "Exit /B 0" - заменить на "goto :EOF" (или неуместно?) »
Можно, а зачем? Это ничего не меняет.
Цитата blacks2:
но в "логе", полученные пути-папки, содержащие кириллицу, выходили крякозяброй »
А чем смотрите? Notepad? Тогда наоборот, надо сохранять в кодировке 1251
Вот вариант
Код: Выделить весь код
@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
Благодарности: 2

Профиль | Отправить 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



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Найти все папки, содержащих 2 определенные папки (кеш, бекап)

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
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




 
Переход