Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » Любой язык - [решено] Вычисление общего размера файлов в каталоге

Ответить
Настройки темы
Любой язык - [решено] Вычисление общего размера файлов в каталоге

Пользователь


Сообщения: 55
Благодарности: 2

Профиль | Отправить PM | Цитировать


Изменения
Автор: DOCznet
Дата: 18-02-2015
Есть большой-большой каталог с большим кол-вом подкаталогов, в некоторых из них есть подпапка "arch". Нужно вычислить сумму размера всех файлов в каталоге "arch" и его подкаталогах.

Использую след. скрипт:

Код: Выделить весь код
setlocal

@for /f "tokens=*" %%i in (' dir /b /s /ad "Z:\Dir1\Dir2\arch" ') do (

    pushd "%%i" || goto:eof
    for /f "tokens=*" %%k in (' dir /b /s /a-d "%%i" ') do (
	for /F "Delims=" %%j In (C:\tmpsz.txt) Do (
		Set /a tmpsz=%%~j+%%~zk
		@echo %tmpsz%>C:\tmpsz.txt))

)
C:\tmpsz.txt изначально изначально содержит один единственный символ - "0".

Загвоздка в том, что "эха" не выводит запрашиваемую переменную... вернее на момент попытки вывода запрошенной переменной она будто бы не записалась. Пробовал упрощенную конструкцию вида :

Код: Выделить весь код
set /a sz=0
...
...
...do (set /a sz=%%~zk+%sz%)
...
В таком случае переменная всегда берется заданная в самом начале и в последствии не изменяется

Подумал, что это как-то связано с глубиной циклов - добавил в начало батника "SetLocal EnableDelayedExpansion" и пытался вывести "эхой" переменную через "!" знаки, вмест "%", но батник почти сразу "падал" после запуска.

Так же пробовал "echo" выносить за скобки самого нижнего цикла на 1 и 2 уровня выше.

В чем я тут накосячил?

Отправлено: 16:49, 18-02-2015

 

Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата DOCznet:
добавил в начало батника "SetLocal EnableDelayedExpansion" и пытался вывести "эхой" переменную через "!" знаки, вмест "%", но батник почти сразу "падал" после запуска. »
Покажите получившийся код.

Отправлено: 17:20, 18-02-2015 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Пользователь


Сообщения: 55
Благодарности: 2

Профиль | Отправить PM | Цитировать


Iska,

Код: Выделить весь код
SetLocal EnableDelayedExpansion

@for /f "tokens=*" %%i in (' dir /b /s /ad "Z:\Dir1\Dir2\arch" ') do (

    pushd "%%i" || goto:eof
    for /f "tokens=*" %%k in (' dir /b /s /a-d "%%i" ') do (
	for /F "Delims=" %%j In (C:\tmpsz.txt) Do (
		Set /a tmpsz=%%~j+%%~zk
		@echo !tmpsz!>C:\tmpsz.txt))

)
Кажется так это было... т.е. более ничего не менял.

Отправлено: 17:30, 18-02-2015 | #3


Ветеран


Contributor


Сообщения: 2728
Благодарности: 1697

Профиль | Отправить PM | Цитировать


Цитата:
Нужно вычислить сумму размера всех файлов в каталоге "arch" и его подкаталогах.
Если надо получить итоговую сумму размеров файла каталога arch вместе с подкаталогами - вот вариант
Код: Выделить весь код
@Echo Off

Set "Where=G:\Games\"
Set "Out=%~dp0%~nx0.log"
Set "Arc=arch"

Del "%Out%" 2>Nul

SetLocal EnableExtensions EnableDelayedExpansion

For /F "Tokens=*" %%D In ('Dir "%Where%" /B /S /A:D 2^>nul') Do (
	If /I "%%~nxD"=="%Arc%" Call :Size "%%D"
)
GoTo :Eof

:Size

Set /A "Sum=0"
Set /A "SS=0"
FOR /F "tokens=1,2,3 usebackq" %%x IN (`Dir %1 /S /A 2^>nul`) DO (
	Set "Sum=                    !SS!"
	Set "SS=%%z"
)
Echo !Sum:~-19! %1 >>"%Out%"
Если надо получить размер файлов отдельно для каждого каталога внутри arch - вот вариант
Код: Выделить весь код
@Echo Off

Set "Where=G:\Games\"
Set "Out=%~dp0%~nx0.log"
Set "Arc=arch"

Del "%Out%" 2>Nul

SetLocal EnableExtensions EnableDelayedExpansion

For /F "Tokens=*" %%D In ('Dir "%Where%" /B /S /A:D 2^>nul') Do (
	If /I "%%~nxD"=="%Arc%" (
		Call :Size "%%D"
		For /F "Tokens=*" %%A In ('Dir "%%D" /B /S /A:D 2^>nul') Do Call :Size "%%A" 
	)
)
GoTo :Eof

:Size

Set /A "Sum=0"
Set /A "SS=0"
FOR /F "tokens=1,2,3 usebackq" %%x IN (`Dir %1 /A 2^>nul`) DO (
	Set "Sum=                    !SS!"
	Set "SS=%%z"
)
Echo !Sum:~-19! %1 >>"%Out%"
Подсчет суммы размеров файлов делает команда Dir, так как просто суммирование размеров будет работать, если эта сумма не более 2 147 483 647 байт

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 20-02-2015 в 10:30. Причина: Оптимизация

Это сообщение посчитали полезным следующие участники:

Отправлено: 11:49, 19-02-2015 | #4


Аватара для gora

Ушёл из жизни


Сообщения: 6021
Благодарности: 3491

Профиль | Отправить PM | Цитировать


Цитата DOCznet:
Нужно вычислить сумму размера всех файлов в каталоге "arch" и его подкаталогах. »
Код: Выделить весь код
@Echo Off
:: Кодировка Кириллица DOS (866)
Set MyDir=e:\Temp\1t

For /F "tokens=2*" %%i In ('Dir /s "%MyDir%" ^| Findstr " файлов"') Do Set size=%%j
Set size=%size: байт=%
:: В следующей строке не пробел, а код FFh
Set size=%size: =%
Echo Общий размер всех файлов = %size% байт
Pause>Nul

Отправлено: 12:29, 19-02-2015 | #5


(*.*)


Сообщения: 36557
Благодарности: 6694

Профиль | Сайт | Отправить PM | Цитировать


PowerShell (коротко и просто)
Код: Выделить весь код
Get-ChildItem Z:\Dir1\Dir2\arch -recurse | Measure-Object -property length -sum
в мегабайтах:
Код: Выделить весь код
$colItems = (Get-ChildItem Z:\Dir1\Dir2\arch -recurse | Measure-Object -property length -sum)
"{0:N2}" -f ($colItems.sum / 1MB) + " MB"
Windows PowerShell Tip: Determining the Size of a Folder

-------
Канал Windows 11, etc | Чат @winsiders

Это сообщение посчитали полезным следующие участники:

Отправлено: 13:24, 19-02-2015 | #6


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Vadikan, «коротко и просто» не выйдет:
Цитата DOCznet:
Есть большой-большой каталог с большим кол-вом подкаталогов, в некоторых из них есть подпапка "arch". »

Отправлено: 14:14, 19-02-2015 | #7


(*.*)


Сообщения: 36557
Благодарности: 6694

Профиль | Сайт | Отправить PM | Цитировать


Цитата Iska:
«коротко и просто» не выйдет: »
Выйдет. Дальше по конвейеру передавайте папки > ищите среди них папки с нужным именем > передавайте в gci > считайте размер всех файлов с measure
Код: Выделить весь код
Get-ChildItem C:\StartFolder\ -recurse | Where-Object {$_.PSIsContainer -eq $True} | `
Where-Object {$_.Name -eq "arch"} | Get-ChildItem -recurse | Measure-Object -property length -sum

-------
Канал Windows 11, etc | Чат @winsiders

Это сообщение посчитали полезным следующие участники:

Отправлено: 17:27, 19-02-2015 | #8


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Так — выйдет.

Отправлено: 19:34, 19-02-2015 | #9


Пользователь


Сообщения: 55
Благодарности: 2

Профиль | Отправить PM | Цитировать


Vadikan, большое спасибо, все посчиталось.

Отправлено: 10:27, 02-03-2015 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » Любой язык - [решено] Вычисление общего размера файлов в каталоге

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Любой язык - [решено] Архивирование файлов в каталоге Tonny_Bennet Скриптовые языки администрирования Windows 53 11-01-2015 13:11
CMD/BAT - [решено] Скрипт очищения файлов в каталоге. Помогите Alexander1989 Скриптовые языки администрирования Windows 4 11-07-2014 13:44
CMD/BAT - [решено] Список файлов в каталоге и подкаталогах foma24 Скриптовые языки администрирования Windows 8 22-12-2013 19:58
Любой язык - [решено] Распределение файлов в каталоге Тишина Скриптовые языки администрирования Windows 2 26-04-2013 17:09
[решено] Файлы большого размера (место в каталоге) semenK Общий по FreeBSD 8 17-01-2006 20:09




 
Переход