Показать полную графическую версию : [решено] Удаление папок по совпадению имен
NuclearBox
15-05-2019, 15:46
Здравствуйте, уважаемые.
Прошу помочь.
Нужен батник, который удаляет в нескольких заранее определенных директориях только те папки, чьи имена совпадают с именами папок, выделенных в Проводнике в произвольной директории.
Пути к директориям, где требуется производить удаления, указываются в батнике. Их может быть несколько, обычно менее десяти.
Сам батник будет добавлен в контекстное меню Проводника, откуда и будет запускаться.
Произвольной директорией, где выделяются папки и запускается батник, может быть и одна из указанных в батнике директорий.
Есть три директории:
C:\Folder1
C:\Folder2
C:\Folder3\Subfolder
Первая - произвольная, из которой будет вызываться батник через контекстное меню Проводника.
Вторая и третья - заранее определенные, в которых требуется производить удаления. Пути к ним прописываются в батник через set.
В Проводнике в первой (произвольной) директории C:\Folder1 выделяем мышью-клавиатурой несколько интересующих папок:
C:\Folder1\Март
C:\Folder1\Август
C:\Folder1\Сентябрь
C:\Folder1\Октябрь
C:\Folder1\Декабрь
Вызываем контекстное меню Проводника, и активируем через него батник. (его путь и параметр добавлены в контекстное меню).
Батник ищет во второй и третьей директориях папки, имена которых совпадают с именами папок, выделенных в первой директории - Март, Август, Сентябрь, Октябрь, Декабрь - и удаляет их. Например, нашел и удалил:
C:\Folder2\Март
C:\Folder2\Октябрь
C:\Folder2\Декабрь
C:\Folder3\Subfolder\Март
C:\Folder3\Subfolder\Август
C:\Folder3\Subfolder\Сентябрь
C:\Folder3\Subfolder\Октябрь
Хотите сказать это удобно, именно так? Насколько часто надо делать это удаление? Может проще задать пути параметром или вопросом и поручить планировщику задачу?
И для чего вообще возиться с подпапками, не проще сразу удалять все пустые ниже или на этом уровне или непустые но начиная с родительской известной?
NuclearBox
16-05-2019, 17:03
Хотите сказать это удобно, именно так? »
К сожалению, других вариантов нет, поскольку сегодня это одни папки, завтра другие, их имена и пути не известны заранее, а необходимость их удаления нельзя определить какими-либо техническими свойствами. Можно только задать путь к тем родительским директориям, в которых надо периодически удалять некоторые подпапки, имена которых не известы заранее. А вот родительские папки и пути к ним известны, и изменяются редко.
Насколько часто надо делать это удаление? »
Каждый день по 10-15 названий папок под удаление, иногда больше. Соответственно, надо это умножить на количество родительских папок, в которых надо найти и удалить подпапки с такими именами. Это отнимает массу времени и угнетает.
Может проще задать пути параметром или вопросом и поручить планировщику задачу? »
Пути можно задать только для родительских директорий, где требуется искать папки для удаления. Организовать удаление по маске не получится, поскольку названия непредсказуемы. И поручить удаление планировщику тоже нельзя. Слишком антропогенные критерии - что, когда и почему надо удалять. Но имеет смысл автоматизировать само удаление описанным выше способом.
И для чего вообще возиться с подпапками, не проще сразу удалять все пустые ниже или на этом уровне или непустые но начиная с родительской известной? »
Я бы и не подумал организовывать простую чистку пустых папок таким сложным способом.
Родительские папки содержат массу непустых подпапок, в которых тоже что-то находится. Удалять родительские папки нельзя. А также, нельзя (даже временно) переименовывать и перемещать подпапки. Можно только удалить некоторые из них. Но при этом, если в одной родительской директории одна какая-то папка удаляется, то обязательно удалять ВСЕ подпапки с тем же названием и в других родительских директориях. Если они там есть.
NuclearBox, так как вы хотите (из контекстного меню выделять) не выйдет, можно выделенное передать в файл-список и потом придется еще запускать bat где будет сравнение содержимого заданных путей с этим списком. Иначе, если выделенное отдать сразу параметром для bat (прописать в конт. меню), то будет запускаться столько окон bat, сколько путей было выделено.
Я не просто так написал выше, что это будет неудобно так как вы хотите.
NuclearBox
17-05-2019, 11:51
alpap, спасибо за ответ.
если выделенное отдать сразу параметром для bat (прописать в конт. меню), то будет запускаться столько окон bat, сколько путей было выделено »Я понимаю, это вполне меня устроит. Имею в контекстном меню несколько батников для переименований и другого.
По текущей задаче, при 10-15 наименований под удаление в день, которые редко удаляются сразу все, а обычно за 2-3 раза в течение дня - это нормально. Даже если бы пришлось по одному названию удалять, а не скакать между окнами с поиском - уже было бы легче. Но целесообразно сразу сделать удаление пакетами (несколькими bat-окнами) - машину это не напряжет.
можно выделенное передать в файл-список и потом придется еще запускать bat где будет сравнение содержимого заданных путей с этим списком »
Я предполагал, что можно обойтись без сравнения путей, а только извлекать имена выделенных папок и добавлять их к путям заданных родительских папок. И в таком виде отправлять на удаление без сравнения. Не важно есть ли такая папка. Если есть - она будет удалена. Если нет - команда все равно пройдет к следующей.
Как примерно представлял себе конструкцию батника:
1 - задать через set пути к родительским папкам, где нужны удаления. Согласно примеру:
Set "FolderA=C:\Folder2"
Set "FolderB=C:\Folder3\Subfolder"
2 - для выделенных папок (for) прописать через do set замену путей каждой папки на путь вида "FolderA\папка", и через call отправить на удаление этого пути.
3 - аналогично, для выделенных папок прописать замену пути каждой папки на путь вида "FolderB\папка", и отправить на удаление.
4 - удаление выделить с помощью метки.
alpap, однако, если я ошибаюсь, и такая конструкция неработоспособна, то можно было бы основным батником не просто генерировать пути для списка удаления, а формировать строки нового временного батника, состоящие из команды удаления и сгенерированных путей, и выводить в новый батник >> temp.bat
По примеру такого вида:
call del "C:\Folder2\Март"
call del "C:\Folder2\Октябрь"
call del "C:\Folder2\Декабрь"
call del "C:\Folder3\Subfolder\Март"
call del "C:\Folder3\Subfolder\Август"
call del "C:\Folder3\Subfolder\Сентябрь"
call del "C:\Folder3\Subfolder\Октябрь"
Это решит проблему нагрузки и количества окон bat, и сюда же можно дописать удаление этого временного батника:
call del "temp.bat"
Хотелось бы обойтись одним постояным bat-файлом. Однако, навыков все равно не хватает ни для первого, ни для второго варианта.
ну если несколько окон устраивает, то можно сделать так:
применить этот reg
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\Directory\shell\Remsim]
"MUIVerb"="Удалить подобные"
[HKEY_CLASSES_ROOT\Directory\shell\Remsim\command]
@="\"C:\\Bat\\Remsim.bat\" \"%1\""
Remsim.reg (https://drive.google.com/open?id=1phP2OzIeiCil7YTCNHcC0khK4wBYCPNO)
-------------------------------------------
Remsim.bat (у меня лежал в "C:\Bat")
@echo off
set "d1=C:\Folder2"
set "d2=C:\Folder3\Subfolder"
for %%a in ("%d1%" "%d2%") do if exist "%%~a\%~nx1" >nul 2>&1 rd /s /q "%%~a\%~nx1"
pause
принцип работы на скриншотах ниже
1 (https://drive.google.com/open?id=1A5Q88McUNoPUQcIcConegQrpEyG6QBva), 2 (https://drive.google.com/open?id=11u6FIwfG5f4KJICVH3hbLkpbqE9oABZJ), 3 (https://drive.google.com/open?id=1dZ7K4UhD2pLMiPWZYblyu0KSl8ptz381)
NuclearBox
17-05-2019, 16:54
alpap, большое спасибо! Это то, что надо! Даже reg и иллюстрации бонусом)
Легко увеличил количество папок до нужного. Отлично работает! Спасибо!
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.