PowerShell: Windows'ta Diskteki Klasör Boyutlarını Alın


Çoğu Windows kullanıcısı, bir klasörün boyutunu kontrol etmenin en kolay yolunun, Dosya Gezgini'nde klasör özelliklerini açmak olduğunu bilir. Daha deneyimli kullanıcılar, TreeSize veya WinDirStat gibi üçüncü taraf araçları kullanmayı tercih eder. Ancak, belirli bir dizindeki klasörlerin boyutu hakkında daha ayrıntılı istatistikler almak veya belirli dosya türlerini hariç tutmak istiyorsanız, PowerShell özelliklerini kullanmanız daha iyi olur. Bu makalede, PowerShell kullanarak diskteki belirli bir klasörün (ve tüm alt klasörlerin) boyutunu nasıl hızlı bir şekilde alacağınızı göstereceğiz.

Get-ChildItem öğesini kullanabilirsiniz (

gci

takma ad) ve Measure-Object (

measure

alias) cmdlet'leri, PowerShell'deki dosya ve klasörlerin (alt klasörler dahil) boyutlarını almak için kullanılır. İlk cmdlet, belirtilen dizindeki dosyaların (boyutlu) listesini belirtilen kriterlere göre almanızı sağlar ve ikincisi aritmetik işlemleri gerçekleştirir.

İpucu. Önceki makalelerden birinde, diskteki en büyük dosyaları bulmak için PowerShell'de Get-ChildItem cmdlet'inin nasıl kullanılacağını gösterdik.

Örneğin, C:\ISO klasörünün boyutunu almak için aşağıdaki komutu çalıştırın:

Get-ChildItem C:\ISO | Measure-Object -Property Length -sum

Gördüğünüz gibi, bu dizindeki dosyaların toplam boyutu Sum alanında gösteriliyor ve yaklaşık 2,1 GB'dir (boyut bayt olarak verilmiştir).

Boyutu daha uygun bir MB veya GB'ye dönüştürmek için şu komutu kullanın:

(gci c:\iso | measure Length -s).sum / 1Gb

Veya :

(gci c:\iso | measure Length -s).sum / 1Mb

Sonucu iki ondalık basamağa yuvarlamak için aşağıdaki komutu çalıştırın:

"{0:N2} GB" -f ((gci c:\iso | measure Length -s).sum / 1Gb)

Bir dizindeki belirli bir türdeki tüm dosyaların toplam boyutunu hesaplamak için PowerShell'i kullanabilirsiniz. Örneğin, bir klasördeki tüm ISO dosyalarının toplam boyutunu almak istiyorsunuz:

(gci c:\iso *.iso | measure Length -s).sum / 1Mb

Yukarıda gösterilen komutlar, belirtilen dizindeki dosyaların yalnızca toplam boyutunu almanıza izin verir. Dizinde alt klasörler varsa, alt klasörlerdeki dosyaların boyutu hesaplanmayacaktır. Alt dizinler de dahil olmak üzere dizindeki dosyaların toplam boyutunu almak için,

-Recurse

parametre. C:\Windows klasöründeki dosyaların toplam boyutunu bulalım:

"{0:N2} GB" -f ((gci -force c:\Windows -Recurse -ErrorAction SilentlyContinue| measure Length -s).sum / 1Gb)

Gizli dosyaların ve sistem dosyalarının boyutunu hesaba katmak için -force argümanını da kullandım.

Dolayısıyla, yerel sürücümdeki C:\Windows'un boyutu yaklaşık 40 GB'dir (komut dosyası, NTFS sıkıştırmasını yok sayar).

İpucu. Dizin erişim hatalarını (PermissionDenied -> DirUnauthorizedAccessError) önlemek için,

 -ErrorAction SilentlyContinue

parametre.

Bu komut dosyası, sembolik veya sabit bağlantılar içeriyorsa, bir dizinin boyutunu yanlış hesaplar. Örneğin,

C:\Windows

klasörü, WinSxS klasöründeki (Windows Bileşen Deposu) dosyalara birçok sabit bağlantı içerir. Sonuç olarak, bu tür dosyalar birkaç kez sayılabilir. Sonuçlardaki sabit bağlantıları yoksaymak için aşağıdaki komutu kullanın (tamamlanması uzun zaman alıyor):

"{0:N2} GB" -f ((gci -force C:\windows -Recurse -ErrorAction SilentlyContinue | Where-Object { $_.LinkType -notmatch "HardLink" }| measure Length -s).sum / 1Gb)

Gördüğünüz gibi, Windows klasörünün gerçek boyutu biraz daha küçük.

Nihai boyutu hesaplarken dikkate alınacak dosyaları seçmek için filtreleri kullanabilirsiniz. Örneğin, 2020'de oluşturulan dosyaların boyutunu alabilirsiniz:

(gci -force c:\ps -Recurse -ErrorAction SilentlyContinue | ? {$_.CreationTime -gt ‘1/1/20’ -AND $_.CreationTime -lt ‘12/31/20’}| measure Length -s).sum / 1Gb

Belirtilen dizindeki tüm birinci düzey alt klasörlerin boyutunu alabilirsiniz. Örneğin, C:\Users klasöründeki tüm kullanıcı profillerinin boyutunu almak istiyorsunuz.

gci -force 'C:\Users'-ErrorAction SilentlyContinue | ? { $_ -is [io.directoryinfo] } | % {
$len = 0
gci -recurse -force $_.fullname -ErrorAction SilentlyContinue | % { $len += $_.length }
$_.fullname, '{0:N2} GB' -f ($len / 1Gb)
}

%

için bir takma addır

foreach-object

döngü.

Hadi devam edelim. Diyelim ki göreviniz, sistem sabit sürücüsünün kök dizinindeki her bir dizinin boyutunu bulmak ve bilgileri analiz için uygun bir tablo biçiminde sunmak ve klasör boyutuna göre sıralayabilmek.

Sistem C:\ sürücüsündeki dizinlerin boyutu hakkında bilgi almak için aşağıdaki PowerShell betiğini çalıştırın:

$targetfolder='C:\'
$dataColl = @()
gci -force $targetfolder -ErrorAction SilentlyContinue | ? { $_ -is [io.directoryinfo] } | % {
$len = 0
gci -recurse -force $_.fullname -ErrorAction SilentlyContinue | % { $len += $_.length }
$foldername = $_.fullname
$foldersize= '{0:N2}' -f ($len / 1Gb)
$dataObject = New-Object PSObject
Add-Member -inputObject $dataObject -memberType NoteProperty -name “foldername” -value $foldername
Add-Member -inputObject $dataObject -memberType NoteProperty -name “foldersizeGb” -value $foldersize
$dataColl += $dataObject
}
$dataColl | Out-GridView -Title “Size of subdirectories”

Gördüğünüz gibi, C:\ sistem sürücüsünün kökündeki tüm klasörlerin ve boyutlarının gösterildiği tablonun grafik görünümü görünmelidir (tablo,

Out-GridView

cmdlet'i). Sütun başlığına tıklayarak klasörleri boyuta göre sıralayabilirsiniz. Sonuçları CSV'ye de aktarabilirsiniz (

| Export-Csv folder_size.csv

) veya bir Excel dosyasına.

PowerShell betiklerinizde dizin boyutu denetimi kullanıyorsanız, ayrı bir işlev oluşturabilirsiniz:


function Get-FolderSize {
[CmdletBinding()]
Param (
[Parameter(Mandatory=$true,ValueFromPipeline=$true)]
$Path
)
if ( (Test-Path $Path) -and (Get-Item $Path).PSIsContainer ) {
$Measure = Get-ChildItem $Path -Recurse -Force -ErrorAction SilentlyContinue | Measure-Object -Property Length -Sum
$Sum = '{0:N2}' -f ($Measure.Sum / 1Gb)
[PSCustomObject]@{
"Path" = $Path
"Size($Gb)" = $Sum
}
}
}

İşlevi kullanmak için, argüman olarak klasör yolu ile komutu çalıştırmanız yeterlidir:

Get-FolderSize ('C:\PS')

Uzak bilgisayarlardaki klasör boyutunu kontrol etmek için yerel PowerShell işlevinizi kullanabilirsiniz.

Invoke-Command

(PowerShell Uzak İletişim) cmdlet'i.

Invoke-Command -ComputerName hq-srv01 -ScriptBlock ${Function:Get-FolderSize} -ArgumentList 'C:\PS'

Bu komutlar, PowerShell Core 7.x'in daha yeni sürümleri dahil olmak üzere tüm PowerShell sürümlerinde çalışır.

İlgili makaleler