14 ответов:
вы можете просто добавить размеры рекурсивно (ниже приведен пакетный файл):
@echo off set size=0 for /r %%x in (folder\*) do set /a size+=%%~zx echo %size% Bytesоднако, это имеет несколько проблем, потому что
cmdограничивается 32-разрядной целочисленной арифметикой со знаком. Так что он получит размеры выше 2 гиб неправильно1. Кроме того, он, вероятно, будет подсчитывать символические ссылки и соединения несколько раз, поэтому в лучшем случае это верхняя граница, а не истинный размер (у вас будет эта проблема с любым инструментом).альтернатива PowerShell:
Get-ChildItem -Recurse | Measure-Object -Sum Lengthили короче:
ls -r | measure -s Lengthесли вы хотите его красивее:
switch((ls -r|measure -s Length).Sum) { {$_ -gt 1GB} { '{0:0.0} GiB' -f ($_/1GB) break } {$_ -gt 1MB} { '{0:0.0} MiB' -f ($_/1MB) break } {$_ -gt 1KB} { '{0:0.0} KiB' -f ($_/1KB) break } default { "$_ bytes" } }вы можете использовать это непосредственно с
cmd:powershell -noprofile -command "ls -r|measure -s Length"
1 у меня есть частично законченная библиотека bignum в пакетных файлах где-то, которая, по крайней мере, получает право на целочисленное сложение произвольной точности. Я должен действительно освободить его, я думаю : -)
есть встроенный инструмент Windows для этого:
dir /s 'FolderName'это будет печатать много ненужной информации, но конец будет размер папки, как это:
Total Files Listed: 12468 File(s) 182,236,556 bytesЕсли вам нужно включить скрытые папки добавить
/a.
Я предлагаю скачать утилиту DU из пакета Sysinternals, предоставленного Microsoft по этой ссылке http://technet.microsoft.com/en-us/sysinternals/bb896651
usage: du [-c] [-l <levels> | -n | -v] [-u] [-q] <directory> -c Print output as CSV. -l Specify subdirectory depth of information (default is all levels). -n Do not recurse. -q Quiet (no banner). -u Count each instance of a hardlinked file. -v Show size (in KB) of intermediate directories. C:\SysInternals>du -n d:\temp Du v1.4 - report directory disk usage Copyright (C) 2005-2011 Mark Russinovich Sysinternals - www.sysinternals.com Files: 26 Directories: 14 Size: 28.873.005 bytes Size on disk: 29.024.256 bytesпока вы находитесь на нем, взгляните на другие утилиты. Они являются спасателем жизни для каждого профессионала Windows
Oneliner:
powershell -command "$fso = new-object -com Scripting.FileSystemObject; gci -Directory | select @{l='Size'; e={$fso.GetFolder($_.FullName).Size}},FullName | sort Size -Descending | ft @{l='Size [MB]'; e={'{0:N2} ' -f ($_.Size / 1MB)}},FullName"то же самое, но только Powershell:
$fso = new-object -com Scripting.FileSystemObject gci -Directory ` | select @{l='Size'; e={$fso.GetFolder($_.FullName).Size}},FullName ` | sort Size -Descending ` | ft @{l='Size [MB]'; e={'{0:N2} ' -f ($_.Size / 1MB)}},FullNameЭто должно привести к следующему результату:
Size [MB] FullName --------- -------- 580,08 C:\my\Tools\mongo 434,65 C:\my\Tools\Cmder 421,64 C:\my\Tools\mingw64 247,10 C:\my\Tools\dotnet-rc4 218,12 C:\my\Tools\ResharperCLT 200,44 C:\my\Tools\git 156,07 C:\my\Tools\dotnet 140,67 C:\my\Tools\vscode 97,33 C:\my\Tools\apache-jmeter-3.1 54,39 C:\my\Tools\mongoadmin 47,89 C:\my\Tools\Python27 35,22 C:\my\Tools\robomongo
Если у вас установлен git на вашем компьютере (становится все более распространенным) просто откройте MINGW32 и введите:
du folder
этот код проверен. Вы можете проверить это еще раз.
@ECHO OFF CLS SETLOCAL ::Get a number of lines contain "File(s)" to a mytmp file in TEMP location. DIR /S /-C | FIND "bytes" | FIND /V "free" | FIND /C "File(s)" >%TEMP%\mytmp SET /P nline=<%TEMP%\mytmp SET nline=[%nline%] ::------------------------------------- DIR /S /-C | FIND "bytes" | FIND /V "free" | FIND /N "File(s)" | FIND "%nline%" >%TEMP%\mytmp1 SET /P mainline=<%TEMP%\mytmp1 CALL SET size=%mainline:~29,15% ECHO %size% ENDLOCAL PAUSE
Я думаю, это будет работать только в том случае, если каталог довольно статичен и его содержимое не изменяется между выполнением двух команд dir. Возможно, способ объединить это в одну команду, чтобы избежать этого, но это сработало для моей цели (я не хотел полного списка; просто резюме).
GetDirSummary.bat скрипт:
@echo off rem get total number of lines from dir output FOR /F "delims=" %%i IN ('dir /S %1 ^| find "asdfasdfasdf" /C /V') DO set lineCount=%%i rem dir summary is always last 3 lines; calculate starting line of summary info set /a summaryStart="lineCount-3" rem now output just the last 3 lines dir /S %1 | more +%summaryStart%использование:
GetDirSummary.летучая мышь c:\temp
выход:
Total Files Listed: 22 File(s) 63,600 bytes 8 Dir(s) 104,350,330,880 bytes free
Я рекомендую использовать https://github.com/aleksaan/diskusage утилита. Очень просто и полезно. И очень быстро.
просто введите в командную строку
diskusage.exe -path 'd:/go; d:/Books'и получить список папок аранжировка в размере
1.| DIR: d:/go | SIZE: 325.72 Mb | DEPTH: 1 2.| DIR: d:/Books | SIZE: 14.01 Mb | DEPTH: 1этот пример был выполнен в 272ms на HDD.
вы можете увеличить глубину вложенных папок для анализа, например:
diskusage.exe -path 'd:/go; d:/Books' -depth 2и получить размеры не только для выбранных папки, но и подпапки
1.| DIR: d:/go | SIZE: 325.72 Mb | DEPTH: 1 2.| DIR: d:/go/pkg | SIZE: 212.88 Mb | DEPTH: 2 3.| DIR: d:/go/src | SIZE: 62.57 Mb | DEPTH: 2 4.| DIR: d:/go/bin | SIZE: 30.44 Mb | DEPTH: 2 5.| DIR: d:/Books/Chess | SIZE: 14.01 Mb | DEPTH: 2 6.| DIR: d:/Books | SIZE: 14.01 Mb | DEPTH: 1 7.| DIR: d:/go/api | SIZE: 6.41 Mb | DEPTH: 2 8.| DIR: d:/go/test | SIZE: 5.11 Mb | DEPTH: 2 9.| DIR: d:/go/doc | SIZE: 4.00 Mb | DEPTH: 2 10.| DIR: d:/go/misc | SIZE: 3.82 Mb | DEPTH: 2 11.| DIR: d:/go/lib | SIZE: 358.25 Kb | DEPTH: 2* 3,5 ТБ на сервере было проверено на наличие 3m12s
Я получил
du.exeС моим распределением git. Другое место может быть вышеупомянутым Microsoft или Unxutils.как только вы получили ду.exe на вашем пути. Вот твой
fileSizes.bat: -)@echo ___________ @echo DIRECTORIES @for /D %%i in (*) do @CALL du.exe -hs "%%i" @echo _____ @echo FILES @for %%i in (*) do @CALL du.exe -hs "%%i" @echo _____ @echo TOTAL @du.exe -sh "%CD%"➪
___________ DIRECTORIES 37M Alps-images 12M testfolder _____ FILES 765K Dobbiaco.jpg 1.0K testfile.txt _____ TOTAL 58M D:\pictures\sample
Я думаю, что ваш единственный вариант будет diruse (очень поддерживаемое решение 3rd party):
получить размер файла / каталога из командной строки
окна командной строки является unfortuntely довольно строгие, можно также установить программа который является мечтой использовать по сравнению с cmd. Это даст вам доступ к портированному инструменту Unix du, который является основой diruse на windows.
Извините, я не смог ответить на ваши вопросы напрямую с помощью команды вы можете запустить на собственном cli.
попробуй:
SET FOLDERSIZE=0 FOR /F "tokens=3" %A IN ('DIR "C:\Program Files" /a /-c /s ^| FINDSTR /C:" bytes" ^| FINDSTR /V /C:" bytes free"') DO SET FOLDERSIZE=%Aизменить C:\Program файлы в любую папку, которую вы хотите, и измените %A на %%A при использовании в пакетном файле
он возвращает размер всей папки, включая вложенные папки и скрытые и системные файлы, и работает с папками более 2GB
Он пишет на экране, поэтому вам придется использовать промежуточный файл, если вы этого не хотите.
Я решил аналогичную проблему. Некоторые из методов на этой странице медленны, а некоторые проблематичны в многоязычной среде (все они предполагают английский язык). Я нашел простой обходной путь с помощью vbscript в cmd. Он испытан в W2012R2 и W7.
>%TEMP%\_SFSTMP$.VBS ECHO/Set objFSO = CreateObject("Scripting.FileSystemObject"):Set objFolder = objFSO.GetFolder(%1):WScript.Echo objFolder.Size FOR /F %%? IN ('CSCRIPT //NOLOGO %TEMP%\_SFSTMP$.VBS') DO (SET "S_=%%?"&&(DEL %TEMP%\_SFSTMP$.VBS))Он установил переменную окружения S_. Вы можете, конечно, изменить последнюю строку, чтобы непосредственно отобразить результат, например
FOR /F %%? IN ('CSCRIPT //NOLOGO %TEMP%\_SFSTMP$.VBS') DO (ECHO "Size of %1 is %%?"&&(DEL %TEMP%\_SFSTMP$.VBS))вы можете использовать его как подпрограмму или как standlone cmd. Параметр-имя тестируемой папки, закрытой в двойные кавычки.
:: получить ряд строк, которые возвращает команда Dir (/- c для устранения разделителей чисел: . ,) ["Tokens = 3" смотреть только на третий столбец каждой строки в Dir]
FOR /F "tokens=3" %%a IN ('dir /-c "%folderpath%"') DO set /a i=!i!+1номер предпоследней строки, где находится количество байтов суммы файлов:
set /a line=%i%-1наконец, получить количество байтов в предпоследней строке 3 - го столбца:
set i=0 FOR /F "tokens=3" %%a IN ('dir /-c "%folderpath%"') DO ( set /a i=!i!+1 set bytes=%%a If !i!==%line% goto :size ) :size echo %bytes%поскольку он не использует поиск слов, он не будет иметь языка проблемы.
ограничения:
- работает только с папками размером менее 2 ГБ (cmd не обрабатывает номера более 32 бит)
- не считывает количество байтов внутренних папок.
самый простой способ получить только общий размер-powershell, но все же ограничен тем фактом, что имена путей длиной более 260 символов не включены в общий
Comments