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.
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.
Jawaban:
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 cmd
terbatas 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 :-)
du
memberikan 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.
folder\*
tidak berfungsi untuk saya ukuran folder yang saya letakkan di tempat itu menunjukkan 0 byte, Apakah ada solusi?
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
.
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
\\live.sysinternals.com
jika masih ada). Saya sepenuh hati setuju, bahwa semua alat sysinternals harus dimasukkan secara default. Meskipun untuk banyak penggunaan PowerShell adalah pengganti yang cukup layak.
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
0.00 C:\Windows
dapatkah saya mengoptimalkan ini untuk semua folder, mencoba sudah berjalan sebagai admin
ft
( Format-Table
) bekerja. Anda dapat mencoba fl
sebagai gantinya ( Format-List
)
Jika Anda telah menginstal git di komputer Anda (semakin umum) buka saja MINGW32 dan ketik: du folder
du -h -d 1 folder | sort -h
jika Anda ingin ukuran yang dapat dibaca manusia, hanya satu tingkat subdirektori, dan urutkan berdasarkan ukuran.
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
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
}
$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
.
$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}} }
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
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
Saya dapat du.exe
distribusi git saya. Tempat lain mungkin adalah Microsoft atau Unxutils tersebut .
Setelah Anda mendapat du.exe di jalur Anda. Ini fileSizes.bat
milikmu :-)
@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
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.
:: 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:
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.
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 calcAccSize
ini juga dapat mencetak konten folder (dikomentari dalam contoh di atas)
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
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.