Получить размер папки из командной строки 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

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


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

Спасибо, у меня это работает с папками, размер которых меньше 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.

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


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 ГБ.

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


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
Это плохой и плохой ответ. Что такое командная строка или код?
— Татарин
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.