Войти

Показать полную графическую версию : [решено] Поиск и удаление файлов по маске на всех локальных дисках


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

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

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

x0r
03-12-2016, 18:06
Прога Everything (http://forum.ru-board.com/topic.cgi?forum=5&start=120&topic=28686) и её консольная версия. один раз построил индекс(~минута), затем запрос в базу и удаление по списку. тулза умеет регулярки :
=>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
x0r, как Вы можете представить эту утилиту в моей задаче? Смысл строить индекс для файла, подлежащего удалению, а также в принципе использование стороннего ПО - я не вижу. Тем более, когда cmd может выполнить мою задачу на 100%...

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

NickM
03-12-2016, 19:21
батнегом ты будешь искать долго-и-нудно »
dir c:\*.sys /b /s /a-d

Georgio
03-12-2016, 20:04
Прошу также уделить внимание тому, что должно быть строгое соответствие расширению. Например, я находил скрипты, где в списке перечислены "*.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
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
Georgio, спасибо огромное! Ищет что надо и где надо!!
А сложно ли будет доработать скрипт так, чтобы он еще на съемных дисках (а-ля флешки и внешние винты) искал?

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

Georgio
03-12-2016, 21:04
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
Georgio, Все отлично, спасибо за решение!

Artym1
12-04-2019, 17:40
Скажите, как изменить вышеуказанный скрипт, чтобы он искал не на всех логических дисках, а только на указанных, например - 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
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
если есть четкое условие, то не проще так (и явно быстрее как для 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
alpap, Быстрее всего и проще FOR %%i IN (C: D:) DO For %%j IN ("log" "txt" "kuku") Do Echo Del /S "%%i\*.%%~j"
Ни этот вариант, ни Ваш ИМХО низзья!Например, я находил скрипты, где в списке перечислены "*.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
Цитата n1gt:
...
»
именно
а мы уже разбираем условие Artym1 и не факт что ему нужны такие же ограничения как у ТС.
Собственно поэтому и положено и рекомендуется создавать новую тему, а раздувать старую.

Iska
14-04-2019, 22:47
Прошу также уделить внимание тому, что должно быть строгое соответствие расширению. Например, я находил скрипты, где в списке перечислены "*.log", а при этом скрипт находил еще и файлы с расширением .log2 или .logged. »
Справедливости ради, это и было — строгое соответствие расширению. Абсолютно строгое:

https://i.imgur.com/no6rZrq.png

8.3 filename - Wikipedia (https://en.wikipedia.org/wiki/8.3_filename).

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

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

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

megaloman
18-03-2021, 11:08
@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
megaloman, спасибо огромное. А можно сделать папки исключения, допустим сканировать диск C:, но не сканировать C:\Windows ?

megaloman
20-03-2021, 00:42
@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




© OSzone.net 2001-2012