Возможно ли в Windows получить размер папки из командной строки без использования какого-либо стороннего инструмента?
Я хочу получить тот же результат, что и при щелчке правой кнопкой мыши по папке в проводнике Windows. Свойства.
Возможно ли в Windows получить размер папки из командной строки без использования какого-либо стороннего инструмента?
Я хочу получить тот же результат, что и при щелчке правой кнопкой мыши по папке в проводнике Windows. Свойства.
Вы можете просто добавить размеры рекурсивно (следующий пакетный файл):
@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 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
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
Я рекомендую использовать 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.5Tb на сервере было проверено на 3m12s
Вот код 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
}
Этот код проверен. Вы можете проверить его еще раз.
@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 Script:
@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
Я думаю, что ваш единственный вариант будет diruse (очень поддерживаемое стороннее решение):
Получить размер файла/каталога из командной строки
Windows CLI, к сожалению, довольно ограничительный, вы можете альтернативно установить Cygwin, который является мечтой использовать по сравнению с cmd. Это даст вам доступ к портированному инструменту Unix du, который лежит в основе diruse на окнах.
Извините, что я не смог ответить на ваши вопросы напрямую командой, которую вы можете запустить на родном кли.
Я получил 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
:: Получить несколько строк, возвращаемых командами Dir (/-c, чтобы устранить разделители чисел:.,) [ "Токены = 3" смотреть только на третий столбец каждой строки в Dir]
FOR /F "tokens=3" %%a IN ('dir /-c "%folderpath%"') DO set /a i=!i!+1
Номер предпоследней строки, где указано количество байтов суммы файлов:
set /a line=%i%-1
Наконец, получим количество байтов в предпоследней строке - третий столбец:
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%
Поскольку он не использует поиск по словам, у него не будет проблем с языком.
Ограничения:
Try:
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 ГБ
Он записывает на экран, поэтому вам придется использовать промежуточный файл, если вы этого не хотите.
Следующий скрипт может быть использован для получения и накопления размера каждого файла в данной папке.
Путь к папке %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
также может распечатывать содержимое папки (прокомментировано в примере выше)
Итак, вот решение для ваших запросов так, как вы изначально просили. Это обеспечит читабельность файлов без ограничений по размеру файлов, с которыми сталкивается каждый. Совместим с 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 на вашем компьютере, проще всего открыть cmd и скопировать в эту строку как есть.
explorer C:\Users\%username%\AppData\Roaming\Microsoft\Windows\SendTo
Я решил аналогичную проблему. Некоторые из методов на этой странице медленны, а некоторые из них проблематичны в многоязычной среде (все предполагают английский). Я нашел простой обходной путь, используя 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. Параметр - имя тестируемой папки, закрытой в кавычках.
Самый простой способ получить только общий размер - это powershell, но все же ограничен тем, что имена путей длиной более 260 символов не включены в общий