Показать полную графическую версию : [решено] Вычисление общего размера файлов в каталоге
Есть большой-большой каталог с большим кол-вом подкаталогов, в некоторых из них есть подпапка "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 уровня выше.
В чем я тут накосячил?
добавил в начало батника "SetLocal EnableDelayedExpansion" и пытался вывести "эхой" переменную через "!" знаки, вмест "%", но батник почти сразу "падал" после запуска. »
Покажите получившийся код.
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 байт
Нужно вычислить сумму размера всех файлов в каталоге "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
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)
Vadikan, «коротко и просто» не выйдет:
Есть большой-большой каталог с большим кол-вом подкаталогов, в некоторых из них есть подпапка "arch". »
«коротко и просто» не выйдет: »
Выйдет. Дальше по конвейеру передавайте папки > ищите среди них папки с нужным именем > передавайте в 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
Vadikan, большое спасибо, все посчиталось.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC