Показать полную графическую версию : [решено] Определение суммарного объема файлов определенного типа
kelevara
29-04-2013, 21:07
Доброго времени!
Необходимо в каталоге, который задан первым параметром, а также в его подкаталогах определить суммарный объем всех файлов, расширение которых задано вторым параметром.
За основу я взял текст программы, который был составлен тут (http://forum.oszone.net/thread-259451.html):
@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
Но, как я понял, что-то я напутал в именах переменных в подпрограмме...
@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
%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
Foreigner, я бы и рад использовать что-то другое, python например, но таково задание =(
Foreigner
29-04-2013, 23:37
но таково задание =( »
Что это значит? Если домашка, то делай сам.
Ксеноинженер
29-04-2013, 23:39
@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
Foreigner, не знаю, домашка или что-то другое. Друг попросил помочь разобраться.
severagent007
30-04-2013, 01:49
kelevara, ну так чем ответGeorgio, :read: не устраивает? сразу чётко тебя исправили всё работает!
kelevara
30-04-2013, 05:56
severagent007, я разве говорю, что меня что-то не устраивает? По сабжу - оба кода работают, какой из них выберет друг - не знаю.
Спасибо всем откликнувшимся!
Результат в байтах, размеры файлов значения не имеют:@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
Я всё ждал, кто ж догадается использовать. В ожиданиях не ошибся ;). gora, а откуда там «0xff» берётся?
откуда там «0xff» берётся? »
Из вывода Dir, она табулирует триады цифр этим символом.
kiripanda
30-04-2013, 16:20
разделитель отключается
Dir /-C
У меня разделителем — обычная запятая (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
@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
Про 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%
Ноу-хау! Если 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 (* - неотображающийся символ).
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.