Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Удаление папок по совпадению имен (http://forum.oszone.net/showthread.php?t=340543)

NuclearBox 15-05-2019 15:46 2871851

Удаление папок по совпадению имен
 
Здравствуйте, уважаемые.
Прошу помочь.

Нужен батник, который удаляет в нескольких заранее определенных директориях только те папки, чьи имена совпадают с именами папок, выделенных в Проводнике в произвольной директории.
Пути к директориям, где требуется производить удаления, указываются в батнике. Их может быть несколько, обычно менее десяти.
Сам батник будет добавлен в контекстное меню Проводника, откуда и будет запускаться.
Произвольной директорией, где выделяются папки и запускается батник, может быть и одна из указанных в батнике директорий.

Пример

Есть три директории:
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\Октябрь



alpap 16-05-2019 14:43 2872017

Хотите сказать это удобно, именно так? Насколько часто надо делать это удаление? Может проще задать пути параметром или вопросом и поручить планировщику задачу?
И для чего вообще возиться с подпапками, не проще сразу удалять все пустые ниже или на этом уровне или непустые но начиная с родительской известной?

NuclearBox 16-05-2019 17:03 2872038

Цитата:

Цитата alpap
Хотите сказать это удобно, именно так? »

К сожалению, других вариантов нет, поскольку сегодня это одни папки, завтра другие, их имена и пути не известны заранее, а необходимость их удаления нельзя определить какими-либо техническими свойствами. Можно только задать путь к тем родительским директориям, в которых надо периодически удалять некоторые подпапки, имена которых не известы заранее. А вот родительские папки и пути к ним известны, и изменяются редко.
Цитата:

Цитата alpap
Насколько часто надо делать это удаление? »

Каждый день по 10-15 названий папок под удаление, иногда больше. Соответственно, надо это умножить на количество родительских папок, в которых надо найти и удалить подпапки с такими именами. Это отнимает массу времени и угнетает.
Цитата:

Цитата alpap
Может проще задать пути параметром или вопросом и поручить планировщику задачу? »

Пути можно задать только для родительских директорий, где требуется искать папки для удаления. Организовать удаление по маске не получится, поскольку названия непредсказуемы. И поручить удаление планировщику тоже нельзя. Слишком антропогенные критерии - что, когда и почему надо удалять. Но имеет смысл автоматизировать само удаление описанным выше способом.
Цитата:

Цитата alpap
И для чего вообще возиться с подпапками, не проще сразу удалять все пустые ниже или на этом уровне или непустые но начиная с родительской известной? »

Я бы и не подумал организовывать простую чистку пустых папок таким сложным способом.
Родительские папки содержат массу непустых подпапок, в которых тоже что-то находится. Удалять родительские папки нельзя. А также, нельзя (даже временно) переименовывать и перемещать подпапки. Можно только удалить некоторые из них. Но при этом, если в одной родительской директории одна какая-то папка удаляется, то обязательно удалять ВСЕ подпапки с тем же названием и в других родительских директориях. Если они там есть.

alpap 17-05-2019 03:25 2872090

NuclearBox, так как вы хотите (из контекстного меню выделять) не выйдет, можно выделенное передать в файл-список и потом придется еще запускать bat где будет сравнение содержимого заданных путей с этим списком. Иначе, если выделенное отдать сразу параметром для bat (прописать в конт. меню), то будет запускаться столько окон bat, сколько путей было выделено.
Я не просто так написал выше, что это будет неудобно так как вы хотите.

NuclearBox 17-05-2019 11:51 2872113

alpap, спасибо за ответ.
Цитата:

Цитата alpap
если выделенное отдать сразу параметром для bat (прописать в конт. меню), то будет запускаться столько окон bat, сколько путей было выделено »

Я понимаю, это вполне меня устроит. Имею в контекстном меню несколько батников для переименований и другого.
По текущей задаче, при 10-15 наименований под удаление в день, которые редко удаляются сразу все, а обычно за 2-3 раза в течение дня - это нормально. Даже если бы пришлось по одному названию удалять, а не скакать между окнами с поиском - уже было бы легче. Но целесообразно сразу сделать удаление пакетами (несколькими bat-окнами) - машину это не напряжет.
Цитата:

Цитата alpap
можно выделенное передать в файл-список и потом придется еще запускать 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-файлом. Однако, навыков все равно не хватает ни для первого, ни для второго варианта.



alpap 17-05-2019 14:07 2872128

ну если несколько окон устраивает, то можно сделать так:
применить этот 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
-------------------------------------------
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, 2, 3

NuclearBox 17-05-2019 16:54 2872146

alpap, большое спасибо! Это то, что надо! Даже reg и иллюстрации бонусом)
Легко увеличил количество папок до нужного. Отлично работает! Спасибо!


Время: 05:16.

Время: 05:16.
© OSzone.net 2001-