Показать полную графическую версию : [решено] Подсчет обьема файлов определенного расширения и их удаление
Здравствуйте! Пишу программу для чистки диска, но не могу решить одну проблему - мне необходимо найти файлы с расширением, например: *.old, удалить их, но при этом посчитать суммарный обьем удаленных файлов. Так проделать для нескольких расширений, а потом выдать обьем очищенного места на ЖД.
С удалением файлов я разобрался, а вот как посчитать общий обьем, не знаю.
Помогите! Буду благодарен!
megaloman
05-07-2012, 13:31
@Echo Off
cls
Set Where=F:\Директория
Set What=.exe .doc .xls .js .tif .ююю
Set W=%What:.=*.%
SetLocal EnableExtensions
SetLocal EnableDelayedExpansion
cd /D "%Where%"
Set First=Папка указана неверно
Set Second=%First%
IF %ERRORLEVEL%==0 (
Echo %Where%
FOR %%e IN (%What%) DO (
FOR /F "usebackq tokens=*" %%m IN (`dir *%%e /s`) DO Set First=!Second! & Set Second=%%m
Set M=!First:байт=!
If Not "!M!"=="!First!" Echo *%%e !First!
)
FOR /F "usebackq tokens=*" %%s IN (`dir %W% /s`) DO Set First=!Second! & Set Second=%%s
Set M=!First:байт=!
If Not "!M!"=="!First!" Echo %W% !First!
)
If "%Second%"=="Папка указана неверно" Echo %Second% %Where%
Pause
Спасибо, конечно же за ответ. Но почему-то у меня данный скрипт не работает: просто не находит файлы. Пробовал указывать директорию, в которой, например, есть log-файлы, причем в переменную ставил .log
Просто выдает "Для продолжения нажмите на любую клавишу".
ilyadud, попробуйте так
@Echo Off
SetLocal enabledelayedexpansion
set iSumL=0
set Rash=*.log;*.old;*.bak;*.temp;*.tmp;*.---;*._mp;*.syd;
For /F "Delims=" %%I In ('Dir c:\%Rash% /B/S/A:-D-H 2^>nul') Do (
2>&1 del /q "%%I" | 1>nul findstr "."
if errorlevel 1 (set /a iSumL +=%%~zI)
)
Echo !iSumL!
pause
У меня встречный вопрос к знатокам. Переменная %Rash% не переходит к следующему значению. В чём ошибка?
@echo off
SetLocal enabledelayedexpansion
set iSumG=0
set DRG="%USERPROFILE%\Local Settings\Application Data\Google\Chrome\User Data\Default"
set Rash="Current Session";"History";"History Index *-*";"Last Session";"Visited Links";"Archived History";
For /F "Delims=" %%I In ('Dir %DRG%\%Rash% /S/B/A:-D 2^>nul') Do (
set /a iSumG +=%%~zI
del /q "%%I" 2>nul
)
Set /A Cnt +=!iSumG!
echo %Cnt%
pause
Anonymоus
06-07-2012, 12:43
sov44, у вас путь в dir раскрывается примерно таким образом:
Dir "%USERPROFILE%\Local Settings\Application Data\Google\Chrome\User Data\Default"\"Current Session";"History";"History Index *-*";"Last Session";"Visited Links";"Archived History"; /S/B/A:-D 2>nul
И получается, что остальные директории кроме самой первой в %Rash%, отделённые ";" вы ищете в текущей, рабочей директории - где их естественно, нету. Для правильного разбора и подстановки попробуйте использовать этот фрагмент - по сути, это эмуляция For %%A In (xxx), только с заданием произвольного разделителя.
@Echo Off
SetLocal EnableDelayedExpansion
set DRG="%USERPROFILE%\Local Settings\Application Data\Google\Chrome\User Data\Default"
set Rash="Current Session";"History";"History Index *-*";"Last Session";"Visited Links";"Archived History";
:Jmp
For /F "tokens=1,* delims=;" %%A In ("!Rash!") Do (
If Not "%%A"=="" (
For /F "Delims=" %%I In ('Dir %DRG%\%%A /S/B/A:-D 2^>nul') Do (
Echo %%I
)
Set Rash=%%B&GoTo Jmp
)
)
Pause>Nul
megaloman
06-07-2012, 13:04
sov44, ИМХО, Ваш способ суммирования в бат-файле опасен - при больших значениях (точно сейчас не упомню каких) батник суммировать не будет, именно поэтому я пытаюсь пользоваться результатами команды Dir (кстати, ИМХО, это быстрее получится, хотя и в ущерб универсальности для рус-англ систем)
Переменная %Rash% не переходит к следующему значению. - я это решил посредством смены текущей папки с помощью cd /D для нужной папки. Далее в Dir работаю в текущей папке.
ilyadud, я подправил последнюю строку скрипта для информативности.
1. Возможно Вы неверно задали папку. Попробуйте, например, C:\
2. Возможно, батник набран не в 866 кодировке - проверьте, это существенно, так как анализируется наличие слова байт
3. Возможно, у Вас вовсе не русифицированное сообщение команды dir - сделайте, например, Dir c:\ >C:\aaa
Содержимое файла ааа хотелось бы увидеть. Придётся заменить слово байт на англ аналог.
У меня сделан только подсчет размеров, удаление надо произвести после этого.
megaloman, к сожалению не понял Вашего кода и не смог применить к своему коду (первый код поста 4). Если не затруднит, добавьте пояснения в свой код. Интересно попробовать и сравнить быстродействие кодов :)
Anonymоus
06-07-2012, 18:24
sov44, возможно, коллега megaloman имеет в виду вот это:
C:\>Set /A 3992768760+1
-302198535
C:\>Set /A 9992768760+1
Неверное число. Числа ограничены 32 битами точности.
При определённых, слишком больших значениях - происходит переполнение переменной и результат уходит в минус, либо выдается сообщение о ошибке.
При определённых, слишком больших значениях - происходит переполнение переменной и результат уходит в минус, »
Логов и темпов набрать на два гига, это надо постараться (2^30 - 1 = 2147483647 "2048 Mb." ) Скрипт очистки будет запускаться как минимум раз в месяц, столько не насобирается. Но это всё детали. Интересен сам факт возможного увеличения быстродействия.
megaloman
06-07-2012, 20:34
Set Where=F:\Директория - Задали директорию, где ищем файлы
Set What=.exe .doc .xls .js .tif .ююю - задали через пробел расширения файлов (с точкой впереди) (.ююю - для теста сделал несуществующее расширение)
Set W=%What:.=*.% - для Dir приготовили строку с масками *.exe *.doc *.xls *.js *.tif *.ююю
cd /D "%Where%" -заданную директорию сделал текущей
IF %ERRORLEVEL%==0 ( - Если это удалось, запускаю Dir в текущей директории для всех поддиректорий.
В постановке задачи было Так проделать для нескольких расширений, а потом выдать обьем очищенного места на ЖД.
Поэтому запускаю Dir для каждого расширения отдельно. При этом ловлю предпоследнюю строку выдачи Dir, где подсчитано кол-во файлов и их объём. Я не видел смысла превращать эту строку в число, очевидно, это просто сделать. Если файлов с указанным расширением не найдено, в выдаче Dir отсутствует слово байт (придумано, конечно, коряво)
Echo %Where%
FOR %%e IN (%What%) DO (
FOR /F "usebackq tokens=*" %%m IN (`dir *%%e /s`) DO Set First=!Second! & Set Second=%%m
Set M=!First:байт=!
If Not "!M!"=="!First!" Echo *%%e !First!
)
Этот кусок в принципе можно выбросить, если статистика по отдельным расширениям не интересна - это в разы ускорит выполнение.
Далее считаю общее число по всем заданным расширениям dir *.exe *.doc *.xls *.js *.tif *.ююю /s
FOR /F "usebackq tokens=*" %%s IN (`dir %W% /s`) DO Set First=!Second! & Set Second=%%s
Set M=!First:байт=!
If Not "!M!"=="!First!" Echo %W% !First!
Единственное, не пойму, что, код нерабочий? - у меня прекрасно работает.
sov44, Вы не указывали объёмы удаляемых файлов, один фильмец прекрасно перекроет 2Гига.
megaloman
06-07-2012, 22:22
sov44, По мотивам Вашего скрипта написал свой, начал сомневаться, что быстрее работает :sorry: @Echo Off
Set Where=F:\Папочка
cd /D "%Where%"
set Rash=*.exe *.doc *.xls *.js *.tif *.ююю
SetLocal EnableExtensions
SetLocal EnableDelayedExpansion
set iSumL=0
FOR /F "usebackq delims=" %%I IN (`dir %Rash% /s /b /A:-d-H`) DO Set /A iSumL=!iSumL!+%%~zI
Echo !iSumL! Errorlevel после CD забыл, но это не принципиально. Удаления не делал. У Вас конечно лучше совмещение удаления и подсчета места, у меня так сделать нельзя, но я заморачивался на том, что так суммировать размер файлов нежелательно (про объёмы файлов в постановке ничего не было)
Логов и темпов набрать на два гига, это надо постараться »
Легко.
megaloman
07-07-2012, 15:01
Переписал свой батник аккуратнее, чтобы не быть привязанным к языку выдачи команды Dir (слово байт больше не ловлю, анализирую кол-во строк в выдаче Dir)
Вообще-то команда Dir возвращает Errorlevel=1 если файлы не найдены. Мне не удалось его поймать, когда Dir помещена в For. Может, кто-то подскажет? Было бы существенно лучше.
@Echo Off
cls
Set Where=D:\Директория поиска
Set What=.exe .doc .xls .js .tif .ююю
Set W=%What:.=*.%
SetLocal EnableExtensions
SetLocal EnableDelayedExpansion
cd /D "%Where%"
Set First=Папка указана неверно
Set Second=%First%
IF %ERRORLEVEL%==0 (
Echo %Where%
FOR %%e IN (%What%) DO (
Set N=0
FOR /F "usebackq tokens=*" %%m IN (`dir *%%e /s 2^>nul`) DO Set First=!Second! & Set Second=%%m & Set /A N=!N!+1
If !N! GTR 4 (Echo *%%e !First!) Else (Echo *%%e Файлы не найдены)
)
Set N=0
FOR /F "usebackq tokens=*" %%s IN (`dir %W% /s 2^>nul`) DO Set First=!Second! & Set Second=%%s & Set /A N=!N!+1
If !N! GTR 4 (Echo %W% !First!) Else (Echo %W% Файлы не найдены)
) Else (
Echo %Second% %Where%
)
Pause
Anonymоus
07-07-2012, 15:15
Вообще-то команда Dir возвращает Errorlevel=1 если файлы не найдены. Мне не удалось его поймать, когда Dir помещена в For. Может, кто-то подскажет? »
Возможно, поможет такая конструкция?
For /F "delims=" %%A In ('Dir *.ext /B 2^>nul^|^|^(Echo Not found^&Set NotFound=1^)') Do (Echo %%A)
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.