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

kelevara 29-04-2013 21:07 2141891

Определение суммарного объема файлов определенного типа
 
Доброго времени!
Необходимо в каталоге, который задан первым параметром, а также в его подкаталогах определить суммарный объем всех файлов, расширение которых задано вторым параметром.

За основу я взял текст программы, который был составлен тут:

Код:

@Echo Off
Set MyDir=C:\lab1\wingraf
Set Ras=.gif
Set Size = 0

Call :_subdir "%MyDir%"
Echo.
Echo All subdirs = %SubDirs%
Pause>Nul
Exit

:_subdir
For /D %%s In ("%~1\*") Do (
        if not %~Xa neq *.gif DO (
                %size% += %~Za )
        Echo %%s > nul
        Call :_subdir "%%~s"
)
GoTo :EOF

Но, как я понял, что-то я напутал в именах переменных в подпрограмме...

Georgio 29-04-2013 22:36 2141948

Код:

@Echo Off
Set MyDir=C:\lab1\wingraf
Set Ras=.gif

Call :_subdir %MyDir% %Ras%
Echo %Size%
Pause>Nul
Exit

:_subdir
For /R %1 %%s In (*) Do if %%~xs==%2 SET /A Size+=%%~zs
EXIT /B


Foreigner 29-04-2013 22:46 2141957

Цитата:

Цитата kelevara
%size% += %~Za »

Прекрасный метод для сложения пары *.avi
Код:

> set /a 2147483648+1                           
Неверное число. Числа ограничены 32 битами точности.

>

Пакетные файлы не предназначены для этих целей. PowerShell:

Код:

Param(
 
  [string] $Path,
  [string] $Extension

)

get-childitem "$Path\$Extension" -recurse | % { $size += $_.length }

$size


kelevara 29-04-2013 23:34 2141976

Foreigner, я бы и рад использовать что-то другое, python например, но таково задание =(

Foreigner 29-04-2013 23:37 2141979

Цитата:

Цитата kelevara
но таково задание =( »

Что это значит? Если домашка, то делай сам.

Ксеноинженер 29-04-2013 23:39 2141980

Код:

@Echo Off
Set MyDir=C:\lab1\wingraf
Set MyExt=gif
Set Size=0
for /f "tokens=*" %%I IN ('dir /b /s "%%MyDir%%\*.%%MyExt%%"') DO (
        set /a Size=Size+%%~zI/1024
        color 8E & echo %%I
)
cls
color 9 & Echo Файлы с расширением .%MyExt% в каталоге %MyDir%\ с подкаталогами имеют суммарный объём, равный %Size% Кбайт.
pause


kelevara 29-04-2013 23:42 2141984

Foreigner, не знаю, домашка или что-то другое. Друг попросил помочь разобраться.

severagent007 30-04-2013 01:49 2142020

kelevara, ну так чем ответGeorgio, :read: не устраивает? сразу чётко тебя исправили всё работает!

kelevara 30-04-2013 05:56 2142050

severagent007, я разве говорю, что меня что-то не устраивает? По сабжу - оба кода работают, какой из них выберет друг - не знаю.
Спасибо всем откликнувшимся!

gora 30-04-2013 14:44 2142296

Результат в байтах, размеры файлов значения не имеют:
Код:

@Echo Off
:: Кодировка Кириллица DOS (866)
Set MyDir=g:\Films
Set ext=avi

For /F "tokens=2*" %%i In ('Dir /s /-c "%MyDir%\*.%ext%" ^| Findstr " файлов"') Do Set size=%%j
Set size=%size: байт=%
Echo Общий размер всех файлов = %size% байт
Pause>Nul


Iska 30-04-2013 15:36 2142327

Я всё ждал, кто ж догадается использовать. В ожиданиях не ошибся ;). gora, а откуда там «0xff» берётся?

gora 30-04-2013 15:55 2142338

Цитата:

Цитата Iska
откуда там «0xff» берётся? »

Из вывода Dir, она табулирует триады цифр этим символом.

kiripanda 30-04-2013 16:20 2142352

разделитель отключается
Код:

Dir /-C

Iska 30-04-2013 17:23 2142400

У меня разделителем — обычная запятая (0x2c):
Код:

000000000000:  8E A1 E9 A8│A9 20 E0 A0│A7 AC A5 E0│20 A2 E1 A5  Общий размер все
000000000010:  E5 20 E4 A0│A9 AB AE A2│20 3D 20 32│39 31 2C 34  х файлов = 291,4
000000000020:  32 32 20 A1│A0 A9 E2 20│A1 A0 A9 E2│0D 0A        22 байт байт♪◙

А… Кажись, понял: зависит от региональных настроек, наверное.

megaloman 30-04-2013 20:20 2142501

Код:

@Echo Off
Set What=D:\Delete\*.mp3

SetLocal EnableExtensions EnableDelayedExpansion

Set /A Log=0
Set S1=
Set S2=

FOR /F "usebackq tokens=3" %%i IN (`dir "%What%" /S /-C 2^>nul`) DO (
        Set S2=!S1!
        Set S1=%%i
        Set /A Log=!Log!+1
)
If Not %Log% GTR 3 Set /A S2=0

Echo %S2%

Не берусь судить об универсальности предложенного, проверял на том, что оказалось под рукой: на русской Win 7, XP и английской 2008

Foreigner 01-05-2013 09:21 2142697

Про dir /-c совсем забыл

Можно немного изменить:
Код:

@echo off
setlocal

for /f "tokens=3" %%i in (' "dir /s /-c Folder\*.ext | findstr /v "[A-Z:]" | sort" ') do set "size=%%i"
echo %size%


Georgio 02-05-2013 20:55 2143447

Ноу-хау! Если cmd.exe не может подсчитывать гигабайтные размеры в байтах, то Robocopy.exe это спокойно делает:

Код:

@ECHO OFF
FOR /F "tokens=3" %%I IN ('ROBOCOPY Folder Folder *.avi /L /NFL /NDL /NJH /BYTES /S^|FINDSTR "Ѓ*©в"') DO ECHO %%I
PAUSE>nul

Folder - полный путь к папке, в которой надо подсчитать суммарный размер файлов с заданным расширением (в примере - *.avi). "Folder" повторено два раза, т. к. происходит условное копирование папки самой на себя.

/L - параметр составления списка вместо реального копирования.

/NFL /NDL - сам список файлов и папок не показывается.

/NJH - не выводится заголовок задания.

/BYTES - вывод размера в байтах (по умолчанию размер выводится в зависимости от "масштабности" результата - в байтах, килобайтах, мегабайтах, гигабайтах...).

/S - учитываются все подкаталоги.

Ѓ*©в - слово "Байт" в DOS (* - неотображающийся символ).


Время: 21:00.

Время: 21:00.
© OSzone.net 2001-