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.
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:
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, cmd
32 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 :-)
du
dizin 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.
folder\*
benim için çalışmıyor yerine koyduğum klasörün boyutu 0 bayt gösteriyor, herhangi bir çözüm var mı?
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
.
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
\\live.sysinternals.com
hala 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.
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
0.00 C:\Windows
bunu tüm klasörler için optimize edebilir miyim, zaten yönetici olarak çalıştırmayı denedim
ft
( Format-Table
) Böyle çalışır. Bunun fl
yerine deneyebilirsiniz ( Format-List
)
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ı
İş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
}
$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
.
$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}} }
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
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
du.exe
Git 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
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.
:: 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:
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.
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 calcAccSize
ayrıca klasör içeriğini de yazdırabilir (yukarıdaki örnekte yorumlanmıştır)
İş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
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.