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

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

Ответить
Настройки темы
CMD/BAT - [решено] Удалить все папки, внутри которых есть файл с определённым имменем.

Старожил


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

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


Добрый.

Есть папка...скажем d:\home и в ней подпапки.
Все подпапки имеют длинные имена с кирилилцей и пробелами..
Скажем d:\home\кириллица 123 abc
Внутри есть еще подпапки...

Нужен батник, который будет искать во всех подпапках (и их подпапках и т.д..) d:\home файл с именем - *tts*.*, и если такой будет найден - удаляло материнскую подпапку, но не удаляло d:\home.

Пример:

1) файл лежит в d:\home\кириллица 123 abc\подпапка\подпапка\qwtts.wav - здесь нужно удалить папку "кириллица 123 abc" со всеми файлами и подпапками.
2) файл лежит в d:\home\кириллица 123 abc\tts.mp3 - здесь также нужно удалить папку "кириллица 123 abc" со всеми файлами и подпапками.

но если в подпапках d:\home нет файла *tts*.* - ничего не трогать/не удалять.


Надеюсь понятно описал.
Спасибо.

Отправлено: 19:41, 01-03-2020

 

Ветеран


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

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


Цитата 9119:
Надеюсь понятно описал. »
Да.

Пробуйте:
Скрытый текст
Код: Выделить весь код
@echo off
setlocal enableextensions enabledelayedexpansion

2>nul pushd "d:\home" && (
	for /f "usebackq delims=" %%i in (`2^>nul dir /a:d /b "*.*"`) do (
		>nul 2>&1 dir /a:-d /b /s "%%~i\*tts*.*" && rd /s /q "%%~i"
	)
) & popd

endlocal
exit /b 0

Учтите, что до:
Цитата 9119:
2) файл лежит в d:\home\кириллица 123 abc\tts.mp3 - здесь также нужно удалить папку "кириллица 123 abc" со всеми файлами и подпапками. »
дело не дойдёт, поскольку каталог «кириллица 123 abc» будет удалён ещё на первом шагу.
Это сообщение посчитали полезным следующие участники:

Отправлено: 20:09, 01-03-2020 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Старожил


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

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


Тестирую на Win10.
В C:\Users\Admin\Desktop\12333 лежит еще 3 папки с файлом tts.txt на разных уровнях подпапок.
добавил паузы для наглядности.

Скрытый текст
Код: Выделить весь код
pause 

setlocal enableextensions enabledelayedexpansion

2>nul pushd "C:\Users\Admin\Desktop\12333" && (
	for /f "usebackq delims=" %%i in (`2^>nul dir /a:d /b "*.*"`) do (
		>nul 2>&1 dir /a:-d /b /s "%%~i\*tts*.*" && rd /s /q "%%~i"
	)
) & popd

endlocal
exit /b 0

pause

ничего не происходит.. .
первая pause срабатывает, второй нет. После первой паузы "блымнуло" и всё)

Отправлено: 20:19, 01-03-2020 | #3


Ветеран


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

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


9119, не надо пауз. Откройте окно интерпретатора команд (Win-R, «cmd.exe», Enter), перетащите в него из Проводника пакетный файл, нажмите Enter.

Вот Вам код для отладки:
Скрытый текст
Код: Выделить весь код
@echo off
setlocal enableextensions enabledelayedexpansion

2>nul pushd "C:\Users\Admin\Desktop\12333" && (
	cd
	for /f "usebackq delims=" %%i in (`2^>nul dir /a:d /b "*.*"`) do (
		echo [%%~i]
		echo ----------------------------
		dir /a:-d /b /s "%%~i\*tts*.*"
		echo ----------------------------
		>nul 2>&1 dir /a:-d /b /s "%%~i\*tts*.*" && rd /s /q "%%~i"
	)
) & popd

endlocal
exit /b 0

покажите его вывод.

Отправлено: 20:26, 01-03-2020 | #4


Старожил


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

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


Скрытый текст
Код: Выделить весь код
C:\Users\Admin>C:\Users\Admin\Desktop\12333\del.cmd
C:\Users\Admin\Desktop\12333
[Россия прижала "великую" Аmериkу к стене]
----------------------------
Не удается найти указанный файл.
----------------------------
[США nрuговоpили - Планы на будущее <незалежной> строят в Вашингтоне]
----------------------------
Синтаксическая ошибка в имени файла, имени папки или метке тома.
----------------------------
[Три признака того, что Зеленский не станет президентом Украины]
----------------------------
Не удается найти указанный файл.
----------------------------

C:\Users\Admin>

файлы вида *tts*. * есть во всех 3 папках, на разных уровнях.

Последний раз редактировалось 9119, 01-03-2020 в 21:09.


Отправлено: 20:35, 01-03-2020 | #5


Ветеран


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

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


9119, для начала переименуйте Ваш del.cmd в другое имя (и постарайтесь никогда не давать пакетным файлам имена внутренних команд).

Второе. На Вашем скриншоте видны двойные прямые кавычки в имени одного каталога (чего не может быть по определению — надо полагать, в реальности там какие-то другие кавычки), угловые скобки (здесь, судя по опыту, — в реальности угловые кавычки-ёлочки). Вероятно, что-то наподобие такого и с третьим каталогом.

Пакетные файлы имеют достаточно ограниченные возможности по работе с файлами и каталогами, содержащими в именах символы не из набора OEM/866. Посему предлагаю сразу переходить к WSH/PowerShell. Например:
Скрытый текст
Код: Выделить весь код
Get-ChildItem -Path "C:\Users\Admin\Desktop\12333" -Directory |`
    ForEach-Object -Process {
        if(@((Get-ChildItem -Path "$($_.FullName)\*tts*.*" -File -Recurse)).Count -gt 0) {
            [System.IO.Directory]::Delete($_.FullName, $true)
        }
    }

Кстати, интересная особенность — для виртуальных дисков, созданных командой subst, параметр -Directory командлета Get-ChildItem не может быть задействован (несмотря на то, что это хоть и виртуальная, но таки файловая система) .
Это сообщение посчитали полезным следующие участники:

Отправлено: 21:20, 01-03-2020 | #6


Старожил


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

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


Iska, да имена там действительно "страшные"....
извините, как использовать? завернуть скрипт в my_test.WSH ?
Попробовал запустить - пишет сценарий не указан...

Отправлено: 21:31, 01-03-2020 | #7


Ветеран


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

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


9119, сохраните код в файл с расширением «.ps1» в кодировке 65001/UTF-8. Однократно разрешите «ручками» исполнение локальных неподписанных скриптов в PowerShell:
Код: Выделить весь код
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
Затем исполняйте скрипт таким же макаром, только вместо cmd.exe используйте powershell.exe.

Отправлено: 21:41, 01-03-2020 | #8


Старожил


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

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


Iska,
да с powershell работает. Спасибо.
А что на счет кириллицы?
Такое сработает?
Код: Выделить весь код
Get-ChildItem -Path "E:\!!АРХИВ\!временное\скрины" -Directory |`
    ForEach-Object -Process {
        if(@((Get-ChildItem -Path "$($_.FullName)\*озвучка*.*" -File -Recurse)).Count -gt 0) {
            [System.IO.Directory]::Delete($_.FullName, $true)
        }
    }



upd: сработает)

Последний раз редактировалось 9119, 01-03-2020 в 21:55.


Отправлено: 21:49, 01-03-2020 | #9


Ветеран


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

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


Цитата 9119:
А что на счет кириллицы? »
С кириллицей и пакетные файлы работают.

Отправлено: 22:26, 01-03-2020 | #10



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - Удалить папки, в которых отсутствуют вложенные подпапки aries15ssh Скриптовые языки администрирования Windows 1 17-09-2019 15:47
CMD/BAT - Удалить все папки и файлы кроме определенных 2 папок и 2 файлов komilfo Скриптовые языки администрирования Windows 2 18-01-2018 09:08
CMD/BAT - Удалить все папки и содержимое папок с диска levjenia Скриптовые языки администрирования Windows 3 19-01-2015 16:17
Любой язык - Есть необходимость создать для каждой папки файл с содержимым папки Super_Kolobok Скриптовые языки администрирования Windows 2 01-11-2013 16:29
V. 2007 - Удалить файл из общей папки. Traktorist Microsoft Exchange Server 0 17-05-2011 15:03




 
Переход