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

n1gt 03-12-2016 17:09 2692586

Поиск и удаление файлов по маске на всех локальных дисках
 
Доброе время суток, уважаемые камрады!
Помогите, пожалуйста, решить следующую задачу:
Нужно написать скрипт, который выполняет следующее:
- поиск файлов по расширению (чтобы список расширений можно было дополнить в скрипте)
- поиск на всех локальных дисках, но не сетевых
- удаление найденных файлов
Более ничего не нужно - ни логирования, ни подсчета и т.д.

Прошу также уделить внимание тому, что должно быть строгое соответствие расширению. Например, я находил скрипты, где в списке перечислены "*.log", а при этом скрипт находил еще и файлы с расширением .log2 или .logged.

Почему создал новую тему: прокурил не только этот форум, но еще и соседние. Находил куски кодов что тут, что там, но в силу того, что склад ума не кодерский, не смог их соединить... Сижу уже пару дней в темноте и тишине, и безуспешно :-(

x0r 03-12-2016 18:06 2692601

Прога Everything и её консольная версия. один раз построил индекс(~минута), затем запрос в базу и удаление по списку. тулза умеет регулярки :
Скрытый текст
Код:

=>es --help
-r Search the database using a basic POSIX regular expression.
-i Does a case sensitive search.
-w Does a whole word search.
-p Does a full path search.
-h --help Display this help.
-n <num> Limit the amount of results shown to <num>.
-s Sort by full path.


n1gt 03-12-2016 18:22 2692607

x0r, как Вы можете представить эту утилиту в моей задаче? Смысл строить индекс для файла, подлежащего удалению, а также в принципе использование стороннего ПО - я не вижу. Тем более, когда cmd может выполнить мою задачу на 100%...

x0r 03-12-2016 19:01 2692616

а ты попробуй сначала, потом будешь домысливать. Это не "тот индекс", это другой, годный ;-)
батнегом ты будешь искать долго-и-нудно, Everithing найдет за секунду. Одну секунду. Везде. Построит список. Надо только обработать готовый список через for /f ...

NickM 03-12-2016 19:21 2692625

Цитата:

Цитата x0r
батнегом ты будешь искать долго-и-нудно »

Код:

dir c:\*.sys /b /s /a-d

Georgio 03-12-2016 20:04 2692635

Цитата:

Цитата n1gt
Прошу также уделить внимание тому, что должно быть строгое соответствие расширению. Например, я находил скрипты, где в списке перечислены "*.log", а при этом скрипт находил еще и файлы с расширением .log2 или .logged. »

Угу, бывает такое, — если на диске включено создание коротких имён, а имена файлов дополнительно не фильтруются.



С учётом вышеизложенного:

Код:

@echo off
setlocal

:: Здесь указываете расширения удаляемых файлов (именно так, как написано в этом примере):
set "ext=.txt/.log/.dat"

for /f "skip=1" %%i in ('wmic LogicalDisk where DriveType^=3 get Name') do (
    for %%j in (%%i) do (
        for /f "delims=" %%k in ('2^>nul dir %%j\ /a-d /b /s^| findstr /e /i /l /c:"%ext:/=" /c:"%"') do (
            >>del.log echo del /a /f "%%k"
        )
    )
)

endlocal
exit /b

.

Если в созданном в кодировке OEM-866 логе «del.log» будут записаны именно подлежащие удалению файлы, то для реального их удаления уберите из кода выделенное красным цветом.

x0r 03-12-2016 20:25 2692639

NickM, это понятно, можно и так, если нада переносимость и ничего не скачивать.
Код:

ren Замени move на del если уверен что надо удалить файлы.
@echo off
@chcp 866
dir /b /s "c:\Users\HomeUser\Downloads\*.exe" >list.txt
type list.txt
set /p S=  ¤¤¤  Удалить эти файлы?  ¤¤¤ [ "y" - Да  ] :
if /i %S% NEQ y goto :EOF
for /f %%i in (list.txt) do move "%%i" "%%i.bk551"
rem удаление
rem for /f %%i in (list.txt) do del /Q /F "%%i"
exit

Everithing интересна своими регулярками. Давно пользуюсь. писать батники для удаления по маске перестал, ибо тут все за секунды находится, выделяется и удаляется. Но так тоже можно ;-)

n1gt 03-12-2016 20:29 2692641

Georgio, спасибо огромное! Ищет что надо и где надо!!
А сложно ли будет доработать скрипт так, чтобы он еще на съемных дисках (а-ля флешки и внешние винты) искал?

x0r, у нас есть перечень разрешенного к использованию ПО, куда не входит эта утилита. Поэтому, даже если закрыть глаза на неудобство привлечения стороннего ПО, согласовать с СКЗ это тот еще геморрой...

Georgio 03-12-2016 21:04 2692647

n1gt, попробуйте:

Код:

@echo off
setlocal

set "ext=.txt/.log/.dat"

for /f "skip=1" %%i in ('wmic LogicalDisk where "DriveType=3 or DriveType=2" get Name') do (
    for %%j in (%%i) do (
        for /f "delims=" %%k in ('2^>nul dir %%j\ /a-d /b /s^| findstr /e /i /l /c:"%ext:/=" /c:"%"') do (
            >>del2.log echo del /a /f "%%k"
        )
    )
)

endlocal
exit /b

.

n1gt 03-12-2016 21:54 2692660

Georgio, Все отлично, спасибо за решение!

Artym1 12-04-2019 17:40 2867574

Скажите, как изменить вышеуказанный скрипт, чтобы он искал не на всех логических дисках, а только на указанных, например - C:, D:
Я так понимаю, что нужно заменить сроку - ( wmic LogicalDisk where "DriveType=3" get Name), не могу понять на что. Спасибо.

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

@echo off
setlocal

set "ext=.txt/.log/.dat"

for /f "skip=1" %%i in ('wmic LogicalDisk where "DriveType=3 or DriveType=2" get Name') do (
    for %%j in (%%i) do (
        for /f "delims=" %%k in ('2^>nul dir %%j\ /a-d /b /s^| findstr /e /i /l /c:"%ext:/=" /c:"%"') do (
            >>del2.log echo del /a /f "%%k"
        )
    )
)

endlocal
exit /b


megaloman 13-04-2019 18:50 2867646

Artym1,
Код:

.........
rem        for /f "skip=1" %%i in ('wmic LogicalDisk where "DriveType=3 or DriveType=2" get Name') do (
        FOR %%i IN (C: D:) DO (
..........
..........


alpap 13-04-2019 23:36 2867670

если есть четкое условие, то не проще так (и явно быстрее как для cmd)
Код:

for /f "delims=" %%a in ('dir /a-d/b/s "C:\*.txt" "C:\*.log" "C:\*.dat" "D:\*.txt" "D:\*.log" "D:\*.dat"') do echo del "%%a"

megaloman 14-04-2019 08:25 2867682

alpap, Быстрее всего и проще
Код:

        FOR %%i IN (C: D:) DO For %%j IN ("log" "txt" "kuku") Do Echo Del /S "%%i\*.%%~j"
Ни этот вариант, ни Ваш ИМХО низзья!
Цитата:

Цитата n1gt
Например, я находил скрипты, где в списке перечислены "*.log", а при этом скрипт находил еще и файлы с расширением .log2 или .logged. »

Пример: dir *.xls выдаёт
Код:

Том в устройстве Z имеет метку Arhiv
 Серийный номер тома: F497-24CE

 Содержимое папки Z:\Box_In

14.04.2019  07:54                2 У попа была собака.xlsm
14.04.2019  07:54                2 У попа была собака.xlsx
14.04.2019  07:54                2 У попа была собака.xls
              3 файлов              6 байт
              0 папок  30*455*373*824 байт свободно

А del *.xls соответственно убивает все эти файлы.
Как вариант решения, можно добавить костыль в виде If для жесткой проверки расширения
Код:

@Echo Off
cls
        FOR %%i IN (C: D:) DO For %%j IN ("xls" "log" "txt" "kuku") Do (
                For /f "delims=" %%k in ('2^>nul Dir /A:-D /B /S "%%i\*.%%~j"') Do If /I ".%%~j"=="%%~xk" Echo Del "%%k"
        )
Pause
Exit /B


alpap 14-04-2019 18:33 2867723

Цитата:

Цитата megaloman
Цитата n1gt:
...
»

именно
а мы уже разбираем условие Artym1 и не факт что ему нужны такие же ограничения как у ТС.
Собственно поэтому и положено и рекомендуется создавать новую тему, а раздувать старую.

Iska 14-04-2019 22:47 2867763

Цитата:

Цитата n1gt
Прошу также уделить внимание тому, что должно быть строгое соответствие расширению. Например, я находил скрипты, где в списке перечислены "*.log", а при этом скрипт находил еще и файлы с расширением .log2 или .logged. »

Справедливости ради, это и было — строгое соответствие расширению. Абсолютно строгое:



8.3 filename - Wikipedia.

Это ещё что — как удаляются некоторые файлы, начинающиеся с кириллицы в имени, по какой-нибудь вполне невинной на первый взгляд маске «a*.doc». Ради интереса, можно выполнить команду, скажем:
Код:

dir /r "%UserProfile%\*~*.*"
и подивиться результатам.

P.S. Автору темы, конечно, уже давно всё равно.

Heavenanvil 18-03-2021 07:18 2953082

Извините, что раскопал динозавра.
А можете помочь с таким же скриптом, но уже для удаления не файлов, а папок?
То есть, чтобы можно было указать имена папок и поиск/удаление было по всем локальным дискам.

megaloman 18-03-2021 11:08 2953107

Код:

@Echo Off
cls
        Set DelBox="Удали папку 1" "Удали папку 2" "Удали папку 3"
        FOR /F "usebackq delims= " %%i IN (`"wmic logicaldisk where "drivetype^='3'" get caption | findstr.exe /C:":""`) DO (
                If /I Not %%i==C: (
                        Echo "%%i"
                        Pushd %%i\ &&(
                                For %%d In (%DelBox%) Do 2>nul Rd /S /Q %%d
                                For /f "usebackq delims=" %%d In (`2^>nul Dir %DelBox% /B /S /A:D`) Do 2>nul Rd /S /Q "%%d"
                                Popd
                        )
                )
        )
pause
Exit /B

Вводится список имен удаляемых папок (>=1 штук)
Я поставил в красной строке и в красной закрывающей скобке имя диска - исключения для просмотра диска C:
Эти красные строки можно удалить, но просмотр C: диска займёт очень большое время - решайте сами, оно Вам нужно?
Если таких исключений несколько, то можно в красной строке написать несколько If, например:
If /I Not %%i==C: If /I Not %%i==E: (

Heavenanvil 19-03-2021 06:34 2953218

megaloman, спасибо огромное. А можно сделать папки исключения, допустим сканировать диск C:, но не сканировать C:\Windows ?

megaloman 20-03-2021 00:42 2953385

Код:

@Echo Off
cls
        Set DelBox="Удали папку 1" "Удали папку 2" "Удали папку 3"
        Set ExcRoot="C:\Program Files" "C:\Users" "C:\Windows"
        Set ExcDisk=""

rem        Set ExcDisk="C:" "D:" "Z:"

        FOR /F "usebackq delims= " %%i IN (`"wmic logicaldisk where "drivetype^='3'" get caption | findstr.exe /C:":""`) DO (
                Call :RdDisk "%%i"
        )
pause
Exit /B

:RdDisk
        For %%j In (%ExcDisk%) Do If /I %1==%%j Exit /B
        Pushd "%~1\" &&(
                For %%j In (%DelBox%) Do 2>nul Rd /S /Q %%j
                Popd
        )
        For /f "usebackq delims=" %%j In (`2^>nul Dir "%~1\" /B /A:D`) Do Call :RdSub "%~1\%%j"
Exit /B

:RdSub
        For %%s In (%ExcRoot%) Do If /I %%s==%1 Exit /B 0
        Pushd "%~1\" &&(
                For %%s In (%DelBox%) Do 2>nul Rd /S /Q %%s
                For /f "usebackq delims=" %%s In (`2^>nul Dir %DelBox% /B /S /A:D`) Do 2>nul Rd /S /Q "%%s"
                Popd
        )
Exit /B



Время: 16:56.

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