PDA

Показать полную графическую версию : [решено] Вычисление общего размера файлов в каталоге


DOCznet
18-02-2015, 16:49
Есть большой-большой каталог с большим кол-вом подкаталогов, в некоторых из них есть подпапка "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 уровня выше.

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

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

DOCznet
18-02-2015, 17:30
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))

)

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

megaloman
19-02-2015, 11:49
Нужно вычислить сумму размера всех файлов в каталоге "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 байт

gora
19-02-2015, 12:29
Нужно вычислить сумму размера всех файлов в каталоге "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

Vadikan
19-02-2015, 13:24
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 (https://technet.microsoft.com/en-us/library/ff730945.aspx)

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

Vadikan
19-02-2015, 17:27
«коротко и просто» не выйдет: »
Выйдет. Дальше по конвейеру передавайте папки > ищите среди них папки с нужным именем > передавайте в 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

Iska
19-02-2015, 19:34
Так — выйдет.

DOCznet
02-03-2015, 10:27
Vadikan, большое спасибо, все посчиталось.




© OSzone.net 2001-2012