Узнать размер папки из командной строки Windows



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



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

1105   14  

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

    Ничего не найдено.