Dapatkan Ukuran Folder dari Windows Command Line

128

Apakah mungkin di Windows untuk mendapatkan ukuran folder dari baris perintah tanpa menggunakan alat pihak ke-3?

Saya ingin hasil yang sama seperti yang Anda dapatkan ketika mengklik kanan folder di windows explorer → properti.

Eldad Assis
sumber

Jawaban:

120

Anda bisa menambahkan ukuran secara rekursif (berikut ini adalah file batch):

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

Namun, ini memiliki beberapa masalah karena cmdterbatas pada aritmatika integer bertanda 32-bit. Jadi akan mendapatkan ukuran di atas 2 GiB salah 1 . Lebih jauh lagi, ia mungkin akan menghitung symlink dan persimpangan beberapa kali sehingga paling baik merupakan batas atas, bukan ukuran sebenarnya (meskipun Anda akan memiliki masalah dengan alat apa pun).

Alternatifnya adalah PowerShell:

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

atau lebih pendek:

ls -r | measure -sum Length

Jika Anda menginginkannya lebih cantik:

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

Anda dapat menggunakan ini langsung dari cmd:

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

1 Saya memiliki perpustakaan bignum yang sebagian jadi dalam file batch di suatu tempat yang setidaknya mendapatkan tambahan integer presisi sewenang-wenang. Saya harus benar-benar melepaskannya, saya kira :-)

Joey
sumber
+1 Saya baru saja berkeliaran di get-help * output untuk menemukan sesuatu seperti itu.
Steve
2
Steve, di mata saya PowerShell jauh lebih Unix-y daripada Unix dalam kebanyakan perintah inti benar-benar ortogonal. Di Unix dumemberikan ukuran direktori tetapi yang dilakukannya hanyalah berjalan di pohon dan menyimpulkan. Sesuatu yang bisa diekspresikan dengan sangat elegan dalam pipa seperti di sini :-). Jadi untuk PowerShell, saya biasanya mencari cara Anda dapat menguraikan tujuan tingkat tinggi menjadi operasi tingkat rendah yang sesuai.
Joey
3
Begitu ya, sepertinya mengabaikan folder tersembunyi seperti itu. ls -force -r berfungsi jika saya ingin menyertakan folder tersembunyi juga.
garg
2
folder\*tidak berfungsi untuk saya ukuran folder yang saya letakkan di tempat itu menunjukkan 0 byte, Apakah ada solusi?
Peneliti IT
2
Versi yang sedikit lebih tampan: powershell -noprofile -command "'{0: N0}' -f (ls -r | mengukur -s Panjang) .Sum"
zumalifeguard
120

Ada alat Windows bawaan untuk itu:

dir /s 'FolderName'

Ini akan mencetak banyak informasi yang tidak perlu tetapi akhirnya akan menjadi ukuran folder seperti ini:

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

Jika Anda perlu memasukkan folder tersembunyi tambahkan /a.

Nir Duan
sumber
7
Ini adalah solusi paling elegan jika Anda tidak memerlukan nilai pengembalian integer. Catatan: sakelar '/ a' akan menyertakan file tersembunyi dan sistem dalam ukuran total.
Oran D. Lord
1
Saya kira itu tidak mungkin untuk mencetak ukuran file di beberapa unit yang lebih berguna, seperti kB atau MB, kan?
David Ferenczy Rogožan
Kutipan ganda dan bukan kutipan tunggal.
user2924019
66

Saya sarankan untuk mengunduh utilitas DU dari Sysinternals Suite yang disediakan oleh Microsoft di tautan ini 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

Saat Anda melakukannya, lihatlah utilitas lain. Mereka adalah penyelamat untuk setiap Windows Professional

Steve
sumber
11
Itu hampir "tanpa alat pihak ke-3", saya kira.
Joey
11
Oh benar, tetapi ia berpikir bahwa keluarga tidak boleh dianggap sebagai 'pihak ketiga'.
Steve
1
Ya, memang, tapi ini masih merupakan unduhan tambahan (atau menggunakan \\live.sysinternals.comjika masih ada). Saya sepenuh hati setuju, bahwa semua alat sysinternals harus dimasukkan secara default. Meskipun untuk banyak penggunaan PowerShell adalah pengganti yang cukup layak.
Joey
1
Apakah ada yang mengatakan Powershell? Coba yang berikut ini: "{0: N2}" -f ((Get-ChildItem C: \ Temp -Recurse | Measure-Object -Property Length -Sum) .Sum / 1MB) + "MB"
John Homer
3
Saya menyarankan Anda semua untuk mengunduh apa pun yang dikembangkan Mark Russinovich :) Saya terus melihat nama ini setiap kali saya menemukan alat yang menyelamatkan hidup saya.
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"

Sama tetapi hanya untuk 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

Ini harus menghasilkan hasil sebagai berikut:

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
frizik
sumber
1
Apakah ada cara untuk menampilkan semua file dan ukuran dalam Mb di folder dasar juga? Dalam hal ini `C: \ my \ Tools`
Raunak Thomas
2
Ditambah lagi rusak ketika ada banyak folder (Misalnya dalam drive C
:)
0.00 C:\Windowsdapatkah saya mengoptimalkan ini untuk semua folder, mencoba sudah berjalan sebagai admin
Tilo
ini bagus tetapi memotong nama folder komponen saya. apa perintah untuk menampilkannya sepenuhnya?
sean.net
@ sean.net maksud Anda berakhir dengan "..." jika ada folder yang panjang? Begitulah cara ft( Format-Table) bekerja. Anda dapat mencoba flsebagai gantinya ( Format-List)
frizik
16

Jika Anda telah menginstal git di komputer Anda (semakin umum) buka saja MINGW32 dan ketik: du folder

Custodio
sumber
4
Anda dapat menggunakan perintah berikut du -h -d 1 folder | sort -hjika Anda ingin ukuran yang dapat dibaca manusia, hanya satu tingkat subdirektori, dan urutkan berdasarkan ukuran.
vard
8

Saya merekomendasikan untuk menggunakan https://github.com/aleksaan/ utilitas utilitas. Sangat sederhana dan bermanfaat. Dan sangat cepat.

Ketikkan saja shell perintah

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

dan dapatkan daftar folder yang disusun berdasarkan ukuran

  1. | DIR: d: / go | UKURAN: 325,72 Mb | KEDALAMAN: 1
  2. | DIR: d: / Buku | UKURAN: 14,01 Mb | KEDALAMAN: 1

Contoh ini dieksekusi pada 272ms pada HDD.

Anda dapat meningkatkan kedalaman subfolder untuk dianalisis, misalnya:

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

dan dapatkan ukuran tidak hanya untuk folder yang dipilih tetapi juga untuk subfoldernya

  1. | DIR: d: / go | UKURAN: 325,72 Mb | KEDALAMAN: 1
  2. | DIR: d: / go / pkg | UKURAN: 212,88 Mb | KEDALAMAN: 2
  3. | DIR: d: / go / src | UKURAN: 62,57 Mb | KEDALAMAN: 2
  4. | DIR: d: / go / bin | UKURAN: 30,44 Mb | KEDALAMAN: 2
  5. | DIR: d: / Buku / Catur | UKURAN: 14,01 Mb | KEDALAMAN: 2
  6. | DIR: d: / Buku | UKURAN: 14,01 Mb | KEDALAMAN: 1
  7. | DIR: d: / go / api | UKURAN: 6,41 Mb | KEDALAMAN: 2
  8. | DIR: d: / go / test | UKURAN: 5,11 Mb | KEDALAMAN: 2
  9. | DIR: d: / go / doc | UKURAN: 4.00 Mb | KEDALAMAN: 2
 10. | DIR: d: / go / misc | UKURAN: 3,82 Mb | KEDALAMAN: 2
 11. | DIR: d: / go / lib | UKURAN: 358.25 Kb | KEDALAMAN: 2

* 3.5Tb di server telah dipindai selama 3m12s

Alexander Anufriev
sumber
Versi baru dirilis! Peningkatan github.com/aleksaan/diskusage: 1) pekerjaan yang benar dengan ukuran symlink 2) atau info semua tentang objek yang dianalisis
Alexander Anufriev
Versi 2.0.2 dirilis! github.com/aleksaan/diskusage/releases/tag/v2.0.2 - File konfigurasi sebagai gantinya parameter inline - Mode penggunaan sederhana (salin diskusage yang dapat dieksekusi ke folder apa pun, jalankan dan dapatkan hasil) - Keluaran hasil yang benar (akhir yang benar dari simbol garis menang / unix) - Simpan hasil ke file atau mendapatkannya dalam mode konsol (opsi 'tofile')
Alexander Anufriev
Harap perhatikan bahwa Anda adalah seorang penulis. (Dari stackoverflow.com/help/promotion : "Namun, Anda harus mengungkapkan afiliasi Anda dalam jawaban Anda." )
aeracode
6

Di sinilah kode PowerShell saya menulis ke daftar ukuran dan jumlah file untuk semua folder di bawah direktori saat ini. Jangan ragu untuk menggunakan kembali atau memodifikasi sesuai kebutuhan Anda.

$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
}
Ryan Lee
sumber
Bekerja untukku. Berguna jika Anda berada di server tanpa kepala.
andrew pate
Sederhana dan elegan! Versi saya: $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}} } Ini akan memberikan objek (lebih banyak Powershell-ish), 'FileCount' dan 'Size' adalah bilangan bulat (sehingga Anda dapat memprosesnya nanti, jika perlu), dan 'Ukuran' dalam byte, tetapi Anda dapat dengan mudah mengubahnya menjadi GB (atau unit yang Anda inginkan) dengan $Data.Size / 1GB.
curropar
Atau satu $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}} }
kalimat
2

Kode ini diuji. Anda bisa memeriksanya lagi.

@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
Chienvela
sumber
Terima kasih, ini berfungsi untuk saya dengan folder yang lebih kecil dari 1GB, tetapi misalnya, saya memiliki folder 3.976.317.115 byte (3,70GB), dan skrip mengembalikan kepada saya string ini ") 932", tahukah Anda mengapa?
Elady
2

Saya kira ini hanya akan berfungsi jika direktori cukup statis dan isinya tidak berubah antara pelaksanaan perintah dua dir. Mungkin cara untuk menggabungkan ini menjadi satu perintah untuk menghindari itu, tetapi ini bekerja untuk tujuan saya (saya tidak ingin daftar lengkap; hanya ringkasannya).

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

Pemakaian:

GetDirSummary.bat c: \ temp

Keluaran:

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

Saya dapat du.exedistribusi git saya. Tempat lain mungkin adalah Microsoft atau Unxutils tersebut .

Setelah Anda mendapat du.exe di jalur Anda. Ini fileSizes.batmilikmu :-)

@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
Frank Nocke
sumber
1

Saya pikir satu-satunya pilihan Anda akan diruse (solusi pihak ke-3 yang sangat didukung):

Dapatkan ukuran file / direktori dari baris perintah

Sayangnya, Windows CLI sangat terbatas, Anda bisa menginstal Cygwin yang merupakan mimpi untuk digunakan dibandingkan dengan cmd. Itu akan memberi Anda akses ke du alat Unix porting yang merupakan dasar dari diruse pada windows.

Maaf saya tidak dapat menjawab pertanyaan Anda secara langsung dengan perintah yang dapat Anda jalankan di cli asli.

Illizian
sumber
1
Jika Anda hanya perlu dumaka Cygwin adalah cara yang berlebihan. Pergilah dengan GnuWin32 .
Joey
2
Memang itu berlebihan, tetapi juga mengagumkan. +1 untuk pos Anda di atas @ joey (tidak punya perwakilan untuk melakukannya secara harfiah :()
Illizian
Menurut pendapat saya yang sederhana, Cygwin mungkin berguna bagi beberapa orang tetapi jauh dari mengagumkan dan agak mengerikan. Tapi saya kira pengguna Unix mengatakan hal yang sama tentang Wine.
Joey
1
"Wine" - ngeri, saya menggunakan Cygwin di laptop pengembangan saya karena masa pakai baterai yang mengerikan di linux dan tidak nyaman untuk menjalankan VM di atasnya. Butuh beberapa pengaturan, tetapi Cygwin sangat brilian bagi kita yang ketinggalan shell nix di Windows, secara pribadi saya tidak suka Powershell saya mungkin harus memeriksa GnuWin. Terima kasih @ Joey.
Illizian
1

:: Dapatkan sejumlah baris yang dikembalikan oleh perintah Dir (/ -c untuk menghilangkan pemisah angka:.,) ["Tokens = 3" untuk melihat hanya pada kolom ketiga dari setiap baris dalam Dir]

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

Jumlah garis kedua dari belakang, di mana jumlah byte dari jumlah file:

set /a line=%i%-1

Akhirnya dapatkan jumlah byte di baris kedua dari belakang - kolom ke-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%

Karena tidak menggunakan pencarian kata, itu tidak akan memiliki masalah bahasa.

Keterbatasan:

  • Hanya berfungsi dengan folder kurang dari 2 GB (cmd tidak menangani angka lebih dari 32 bit)
  • Tidak membaca jumlah byte folder internal.
Gustavo Davico
sumber
1

Mencoba:

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

Ubah C: \ Program Files ke folder apa pun yang Anda inginkan dan ubah% A menjadi %% A jika menggunakan file batch

Ini mengembalikan ukuran seluruh folder, termasuk subfolder dan file sistem tersembunyi, dan bekerja dengan folder lebih dari 2GB

Itu menulis ke layar, jadi Anda harus menggunakan file sementara jika Anda tidak menginginkannya.

FrinkTheBrave
sumber
1

Script berikut dapat digunakan untuk mengambil dan mengakumulasikan ukuran setiap file di bawah folder yang diberikan.
Jalur folder %folder%dapat diberikan sebagai argumen untuk skrip ini ( %1).
Pada akhirnya, hasilnya disimpan dalam parameter%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

Catatan: Metode calcAccSizeini juga dapat mencetak konten folder (dikomentari dalam contoh di atas)

Lior Kirshner
sumber
1

Jadi di sini adalah solusi untuk kedua permintaan Anda dengan cara yang Anda minta semula. Ini akan memberi file ukuran keterbacaan manusia tanpa batas filesize yang dialami semua orang. Kompatibel dengan Win Vista atau yang lebih baru. XP hanya tersedia jika Robocopy diinstal. Cukup jatuhkan folder pada file batch ini atau gunakan metode yang lebih baik yang disebutkan di bawah ini.

@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

Agar dapat menggunakan file batch ini dengan mudah, letakkan di folder SendTo Anda. Ini akan memungkinkan Anda untuk mengklik kanan folder atau memilih folder, klik pada opsi SendTo, dan kemudian pilih file batch ini.

Untuk menemukan folder SendTo di komputer Anda cara paling sederhana adalah dengan membuka cmd lalu salin di baris ini apa adanya.

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

julesverne
sumber
Bagi siapa pun yang khawatir Robocopy akan memindahkan file .. jangan. opsi / l hanya mencantumkan. Selain itu, Robocopy bukan pihak ke-3, Robocopy diinstal di Windows secara default dari Vista ke atas, XP Anda harus menginstalnya.
julesverne
Terima kasih untuk tambahannya. Senang melihat utas ini masih menarik perhatian ;-) Mungkin ingin menambahkan cara menginstal robocopy (alat hebat!).
Eldad Assis
0

Saya memecahkan masalah yang sama. Beberapa metode di halaman ini lambat dan ada yang bermasalah di lingkungan multilanguage (semuanya anggap bahasa Inggris). Saya menemukan solusi sederhana menggunakan vbscript di cmd. Ini diuji dalam W2012R2 dan 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))

Ini mengatur variabel lingkungan S_. Anda dapat, tentu saja, mengubah baris terakhir untuk langsung menampilkan hasil ke misalnya

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

Anda dapat menggunakannya sebagai subrutin atau sebagai cmd standlone. Parameter adalah nama folder yang diuji ditutup dalam tanda kutip.

arpi
sumber
-3

Metode termudah untuk mendapatkan ukuran total adalah PowerShell, tetapi masih dibatasi oleh fakta bahwa nama path yang lebih panjang dari 260 karakter tidak termasuk dalam total

sinar
sumber
2
Ini adalah jawaban yang buruk dan buruk. Apa baris perintah atau kode?
Tatarin