Получить размер папки из командной строки Windows

128

Возможно ли в Windows получить размер папки из командной строки без использования сторонних инструментов?

Мне нужен тот же результат, что и при щелчке правой кнопкой мыши по папке в проводнике Windows → свойства.

Эльдад Ассис
источник

Ответы:

121

Вы можете просто рекурсивно складывать размеры (это командный файл):

@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 -sum Length

Если хочешь красивее:

switch((ls -r|measure -sum 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 -sum Length"

1 У меня есть где-то в пакетных файлах частично законченная библиотека bignum, которая, по крайней мере, получает правильное целочисленное сложение произвольной точности. Думаю, мне стоит выпустить его :-)

детеныш
источник
+1 Я просто бродил по выводам get-help *, чтобы найти что-то подобное.
Стив
2
Стив, на мой взгляд, PowerShell намного более Unix-y, чем Unix, в том смысле, что большинство основных команд действительно ортогональны. В Unix duуказывается размер каталога, но все, что он делает, - это обход дерева и подведение итогов. То, что можно очень элегантно выразить в конвейере, как здесь :-). Поэтому для PowerShell я обычно ищу, как можно разложить цель высокого уровня на подходящие операции более низкого уровня.
Joey
3
Я вижу, похоже, таким образом скрытые папки игнорируются. ls -force -r работает, если я хочу также включить скрытые папки.
garg
2
folder\*у меня не работает размер папки, которую я поместил на место, показывает 0 байт. Есть ли какое-нибудь решение?
ИТ-исследователь
2
Немного лучше выглядит версия: powershell -noprofile -command "'{0: N0}' -f (ls -r | measure -s Length) .Sum"
zumalifeguard
120

Для этого есть встроенный инструмент Windows :

dir /s 'FolderName'

Это напечатает много ненужной информации, но в конечном итоге размер папки будет таким:

 Total Files Listed:
       12468 File(s)    182,236,556 bytes

Если вам нужно включить скрытые папки, добавьте /a.

Нир Дуан
источник
7
Это наиболее элегантное решение, если вам не требуется возвращаемое целочисленное значение. Примечание: переключатель '/ a' включает скрытые и системные файлы в общий размер.
Оран Д. Лорд
1
Я полагаю, что невозможно распечатать размеры файлов в некоторых более полезных единицах, таких как килобайт или мегабайт, верно?
Давид Ференци Рогожан
Двойные кавычки вместо одинарных.
user2924019
66

Я предлагаю скачать утилиту DU из пакета Sysinternals Suite, предоставленного 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 Professional.

Стив
источник
11
Думаю, это вряд ли «без сторонних инструментов».
Joey
11
Да ладно, но он подумал, что семью не следует рассматривать как «третью сторону».
Стив
1
Что ж, разрешено, но это все еще дополнительная загрузка (или использование, \\live.sysinternals.comесли она все еще существует). Я полностью согласен с тем, что все инструменты sysinternals должны быть включены по умолчанию. Хотя для многих применений PowerShell - вполне достойная замена.
Joey
1
Кто-то сказал Powershell? Попробуйте следующее: "{0: N2}" -f ((Get-ChildItem C: \ Temp -Recurse | Measure-Object -Property Length -Sum) .Sum / 1MB) + "MB"
John Homer
3
Я предлагаю вам скачать все, что разрабатывает Марк Руссинович :) Я постоянно вижу это имя всякий раз, когда нахожу инструмент, спасающий свою жизнь.
dkellner
46

Один лайнер:

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
frizik
источник
1
Есть ли способ показать все файлы и размер в мегабайтах в базовой папке? В данном случае `C: \ my \ Tools`
Томас
2
Плюс он ломается, когда есть много папок (например, на диске C
:)
0.00 C:\WindowsМогу ли я оптимизировать это для всех папок, пробовал уже запускать от имени администратора
Тило
это хорошо, но он обрезает имена папок моих компонентов. какая команда отображает их полностью?
sean.net
@ sean.net вы имеете в виду, что он заканчивается на "..." в случае длинных папок? Вот как работает ft( Format-Table). Вы можете попробовать flвместо этого ( Format-List)
frizik
16

Если на вашем компьютере установлен git (становится все чаще и чаще), просто откройте MINGW32 и введите: du folder

Custodio
источник
4
Вы можете использовать следующую команду, du -h -d 1 folder | sort -hесли хотите, чтобы размер был удобочитаемым, только один уровень подкаталогов и сортировка по размеру.
vard
8

Рекомендую использовать утилиту https://github.com/aleksaan/diskusage . Очень просто и полезно. И очень быстро.

Просто введите командную оболочку

diskusage.exe -path 'd:/go; d:/Books'

и получить список папок, упорядоченных по размеру

  1. | DIR: d: / go | РАЗМЕР: 325.72 Мб | ГЛУБИНА: 1
  2. | DIR: d: / Книги | РАЗМЕР: 14.01 Мб | ГЛУБИНА: 1

Этот пример был выполнен на жестком диске при 272 мсек .

Вы можете увеличить глубину вложенных папок для анализа, например:

diskusage.exe -path 'd:/go; d:/Books' -depth 2

и получать размеры не только для выбранных папок, но и для их подпапок

  1. | DIR: d: / go | РАЗМЕР: 325.72 Мб | ГЛУБИНА: 1
  2. | DIR: d: / go / pkg | РАЗМЕР: 212,88 Мб | ГЛУБИНА: 2
  3. | DIR: d: / go / src | РАЗМЕР: 62,57 Мб | ГЛУБИНА: 2
  4. | DIR: d: / go / bin | РАЗМЕР: 30,44 Мб | ГЛУБИНА: 2
  5. | DIR: d: / Книги / Шахматы | РАЗМЕР: 14.01 Мб | ГЛУБИНА: 2
  6. | DIR: d: / Книги | РАЗМЕР: 14.01 Мб | ГЛУБИНА: 1
  7. | DIR: d: / go / api | РАЗМЕР: 6.41 Мб | ГЛУБИНА: 2
  8. | DIR: d: / go / test | РАЗМЕР: 5.11 Мб | ГЛУБИНА: 2
  9. | DIR: d: / go / doc | РАЗМЕР: 4.00 Мб | ГЛУБИНА: 2
 10. | DIR: d: / go / misc | РАЗМЕР: 3.82 Мб | ГЛУБИНА: 2
 11. | DIR: d: / go / lib | РАЗМЕР: 358,25 Кб | ГЛУБИНА: 2

* 3.5 Тб на сервере просканировано 3 мин. 12 сек.

Александр Ануфриев
источник
Вышла новая версия! github.com/aleksaan/diskusage Улучшения: 1) корректная работа с размерами символических ссылок 2) текущая информация об анализируемых объектах
Александр Ануфриев
Вышла версия 2.0.2! github.com/aleksaan/diskusage/releases/tag/v2.0.2 - Файл конфигурации вместо встроенных параметров - Простой режим использования (скопируйте исполняемый файл diskusage в любую папку, запустите его и получите результаты) - Правильный вывод результатов (правильный выигрыш символа конца строки / unix) - Сохранить результаты в файл или получить их в консольном режиме (опция 'tofile')
Александр Ануфриев
Обратите внимание, что вы автор. (Из stackoverflow.com/help/promotion : «Однако вы должны раскрывать свою принадлежность к своим ответам». )
aeracode
6

Вот код PowerShell, который я пишу, чтобы указать размер списка и количество файлов для всех папок в текущем каталоге. Не стесняйтесь использовать повторно или изменять в соответствии с вашими потребностями.

$FolderList = Get-ChildItem -Directory
foreach ($folder in $FolderList)
{
    set-location $folder.FullName
    $size = Get-ChildItem -Recurse | Measure-Object -Sum Length
    $info = $folder.FullName + "    FileCount: " + $size.Count.ToString() + "   Size: " + [math]::Round(($size.Sum / 1GB),4).ToString() + " GB"
    write-host $info
}
Райан Ли
источник
Работает для меня. Полезно, если вы используете безголовый сервер.
Эндрю Пэйт
Просто и элегантно! Моя версия: $FolderList = Get-ChildItem -Directory -Force; $data = foreach ($folder in $FolderList) { set-location $folder.FullName; $size = Get-ChildItem -Recurse -Force | Measure-Object -Sum Length; $size | select @{n="Path"; e={$folder.Fullname}}, @{n="FileCount"; e={$_.count}}, @{n="Size"; e={$_.Sum}} } это предоставит объекты (больше Powershell-ish), FileCount и Size - целые числа (чтобы вы могли обработать их позже, если это необходимо), а Size - в байтах, но вы можете легко преобразовать его в ГБ (или желаемое устройство) с расширением $Data.Size / 1GB.
curropar
Или однострочный:$Data = dir -Directory -Force | %{ $CurrentPath = $_.FullName; Get-ChildItem $CurrentPath -Recurse -Force -ErrorAction SilentlyContinue | Measure-Object -Sum Length | select @{n="Path"; e={$CurrentPath}}, @{n="FileCount"; e={$_.count}}, @{n="Size"; e={$_.Sum}} }
curropar
2

Этот код протестирован. Вы можете проверить это еще раз.

@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
Chienvela
источник
Спасибо, у меня это работает с папками, размер которых меньше 1 ГБ, но, например, у меня есть папка размером 3 976 317 115 байт (3,70 ГБ), и сценарий возвращает мне эту строку ") 932", знаете почему?
elady
2

Я предполагаю, что это сработает только в том случае, если каталог достаточно статичен и его содержимое не меняется между выполнением двух команд 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.bat c: \ temp

Вывод:

 Total Files Listed:
          22 File(s)         63,600 bytes
           8 Dir(s)  104,350,330,880 bytes free
Стив
источник
1

Получил du.exeс моим дистрибутивом git. Другим местом может быть вышеупомянутый Microsoft или Unxutils .

Как только на вашем пути окажется файл du.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
Фрэнк Нок
источник
1

Я думаю, что вашим единственным вариантом будет diruse (стороннее решение с высокой поддержкой):

Получить размер файла / каталога из командной строки

К сожалению, интерфейс командной строки Windows довольно ограничен, в качестве альтернативы вы можете установить Cygwin, который является мечтой по сравнению с cmd. Это даст вам доступ к перенесенному Unix-инструменту du, который является основой diruse в Windows.

Извините, я не смог напрямую ответить на ваши вопросы с помощью команды, которую вы можете запустить на собственном клиенте.

Illizian
источник
1
Если вам просто нужно, duCygwin - это слишком. Просто используйте GnuWin32 .
Joey
2
Действительно, это излишество, но это также здорово. +1 за ваш пост над @joey (у меня нет представителя, чтобы сделать это буквально :()
Illizian
По моему скромному мнению, Cygwin может быть полезен для некоторых, но это далеко не круто и довольно ужасно. Но, полагаю, пользователи Unix говорят то же самое о Wine.
Joey
1
"вино" - дрожь, я использую Cygwin на своем ноутбуке для разработки, потому что время автономной работы ужасно под Linux и запускать на нем виртуальную машину неудобно. Это требует некоторой настройки, но Cygwin великолепен для тех из нас, кто скучает по оболочке nix в Windows, лично мне не нравится Powershell, но мне, возможно, придется проверить GnuWin. Спасибо, @Joey.
Illizian
1

:: Получить количество строк, возвращаемых командами 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 бит)
  • Не читает количество байтов внутренних папок.
Густаво Давико
источник
1

Пытаться:

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 Files на любую папку, которую вы хотите, и измените% A на %% A при использовании в пакетном файле

Он возвращает размер всей папки, включая подпапки, скрытые и системные файлы, и работает с папками размером более 2 ГБ.

Он записывает на экран, поэтому вам придется использовать промежуточный файл, если вы этого не хотите.

FrinkTheBrave
источник
1

Следующий скрипт можно использовать для получения и накопления размера каждого файла в данной папке.
Путь к папке %folder%может быть указан в качестве аргумента этого скрипта ( %1).
В конечном итоге результаты хранятся в параметре%filesize%

@echo off
SET count=1
SET foldersize=0
FOR /f "tokens=*" %%F IN ('dir /s/b %folder%') DO (call :calcAccSize "%%F")
echo %filesize%
GOTO :eof

:calcAccSize
 REM echo %count%:%1
 REM set /a count+=1
 set /a foldersize+=%~z1
 GOTO :eof

Примечание. Метод calcAccSizeтакже может распечатать содержимое папки (с комментариями в примере выше).

Лиор Киршнер
источник
1

Итак, вот решение для обоих ваших запросов в том виде, в котором вы изначально просили. Это обеспечит удобочитаемость файла без ограничений, с которыми все сталкиваются. Совместимость с Win Vista или новее. XP доступен, только если установлен Robocopy. Просто перетащите папку в этот командный файл или используйте лучший метод, упомянутый ниже.

@echo off
setlocal enabledelayedexpansion
set "vSearch=Files :"

For %%i in (%*) do (
    set "vSearch=Files :"
    For /l %%M in (1,1,2) do ( 
        for /f "usebackq tokens=3,4 delims= " %%A in (`Robocopy "%%i" "%%i" /E /L /NP /NDL /NFL ^| find "!vSearch!"`) do (
            if /i "%%M"=="1" (
                set "filecount=%%A"
                set "vSearch=Bytes :"
            ) else (
                set "foldersize=%%A%%B"
            )
        )
    )
    echo Folder: %%~nxi FileCount: !filecount! Foldersize: !foldersize!
    REM remove the word "REM" from line below to output to txt file
    REM echo Folder: %%~nxi FileCount: !filecount! Foldersize: !foldersize!>>Folder_FileCountandSize.txt
)
pause

Чтобы использовать этот командный файл, поместите его в папку SendTo. Это позволит вам щелкнуть правой кнопкой мыши папку или набор папок, выбрать параметр «Отправить», а затем выбрать этот командный файл.

Чтобы найти папку SendTo на вашем компьютере, самый простой способ - открыть cmd, а затем скопировать эту строку как есть.

explorer C:\Users\%username%\AppData\Roaming\Microsoft\Windows\SendTo

Жюль Верн
источник
Для всех, кто беспокоится, что Robocopy будет перемещать файлы ... не делайте этого. параметр / l только перечисляет. Кроме того, Robocopy не является сторонним разработчиком, Robocopy устанавливается в Windows по умолчанию, начиная с Vista и выше, вам необходимо установить его в XP.
Жюльсверн
Спасибо за добавление. Рад видеть, что эта тема все еще привлекает внимание ;-) Возможно, вы захотите добавить, как установить robocopy (отличный инструмент!).
Эльдад Ассис
0

Решил аналогичную проблему. Некоторые методы на этой странице медленные, а некоторые проблематичные в многоязычной среде (все предполагают английский). Я нашел простой обходной путь, используя 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))

Вы можете использовать его как подпрограмму или как отдельный cmd. Параметр - это имя тестируемой папки, заключенное в кавычки.

Арпи
источник
-3

Самый простой способ получить только общий размер - это PowerShell, но он все же ограничен тем, что пути длиной более 260 символов не включаются в общий размер.

луч
источник
2
Это плохой и плохой ответ. Что такое командная строка или код?
Татарин