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

ilyadud 05-07-2012 07:22 1946161

Подсчет обьема файлов определенного расширения и их удаление
 
Здравствуйте! Пишу программу для чистки диска, но не могу решить одну проблему - мне необходимо найти файлы с расширением, например: *.old, удалить их, но при этом посчитать суммарный обьем удаленных файлов. Так проделать для нескольких расширений, а потом выдать обьем очищенного места на ЖД.

С удалением файлов я разобрался, а вот как посчитать общий обьем, не знаю.

Помогите! Буду благодарен!

megaloman 05-07-2012 13:31 1946341

Код:

@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


ilyadud 06-07-2012 09:59 1946941

Спасибо, конечно же за ответ. Но почему-то у меня данный скрипт не работает: просто не находит файлы. Пробовал указывать директорию, в которой, например, есть log-файлы, причем в переменную ставил .log

Просто выдает "Для продолжения нажмите на любую клавишу".

sov44 06-07-2012 10:31 1946968

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 1947028

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 1947037

sov44, ИМХО, Ваш способ суммирования в бат-файле опасен - при больших значениях (точно сейчас не упомню каких) батник суммировать не будет, именно поэтому я пытаюсь пользоваться результатами команды Dir (кстати, ИМХО, это быстрее получится, хотя и в ущерб универсальности для рус-англ систем)
Цитата:

Переменная %Rash% не переходит к следующему значению.
- я это решил посредством смены текущей папки с помощью cd /D для нужной папки. Далее в Dir работаю в текущей папке.

ilyadud, я подправил последнюю строку скрипта для информативности.
1. Возможно Вы неверно задали папку. Попробуйте, например, C:\
2. Возможно, батник набран не в 866 кодировке - проверьте, это существенно, так как анализируется наличие слова байт
3. Возможно, у Вас вовсе не русифицированное сообщение команды dir - сделайте, например, Dir c:\ >C:\aaa
Содержимое файла ааа хотелось бы увидеть. Придётся заменить слово байт на англ аналог.

У меня сделан только подсчет размеров, удаление надо произвести после этого.

ilyadud 06-07-2012 13:19 1947045

Всем спасибо!

sov44 06-07-2012 18:08 1947221

megaloman, к сожалению не понял Вашего кода и не смог применить к своему коду (первый код поста 4). Если не затруднит, добавьте пояснения в свой код. Интересно попробовать и сравнить быстродействие кодов :)

Anonymоus 06-07-2012 18:24 1947230

sov44, возможно, коллега megaloman имеет в виду вот это:
Код:

C:\>Set /A 3992768760+1
-302198535

C:\>Set /A 9992768760+1
Неверное число. Числа ограничены 32 битами точности.

При определённых, слишком больших значениях - происходит переполнение переменной и результат уходит в минус, либо выдается сообщение о ошибке.

sov44 06-07-2012 18:37 1947233

Цитата:

Цитата Anonymоus
При определённых, слишком больших значениях - происходит переполнение переменной и результат уходит в минус, »

Логов и темпов набрать на два гига, это надо постараться (2^30 - 1 = 2147483647 "2048 Mb." ) Скрипт очистки будет запускаться как минимум раз в месяц, столько не насобирается. Но это всё детали. Интересен сам факт возможного увеличения быстродействия.

megaloman 06-07-2012 20:34 1947277

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 1947327

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 забыл, но это не принципиально. Удаления не делал. У Вас конечно лучше совмещение удаления и подсчета места, у меня так сделать нельзя, но я заморачивался на том, что так суммировать размер файлов нежелательно (про объёмы файлов в постановке ничего не было)

Iska 07-07-2012 02:46 1947454

Цитата:

Цитата sov44
Логов и темпов набрать на два гига, это надо постараться »

Легко.

megaloman 07-07-2012 15:01 1947621

Переписал свой батник аккуратнее, чтобы не быть привязанным к языку выдачи команды 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 1947627

Цитата:

Цитата megaloman
Вообще-то команда Dir возвращает Errorlevel=1 если файлы не найдены. Мне не удалось его поймать, когда Dir помещена в For. Может, кто-то подскажет? »

Возможно, поможет такая конструкция?
Код:

For /F "delims=" %%A In ('Dir *.ext /B 2^>nul^|^|^(Echo Not found^&Set NotFound=1^)') Do (Echo %%A)


Время: 01:29.

Время: 01:29.
© OSzone.net 2001-