Компьютерный форум 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=344265)

9119 01-03-2020 19:41 2911574

Удалить все папки, внутри которых есть файл с определённым имменем.
 
Добрый.

Есть папка...скажем 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*.* - ничего не трогать/не удалять.


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

Iska 01-03-2020 20:09 2911578

Цитата:

Цитата 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» будет удалён ещё на первом шагу.

9119 01-03-2020 20:19 2911586

Тестирую на 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 срабатывает, второй нет. После первой паузы "блымнуло" и всё)

Iska 01-03-2020 20:26 2911590

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


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

9119 01-03-2020 20:35 2911597

Скрытый текст
Код:

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 папках, на разных уровнях.

Iska 01-03-2020 21:20 2911610

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 не может быть задействован (несмотря на то, что это хоть и виртуальная, но таки файловая система) ;).

9119 01-03-2020 21:31 2911613

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

Iska 01-03-2020 21:41 2911620

9119, сохраните код в файл с расширением «.ps1» в кодировке 65001/UTF-8. Однократно разрешите «ручками» исполнение локальных неподписанных скриптов в PowerShell:
Код:

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
Затем исполняйте скрипт таким же макаром, только вместо cmd.exe используйте powershell.exe.

9119 01-03-2020 21:49 2911624

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: сработает)

Iska 01-03-2020 22:26 2911629

Цитата:

Цитата 9119
А что на счет кириллицы? »

С кириллицей и пакетные файлы работают.


Время: 20:46.

Время: 20:46.
© OSzone.net 2001-