Показать полную графическую версию : [решено] Удаление всех папок с одним именем на всех дисках
volk1234
23-10-2009, 23:35
Привет!
Задача: Программа создает в случайных местах (предсказать нельзя) папку XXX.
То есть папок может быть от 1й и до бесконечности в любой папке, где работал с файлами.
Задача написать скрипт который удалял бы при запуске ВСЕ папки XXX
где бы они не были.
Как организовать правильно перебор и удаление всех папок ?
Petya V4sechkin
24-10-2009, 09:24
volk1234, если XXX - маска, тогда так:
@Echo Off
SetLocal EnableExtensions
For %%D In (A B 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 (
For /F "Delims=" %%I In ('Dir %%D:\*XXX* /AD /B /S 2^>nul') Do (
If Exist "%%I" Echo RD /S /Q "%%I"
)
)
Если конкретное имя, примерно так:
@Echo Off
SetLocal EnableExtensions
Set F=XXX
For %%D In (A B 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 (
For /F "Delims=" %%I In ('Dir %%D:\%F%.* /AD /B /S 2^>nul') Do (
If Exist "%%I" (
If /I "%%~nxI"=="%F%" Echo RD /S /Q "%%I"
)
)
)
Команда Echo для тестирования (чтобы видеть результат).
volk1234
24-10-2009, 11:50
Вот блин, с циклами у меня всегда была проблемма.
Насколько я понял последний скрипт убьет папку Folder1 (вместо XXX, чтобы понятнее) например только в корне диска ??
А надо и во вложенных папках. Основная проблема именно в поиске и удалении папки, например, Folder1
в любом месте в любой папке. Например в F:\temp\market\dom\folder1
зы. Или ключ dir /s позволяет добится отображения всех подпапок ? Тогда класс...
volk1234
26-10-2009, 03:52
Отчет об использовании полученной информации :)
http://forum.ru-board.com/topic.cgi?forum=5&topic=21013&start=2000#21
Копирайт поставил Petya V4sechkin ;)
есть еще вариант через WMI:
@Echo Off
SetLocal EnableExtensions
Set DIR=XXX
For /F "UseBackQ Tokens=2 Delims==" %%i In (
`WMIC FSDIR Where 'Name LIKE "%%\\%DIR%"' Get Name /Value^|Find "="`
) Do For /F "Delims=" %%a In ('Echo %%i') Do Echo RD /S/Q "%%a"
не вижу смысла в сканировании сетевых или CD дисков, т.к. сильно замедляется работа скрипта, а шары лучше чистить локально на сервере, поэтому можно ограничить... скажем, только локальные (HDD) и сменные (USB):
@Echo Off
SetLocal EnableExtensions EnableDelayedExpansion
Set DIR=1
For /F "Skip=1 UseBackQ Tokens=1,2" %%i In (
`WMIC LogicalDisk Where 'DriveType^=2 Or DriveType^=3' GET Name^,SystemName`
) Do If Not "%%j"=="" If Defined $R (
Set $R=!$R! OR Drive^^^^="%%i"
) Else Set $R=Drive^^="%%i"
If Not Defined $R Exit /B 1
For /F "UseBackQ Tokens=2 Delims==" %%i In (
`WMIC FSDIR Where '^(%$R%^) And Name LIKE "%%\\%DIR%"' Get Name /Value^|Find "="`
) Do For /F "Delims=" %%a In ('Echo %%i') Do Echo RD /S/Q "%%a"
Petya V4sechkin
26-10-2009, 13:51
volk1234, а вообще, опасно это - вот так папку везде удалять.
volk1234
29-10-2009, 13:25
Да. Надо наверное доработать скрипт - сначала вывод найденых папок - а потом запрос на удаление.....
Кто возьмется :) ?
Я никак не могу взяться за изучение справки по команде For - для меня темный лес....
volk1234, а если они все на экран не влезут?..
если в RD убрать ключ /Q, то будет спрашивать для каждой папки
а если они все на экран не влезут?.. »
Вывести их в текстовый файл_список, открыть его в Блокноте для просмотра и редактирование и приостановить работу скрипта паузой. После просмотра, редактирования, сохранения файл_списка (если это потребуется) и закрытия блокнота, продолжить работу скрипта, нажатием любой кнопки в окне консоли, и грохнуть все папки согласно файл_списку! :)
Вместо паузы можно предусмотреть выбор вариантов "Грохнуть - Выход".
volk1234
30-10-2009, 13:07
Вообще я сильно сомневаюсь что таких папок будет больше 200-300, по умолчанию буфер cmd = 300 строк.
Даже в большом количестве папок можно разглядеть - что конкретную папку удялять не надо - ответить нет - переименовать нужные папки и снова запустить скрипт.
Loginvovchik развил бурную деятельность, черт меня дернул сказать ему про скрипт
http://community.acdsee.com/forums/topic/delete-folders-originals
на базе первого варианта:
@Echo Off
SetLocal EnableExtensions
Set F=XXX
Set T=%~dpn0.tmp
If Exist "%T%" DEL /F/Q "%T%"
For %%D In (A B 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 (
For /F "Delims=" %%I In ('Dir %%D:\%F%.* /AD/B/S 2^>nul') Do (
If Exist "%%I" If /I "%%~nxI"=="%F%" (
Echo %%I
Echo %%I>>"%T%"
)
)
)
If Not Exist "%T%" Echo Каталогов не обнаружено.& Exit
For /F %%i In ('TYPE "%T%"^|Find /C /V ""') Do Set C=%%i
Echo Найдено %C% каталогов...
:D_LOOP
Set /P D=Просмотреть список найденных еще раз? (Y/N)
If /I Not "%D%"=="Y" If /I Not "%D%"=="N" GoTo D_LOOP
If /I "%D%"=="N" GoTo R_LOOP
MORE "%T%"& GoTo D_LOOP
:R_LOOP
Set /P R=Удалить все найденные каталоги? (Y/N)
If /I Not "%R%"=="Y" If /I Not "%R%"=="N" GoTo R_LOOP
If /I "%R%"=="N" Exit
For /F "UseBackQ Delims=" %%i In ("%T%") Do RD /S/Q "%%i"
volk1234
01-11-2009, 09:51
If Not Exist "%T%" Echo Каталогов не обнаружено.& Exit
Вот здесь не очень удачно реализовано,
надпись не успеваешь увидеть. Может пинг какой всобачить?
Может пинг какой всобачить? »
Возможные варианты:rem остановка скрипта
If Not Exist "%T%" Echo Каталогов не обнаружено.& Pause>Nul& Exit
rem пауза на 5 с
If Not Exist "%T%" Echo Каталогов не обнаружено.& ping -n 6 localhost>Nul& Exit
rem подача звукового сигнала + задержка (каждый BEEP ~ 0.5 с) Код BEEP = 07H
If Not Exist "%T%" Echo Каталогов не обнаружено.& Exit
Как удалить папку со всеми вложенными файлами (без подтверждения на удаление) ? XPSP-3
пример бы
PFMAX,
RD /S /Q "C:\TEST"
PFMAX,
set dir=C:\test
pushd %dir%
if not errorlevel 1 rd /s /q . >nul 2>nul
popd
rd %dir% :: Если надо удалить папку...
Как то так...
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.