Показать полную графическую версию : [решено] Удалить все папки, внутри которых есть файл с определённым имменем.
Добрый.
Есть папка...скажем 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*.* - ничего не трогать/не удалять.
Надеюсь понятно описал.
Спасибо.
Надеюсь понятно описал. »
Да.
Пробуйте:
@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
Учтите, что до:
2) файл лежит в d:\home\кириллица 123 abc\tts.mp3 - здесь также нужно удалить папку "кириллица 123 abc" со всеми файлами и подпапками. »
дело не дойдёт, поскольку каталог «кириллица 123 abc» будет удалён ещё на первом шагу.
Тестирую на 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 срабатывает, второй нет. После первой паузы "блымнуло" и всё)
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
покажите его вывод.
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, для начала переименуйте Ваш 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 не может быть задействован (несмотря на то, что это хоть и виртуальная, но таки файловая система) ;).
Iska, да имена там действительно "страшные"....
извините, как использовать? завернуть скрипт в my_test.WSH ?
Попробовал запустить - пишет сценарий не указан...
9119, сохраните код в файл с расширением «.ps1» в кодировке 65001/UTF-8. Однократно разрешите «ручками» исполнение локальных неподписанных скриптов в PowerShell:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
Затем исполняйте скрипт таким же макаром (http://forum.oszone.net/post-2911590.html#post2911590), только вместо cmd.exe используйте powershell.exe.
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: сработает)
А что на счет кириллицы? »
С кириллицей и пакетные файлы работают.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.