Отримайте розмір папки з командного рядка Windows


128

Чи можливо в Windows отримати розмір папки з командного рядка без використання сторонніх інструментів?

Я хочу того ж результату, який ви отримали при натисканні правою кнопкою миші на папку в Windows Explorer → властивості.

Відповіді:


120

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

@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 Я просто блукав на виході з довідки *, щоб знайти щось подібне.
Стів

2
Стів, на моїх очах PowerShell набагато більше Unix-y, ніж Unix, оскільки більшість основних команд дійсно ортогональні. У Unix duдає розмір каталогу, але все, що він робить - це ходити по дереву та підбивати підсумки. Щось таке, що може бути вишукано виражене в конвеєрі, як тут :-). Тому для PowerShell я зазвичай шукаю, як ви можете розкласти ціль високого рівня на відповідні операції нижнього рівня.
Джої

3
Я бачу, начебто таким чином ігноруються приховані папки. ls -force -r працює, якщо я хочу також включати приховані папки.
garg

2
folder\*не працює для мене розмір папки, яку я помістив, показує 0 байт, чи є рішення?
ІТ-дослідник

2
Трохи краще виглядає версія: powershell -noprofile -command "'{0: N0}' -f (ls -r | міра -s довжина) .Sum"
zumalifeguard

120

Для цього є вбудований інструмент Windows :

dir /s 'FolderName'

Це надрукує багато непотрібної інформації, але кінцем буде розмір папки таким чином:

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

Якщо вам потрібно включити приховані папки, додайте /a.


7
Це найелегантніше рішення, якщо вам не потрібно ціле повернене значення. Примітка: перемикач '/ a' буде містити приховані та системні файли загальним розміром.
Оран Д. Лорд

1
Я думаю, що неможливо надрукувати розміри файлів у деяких більш корисних одиницях, наприклад, кБ або МБ, правда?
Девід Ференчі Рогожан

Подвійні лапки замість одиничних лапок.
користувач2924019

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
Це, навряд чи, "без стороннього інструменту".
Джой

11
Так, але вважалося, що сім'ю не слід вважати "третьою стороною".
Стів

1
Ну, на жаль, але це все-таки додаткове завантаження (або використання, \\live.sysinternals.comякщо воно все ще існує). Я щиро погоджуюся, що всі інструменти системних сімей повинні бути включені за замовчуванням. Хоча для багатьох застосувань PowerShell є цілком гідною заміною.
Joey

1
Хтось сказав Powershell? Спробуйте виконати наступне: "{0: N2}" -f ((Get-ChildItem C: \ Temp -Recurse | Вимірювання-об'єкт-Довжина властивості -Sum) .Sum / 1MB) + "MB"
Джон Гомер

3
Я пропоную всім завантажити все, що розробляє Марк Русинович :) Я продовжую бачити це ім'я кожного разу, коли знаходжу інструмент, що рятує моє життя.
dkellner

46

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

1
Чи є спосіб відобразити всі файли та розмір у Мб у базовій папці? У цьому випадку `C: \ my \ Tools`
Томас

2
Плюс це розривається, коли є багато папок (наприклад, у C: диск)
Raunak Thomas

0.00 C:\Windowsчи можу я оптимізувати це для всієї папки, спробував уже працювати як адміністратор
Tilo

це добре, але він обрізає мої назви папок компонентів. яка команда відображати їх цілком?
sean.net

@ sean.net, ти маєш на увазі, що він закінчується символом "..." у випадку довгих папок? Ось як ft( Format-Table) працює. Ви можете спробувати flзамість цього ( Format-List)
frizik

16

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


4
Ви можете використовувати таку команду, du -h -d 1 folder | sort -hякщо хочете читати людський розмір, лише один підкаталог та сортувати за розміром.
Вард

8

Рекомендую скористатися https://github.com/aleksaan/diskusage утилітою. Дуже просто і корисно. І дуже швидко.

Просто введіть командну оболонку

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

і отримати список папок, упорядкованих за розміром

  1. | DIR: d: / йти | РОЗМІР: 325,72 Мб | ГЛИБА: 1
  2. | DIR: d: / Книги | РОЗМІР: 14,01 Мб | ГЛИБА: 1

Цей приклад був виконаний на 272 мс на жорсткому диску.

Ви можете збільшити глибину папок для аналізу, наприклад:

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

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

  1. | DIR: d: / йти | РОЗМІР: 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: / йти / випробувати | РОЗМІР: 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 Kb | Глибина: 2

* 3.5Tb на сервері відскановано протягом 3m12s


Випущена нова версія! 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

Ось код коду, що записується, я записую до розміру списку та кількості файлів для всіх папок у поточному каталозі. Не соромтесь повторно використовувати або змінювати відповідно до ваших потреб.

$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}} }
однолінійний

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", ви знаєте, чому?
радісно

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 CLI незручно досить обмежувальний, ви можете альтернативно встановити Cygwin, який мріяти використовувати порівняно з cmd. Це дасть вам доступ до перенесеного інструменту Unix du, який є основою дируси на Windows.

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


1
Якщо вам просто потрібно, duто Cygwin - це шлях надмірності. Просто йдіть з GnuWin32 .
Joey

2
Дійсно, це надмірно, але це також приголомшливо. +1 для вашої публікації вище @joey (у вас немає відповіді, щоб це зробити буквально :()
Illizian

На мою скромну думку, Цигвін може бути корисним для деяких, але це далеко не дивовижно і досить жахливо. Але я думаю, що користувачі Unix говорять те саме про Wine.
Джой

1
"вино" - здригаюся, я використовую Cygwin на своєму ноутбуці, оскільки час роботи акумулятора жахливий під Linux і не зручно запускати на ньому VM. Це потребує певних налаштувань, але Cygwin є блискучим для тих серед нас, хто пропускає nix-оболонку в Windows, особисто мені не подобається Powershell. Можливо, мені доведеться перевірити GnuWin. Дякую @Joey
Іллізіян

1

:: Отримайте ряд рядків, які повертає команда Dir (/ -c для усунення розділювачів чисел:.,) ["Токени = 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: \ програмні файли на потрібну папку та змініть% 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, а потім вибрати цей пакетний файл.

Щоб знайти папку SendTo на своєму комп’ютері, найпростіший спосіб - це відкрити cmd, а потім скопіювати у цьому рядку як є.

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


Для тих, хто переживає Robocopy буде переміщувати файли .. не варто. опція / l перелічується лише Крім того, Robocopy не є третьою стороною, Robocopy встановлена ​​в Windows за замовчуванням з Vista up, XP вам потрібно її встановити.
julesverne

Дякую за доповнення Радий бачити, що ця тема все ще привертає увагу ;-) Можливо, хочеться додати, як встановити роботокопію (чудовий інструмент!).
Ельдад Ассіс

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

Найпростіший метод отримати лише загальний розмір - це shellhell, але все ще обмежений тим, що імена шляхів довжиною понад 260 символів не включаються до загальної кількості


2
Це погана і погана відповідь. Що таке командний рядок або код?
Татарін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.