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

DOCznet 18-02-2015 16:49 2472986

[решено] Вычисление общего размера файлов в каталоге
 
Есть большой-большой каталог с большим кол-вом подкаталогов, в некоторых из них есть подпапка "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 2473002

Цитата:

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

Покажите получившийся код.

DOCznet 18-02-2015 17:30 2473005

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 2473384

Цитата:

Нужно вычислить сумму размера всех файлов в каталоге "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 2473395

Цитата:

Цитата 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


Vadikan 19-02-2015 13:24 2473422

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

Iska 19-02-2015 14:14 2473451

Vadikan, «коротко и просто» не выйдет:
Цитата:

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


Vadikan 19-02-2015 17:27 2473549

Цитата:

Цитата 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


Iska 19-02-2015 19:34 2473593

Так — выйдет.

DOCznet 02-03-2015 10:27 2477728

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


Время: 21:16.

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