Windows Komut Satırından Klasör Boyutunu Alın


128

Windows'ta herhangi bir üçüncü taraf aracı kullanmadan komut satırından bir klasörün boyutunu almak mümkün müdür?

Windows explorer → özelliklerinde klasöre sağ tıkladığınızda elde edeceğiniz sonucun aynısını istiyorum.

Yanıtlar:


121

Sadece tekrarlı olarak boyut ekleyebilirsiniz (aşağıdaki bir toplu iş dosyasıdır):

@echo off
set size=0
for /r %%x in (folder\*) do set /a size+=%%~zx
echo %size% Bytes

Bununla birlikte, cmd32 bitlik işaretli tamsayı aritmetiğiyle sınırlı olduğu için bunun birkaç sorunu vardır . Yani 2 GiB'nin üzerinde yanlış boyutlar alacaktır 1 . Dahası, muhtemelen sembolik bağları ve kavşakları birden çok kez sayacaktır, bu nedenle en iyi ihtimalle gerçek boyut değil, üst sınırdır (yine de herhangi bir araçta bu sorunu yaşarsınız).

PowerShell bir alternatiftir:

Get-ChildItem -Recurse | Measure-Object -Sum Length

veya daha kısa:

ls -r | measure -sum Length

Daha güzel olmasını istiyorsanız:

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" }
}

Bunu doğrudan şuradan kullanabilirsiniz cmd:

powershell -noprofile -command "ls -r|measure -sum Length"

1 Toplu iş dosyalarında, en azından keyfi hassasiyette tamsayı toplama hakkı sağlayan, kısmen tamamlanmış bir bignum kitaplığım var. Gerçekten yayınlamalıyım, sanırım :-)


+1 Böyle bir şey bulmak için get-help * çıktısında dolaşıyordum.
Steve

2
Steve, bence PowerShell, çoğu temel komutun gerçekten ortogonal olması açısından Unix'ten çok daha fazla Unix-y'dir. Unix'te dudizin boyutu verir, ancak tek yaptığı ağaçta yürümek ve özetlemek. Burada olduğu gibi bir ardışık düzen içinde çok zarif bir şekilde ifade edilebilecek bir şey :-). Dolayısıyla, PowerShell için genellikle üst düzey hedefi uygun alt düzey işlemlere nasıl ayrıştırabileceğinizi araştırırım.
Joey

3
Görüyorum ki, gizli klasörleri bu şekilde görmezden geliyor gibi. Gizli klasörleri de dahil etmek istersem ls -force -r çalışır.
2013

2
folder\*benim için çalışmıyor yerine koyduğum klasörün boyutu 0 bayt gösteriyor, herhangi bir çözüm var mı?
BT araştırmacısı

2
Biraz daha iyi görünen bir sürüm: powershell -noprofile -command "'{0: N0}' -f (ls -r | measure -s Length) .Sum"
zumalifeguard

120

Bunun için yerleşik bir Windows aracı var:

dir /s 'FolderName'

Bu, çok fazla gereksiz bilgiyi yazdıracaktır, ancak sonuç şu şekilde klasör boyutu olacaktır:

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

Gizli klasörler eklemeniz gerekiyorsa ekleyin /a.


7
Bir tamsayı dönüş değeri istemiyorsanız bu en zarif çözümdür. Not: '/ a' anahtarı, gizli dosyaları ve sistem dosyalarını toplam boyutta içerecektir.
Oran D. Lord

1
Dosya boyutlarını kB veya MB gibi bazı daha kullanışlı birimlerde yazdırmak mümkün değil, değil mi?
David Ferenczy Rogožan

Tek tırnak yerine çift tırnak.
kullanıcı2924019

66

Sysinternals Suite bu bağlantıdaki Microsoft tarafından sağlanan I indirme programı DU önermek 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

Siz oradayken, diğer yardımcı programlara bir göz atın. Her Windows Professional için hayat kurtarıcıdırlar


11
Sanırım bu neredeyse "herhangi bir üçüncü taraf aracı olmadan".
Joey

11
Doğru, ama ailenin '3. şahıs' olarak görülmemesi gerektiğini düşündü.
Steve

1
Verildi, ancak yine de ek bir indirme (veya \\live.sysinternals.comhala mevcutsa kullanıyor). Yine de tüm sysinternals araçlarının varsayılan olarak dahil edilmesi gerektiğine yürekten katılıyorum. Birçok kullanım için PowerShell oldukça değerli bir alternatiftir.
Joey

1
Birisi Powershell mi dedi? Şunu deneyin: "{0: N2}" -f ((Get-ChildItem C: \ Temp -Recurse | Measure-Object -Property Length -Sum) .Sum / 1MB) + "MB"
John Homer

3
Mark Russinovich'in geliştirdiği her şeyi indirmenizi öneririm :) Hayatımı kurtaran bir araç bulduğumda bu ismi görmeye devam ediyorum.
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"

Aynı ancak yalnızca 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

Bu, aşağıdaki sonucu vermelidir:

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
Temel klasördeki tüm dosyaları ve boyutu Mb cinsinden göstermenin bir yolu var mı? Bu durumda `C: \ my \ Tools`
Raunak Thomas

2
Ayrıca çok sayıda klasör olduğunda kırılıyor (Örneğin C: sürücüsünde)
Raunak Thomas

0.00 C:\Windowsbunu tüm klasörler için optimize edebilir miyim, zaten yönetici olarak çalıştırmayı denedim
Tilo

bu iyi ama bileşen klasör isimlerimi kesiyor. bunları tamamen gösterme komutu nedir?
sean.net

@ sean.net, uzun klasörler olması durumunda "..." ile biteceğini mi kastediyorsunuz? ft( Format-Table) Böyle çalışır. Bunun flyerine deneyebilirsiniz ( Format-List)
frizik

16

Bilgisayarınızda git yüklüyse (gittikçe yaygınlaşıyor) MINGW32'yi açın ve şunu yazın: du folder


4
du -h -d 1 folder | sort -hİnsan tarafından okunabilir bir boyut, yalnızca bir alt dizin düzeyi ve boyuta göre sıralama istiyorsanız , aşağıdaki komutu kullanabilirsiniz .
2019

8

Https://github.com/aleksaan/diskusage kullanmanızı tavsiye ederim yardımcı programını . Çok basit ve yardımsever. Ve çok hızlı.

Sadece bir komut kabuğu yazın

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

ve boyuta göre düzenlenmiş klasörlerin listesini alın

  1. | DIR: d: / git | BOYUT: 325.72 Mb | DERİNLİK: 1
  2. | DIR: d: / Kitaplar | BOYUT: 14.01 Mb | DERİNLİK: 1

Bu örnek, HDD üzerinde 272 ms'de yürütüldü .

Analiz edilecek alt klasörlerin derinliğini artırabilirsiniz, örneğin:

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

ve yalnızca seçilen klasörler için değil, aynı zamanda alt klasörleri için de boyutlar alın

  1. | DIR: d: / git | BOYUT: 325.72 Mb | DERİNLİK: 1
  2. | DIR: d: / go / pkg | BOYUT: 212.88 Mb | DERİNLİK: 2
  3. | DIR: d: / go / src | BOYUT: 62.57 Mb | DERİNLİK: 2
  4. | DIR: d: / go / bin | BOYUT: 30.44 Mb | DERİNLİK: 2
  5. | DIR: d: / Kitaplar / Satranç | BOYUT: 14.01 Mb | DERİNLİK: 2
  6. | DIR: d: / Kitaplar | BOYUT: 14.01 Mb | DERİNLİK: 1
  7. | DIR: d: / go / api | BOYUT: 6.41 Mb | DERİNLİK: 2
  8. | DIR: d: / go / test | BOYUT: 5.11 Mb | DERİNLİK: 2
  9. | DIR: d: / go / doc | BOYUT: 4.00 Mb | DERİNLİK: 2
 10. | DIR: d: / go / misc | BOYUT: 3.82 Mb | DERİNLİK: 2
 11. | DIR: d: / go / lib | BOYUT: 358.25 Kb | DERİNLİK: 2

* Sunucudaki 3,5Tb 3m12s için tarandı


Yeni sürüm yayınlandı! github.com/aleksaan/diskusage İyileştirmeler : 1) symlink boyutlarıyla doğru çalışma 2) analiz edilen nesneler hakkında genel bilgiler
Alexander Anufriev

Sürüm 2.0.2 yayınlandı! github.com/aleksaan/diskusage/releases/tag/v2.0.2 - Konfigürasyon dosyası yerine satır içi parametreler - Basit kullanım modu (yürütülebilir disk kullanımını herhangi bir klasöre kopyalayın, çalıştırın ve sonuçları alın) - Doğru sonuç çıkışı (doğru satır sonu sembolü kazanır / unix) - Sonuçları dosyaya kaydet veya konsol modunda al ('dosya' seçeneği)
Alexander Anufriev

Lütfen bir yazar olduğunuzu unutmayın. (Gönderen stackoverflow.com/help/promotion : "Bununla birlikte, yanıtlarınıza ilişkinizi açıklamak zorundadır." )
aeracode

6

İşte mevcut dizindeki tüm klasörler için liste boyutuna ve dosya sayısına yazdığım bir powershell kodu geliyor. İhtiyaçlarınıza göre yeniden kullanmaktan veya değiştirmekten çekinmeyin.

$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
}

Benim için çalışıyor. Başsız bir sunucu üzerindeyseniz kullanışlıdır.
andrew pate

Basit ve zarif! Benim $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}} } sürümüm : Bu, nesneler (daha fazla Powershell-ish), 'FileCount' ve 'Size' tamsayılardır (böylece gerekirse bunları daha sonra işleyebilirsiniz) ve 'Boyut' bayt cinsindendir, ancak bunu kolayca GB (veya istediğiniz birim) ile $Data.Size / 1GB.
curropar

Veya tek $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}} }
satırlık

2

Bu kod test edilmiştir. Tekrar kontrol edebilirsiniz.

@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

Teşekkürler, 1GB'tan küçük klasörlerle benim için çalışıyor, ancak örneğin, 3.976.317.115 baytlık (3.70GB) bir klasörüm var ve komut dosyası bana bu dizeyi ") 932" döndürüyor, nedenini biliyor musunuz?
elady

2

Sanırım bu sadece dizin oldukça durağansa ve içeriği iki dir komutunun yürütülmesi arasında değişmiyorsa işe yarar. Belki bundan kaçınmak için bunu tek bir komutta birleştirmenin bir yolu, ancak bu benim amacım için işe yaradı (tam listeyi istemedim; sadece özet).

GetDirSummary.bat Komut Dosyası:

@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%

Kullanımı:

GetDirSummary.bat c: \ temp

Çıktı:

 Total Files Listed:
          22 File(s)         63,600 bytes
           8 Dir(s)  104,350,330,880 bytes free

1

du.exeGit dağıtımımla aldım . Başka bir yer yukarıda belirtilen Microsoft veya Unxutils olabilir .

Du.exe'yi yolunuza aldıktan sonra. İşte 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

Tek seçeneğinizin diruse olacağını düşünüyorum (oldukça desteklenen bir 3. taraf çözümü):

Komut satırından dosya / dizin boyutunu alın

Windows CLI maalesef oldukça kısıtlayıcıdır, alternatif olarak Cygwin'i kurabilirsiniz. kıyasla kullanmak için bir rüya olan . Bu, pencerelerdeki diruse temelini oluşturan ported Unix tool du'ya erişmenizi sağlar.

Özür dilerim, sorularınızı doğrudan yerel cli'de çalıştırabileceğiniz bir komutla yanıtlayamadım.


1
Sadece ihtiyacınız duvarsa, Cygwin fazlasıyla abartılıdır. Sadece GnuWin32 ile gidin .
Joey

2
Aslında aşırıdır, ama aynı zamanda harika. @Joey üzerindeki yayınınız için +1 (bunu tam anlamıyla yapacak bir temsilci yok :()
Illizian

Benim mütevazı görüşüme göre, Cygwin bazıları için yararlı olabilir, ancak müthiş ve oldukça korkunç olmaktan uzak. Ama sanırım Unix kullanıcıları Wine için de aynı şeyi söylüyor.
Joey

1
"wine" - titreme, Cygwin'i geliştirme dizüstü bilgisayarımda kullanıyorum çünkü pil ömrü linux altında korkunç ve üzerinde bir VM çalıştırmak uygun değil. Kurulum biraz zaman alıyor, ancak Cygwin, Windows'ta nix kabuğunu özleyen aramızdaki kişiler için harika, kişisel olarak Powershell'i sevmiyorum GnuWin'i kontrol etmem gerekebilir. Teşekkürler @ Joey.
Illizian

1

:: Dir komutlarının döndürdüğü bir dizi satırı al (/ -c sayı ayırıcılarını ortadan kaldırmak için:.,) ["Belirteç = 3" Dir'deki her satırın yalnızca üçüncü sütununa bakmak için]

FOR /F "tokens=3" %%a IN ('dir /-c "%folderpath%"') DO set /a i=!i!+1

Sondan bir önceki satırın numarası, burada dosyaların toplamının bayt sayısı:

set /a line=%i%-1

Son olarak, sondan bir önceki satırdaki bayt sayısını alın - 3. sütun:

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%

Kelime aramayı kullanmadığı için dil problemi yaşamaz.

Sınırlamalar:

  • Yalnızca 2 GB'den küçük klasörlerle çalışır (cmd, 32 bitten büyük sayıları işlemez)
  • Dahili klasörlerin bayt sayısını okumaz.

1

Deneyin:

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'ı istediğiniz klasöre değiştirin ve bir toplu iş dosyasında kullanıyorsanız% A'yı %% A olarak değiştirin

Alt klasörler, gizli dosyalar ve sistem dosyaları dahil olmak üzere tüm klasörün boyutunu döndürür ve 2 GB üzerindeki klasörlerle çalışır

Ekrana yazıyor, bu yüzden istemiyorsanız bir ara dosya kullanmanız gerekecek.


1

Aşağıdaki komut dosyası, her dosyanın boyutunu belirli bir klasör altında toplamak ve toplamak için kullanılabilir.
Klasör yolu %folder%, bu komut dosyasına ( %1) bir argüman olarak verilebilir .
Sonuç olarak, sonuçlar parametrede tutulur%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

Not: Yöntem calcAccSizeayrıca klasör içeriğini de yazdırabilir (yukarıdaki örnekte yorumlanmıştır)


1

İşte her iki isteğiniz için de başlangıçta istediğiniz şekilde bir çözüm. Herkesin yaşadığı dosya boyutu sınırları olmadan insan tarafından okunabilirlik dosya boyutu verecektir. Win Vista veya daha yenisi ile uyumludur. XP yalnızca Robocopy kuruluysa kullanılabilir. Bu toplu iş dosyasına bir klasör bırakın veya aşağıda belirtilen daha iyi yöntemi kullanın.

@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

Bu toplu iş dosyasını rahatça kullanabilmek için SendTo klasörünüze koyun. Bu, bir klasöre veya klasör seçimine sağ tıklamanıza, SendTo seçeneğine tıklamanıza ve ardından bu toplu iş dosyasını seçmenize olanak tanır.

Bilgisayarınızdaki SendTo klasörünü bulmanın en basit yolu cmd'yi açıp bu satırı olduğu gibi kopyalamaktır.

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


Robocopy'nin dosyaları taşıyacağından endişelenen herkes için .. yapma. / l seçeneği yalnızca listeler. Ek olarak, Robocopy 3. taraf değildir, Robocopy varsayılan olarak Vista'dan Windows'a yüklenir, XP'yi yüklemeniz gerekir.
julesverne

Eklediğiniz için teşekkürler. Bu başlığın hala dikkat çekmesine sevindim ;-) Robocopy'nin nasıl kurulacağını eklemek isteyebilirsiniz (harika bir araç!).
Eldad Assis

0

Benzer sorunu çözdüm. Bu sayfadaki yöntemlerden bazıları yavaştır ve bazıları çok dilli ortamda sorunludur (tümü İngilizce varsayar). Cmd'de vbscript kullanarak basit bir çözüm buldum. W2012R2 ve W7'de test edilmiştir.

>%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))

Ortam değişkeni S_'yi ayarlar. Elbette, sonucu doğrudan örn.

FOR /F %%? IN ('CSCRIPT //NOLOGO %TEMP%\_SFSTMP$.VBS') DO (ECHO "Size of %1 is %%?"&&(DEL %TEMP%\_SFSTMP$.VBS))

Bunu altyordam veya bağımsız cmd olarak kullanabilirsiniz. Parametre, tırnak içinde kapatılmış test edilen klasörün adıdır.


-3

Yalnızca toplam boyutu elde etmenin en kolay yöntemi powershell'dir, ancak yine de 260 karakterden uzun yol adlarının toplama dahil edilmemesi nedeniyle sınırlıdır.


2
Bu kötü ve kötü bir cevap. Komut satırı veya kod nedir?
Tatarin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.