Отримайте розмір папки з командного рядка 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.