Sunucu veya dosya sistemlerinde zamanla biriken verilerin miktarını izlemek BT operasyonlarının en temel gereksinimlerinden biridir. Özellikle dosya paylaşım alanları (örneğin F:\FS) içerisinde kaç adet dosya ve klasör bulunduğunu, toplam veri boyutunun ne kadar olduğunu bilmek kapasite planlaması, yedekleme stratejileri ve bulut geçişleri (Azure, AWS, NetApp, vb.) için büyük önem taşır.
PowerShell bu tür analizleri hızlı, güvenilir ve otomatikleştirilebilir biçimde yapmamızı sağlar. Bu makalemde belirli bir dizin altındaki dosya sayısını, klasör sayısını ve toplam kapasiteyi (GB cinsinden) ölçen sade ama etkili bir PowerShell script içeriğini adım adım aktaracağım.
Hazırladığımız PowerShell script’i şu üç temel veriyi toplar:
- Toplam dosya sayısı
- Toplam klasör sayısı
- Toplam kapasite (GB)
Bu üç değer ile dosya sisteminin yapısı hakkında hızlı bir özet sunar. Özellikle veri taşıma (migration), temizlik (cleanup) veya arşivleme öncesi analizlerde büyük kolaylık sağlar.
# Klasör dizini
$path = "F:\FS"
# Dosya ve klasör sayıları
$files = (Get-ChildItem -Path $path -File -Recurse).Count
$folders = (Get-ChildItem -Path $path -Directory -Recurse).Count
# Toplam boyut (GB cinsinden)
$totalSizeBytes = (Get-ChildItem -Path $path -Recurse -File | Measure-Object -Property Length -Sum).Sum
$totalSizeGB = [math]::Round($totalSizeBytes / 1GB, 2)
# Sonuçların yazdırılması
Write-Output "Dosya sayısı : $files"
Write-Output "Klasör sayısı : $folders"
Write-Output "Toplam obje sayısı : $($files + $folders)"
Write-Output "Toplam boyut (GB) : $totalSizeGB GB"
Bu scirpt içerisinde yer alan ;
$files = (Get-ChildItem -Path $path -File -Recurse).Count
$folders = (Get-ChildItem -Path $path -Directory -Recurse).Count
Get-ChildItem komutu belirtilen dizin altındaki dosya ve klasörleri listeler.
-File ve -Directory parametreleriyle sadece dosyalar veya klasörler filtrelenir.
-Recurse parametresi alt dizinleri de dahil eder.
Son olarak .Count ile toplam öğe sayısı hesaplanır.
bu satır ise;
$totalSizeBytes = (Get-ChildItem -Path $path -Recurse -File | Measure-Object -Property Length -Sum).Sum
$totalSizeGB = [math]::Round($totalSizeBytes / 1GB, 2)
Her bir dosyanın boyutu (Length) byte cinsindedir. Measure-Object -Property Length -Sum komutu tüm dosyaların toplam boyutunu hesaplar. Sonuç byte olarak döner bu nedenle / 1GB ile gigabayta çevrilir. [math]::Round(..., 2) ifadesiyle virgülden sonra iki basamakla gösterilir (örneğin 134.26 GB).
İleri seviye kullanıcılara yönelik birkaç geliştirme fikri olarak
- Raporu otomatik olarak CSV dosyasına kaydetmek:
| Out-File "C:\Raporlar\FS_Kapasite_Raporu.csv" - Zaman damgası ekleyerek günlük kapasite takibi yapmak
- Belirli klasörleri hariç tutmak için
-Excludeparametresini kullanmak - Sonuçları e-posta ile otomatik göndermek (örneğin
Send-MailMessagekomutuyla)
$path = "F:\FS"
$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
$dateForFile = Get-Date -Format "yyyyMMdd_HHmm"
$files = (Get-ChildItem -Path $path -File -Recurse -ErrorAction SilentlyContinue).Count
$folders = (Get-ChildItem -Path $path -Directory -Recurse -ErrorAction SilentlyContinue).Count
$totalSizeBytes = (Get-ChildItem -Path $path -Recurse -File -ErrorAction SilentlyContinue | Measure-Object -Property Length -Sum).Sum
$totalSizeGB = [math]::Round($totalSizeBytes / 1GB, 2)
Write-Host "Klasör Yolu : $path"
Write-Host "Dosya Sayısı : $files"
Write-Host "Klasör Sayısı : $folders"
Write-Host "Toplam Obje : $($files + $folders)"
Write-Host "Toplam Boyut : $totalSizeGB GB"
Write-Host "Ölçüm Zamanı : $timestamp"
Write-Host "`nRapor oluşturuluyor..."
$reportPath = "C:\Raporlar"
if (-not (Test-Path $reportPath)) {
New-Item -ItemType Directory -Path $reportPath | Out-Null
}
$csvFile = "$reportPath\Kapasite_Raporu_$dateForFile.csv"
$report = [PSCustomObject]@{
Tarih = $timestamp
KlasorYolu = $path
DosyaSayisi = $files
KlasorSayisi = $folders
ToplamObje = $files + $folders
ToplamBoyut_GB = $totalSizeGB
}
$report | Export-Csv -Path $csvFile -NoTypeInformation -Encoding UTF8
Write-Host "CSV Rapor kaydedildi: $csvFile"
# Opsiyonel: E-posta ile gönderim (SMTP bilgileri eklenmeden çalışmaz)
<#
Send-MailMessage `
-From "rapor@domain.com" `
-To "it@domain.com" `
-Subject "Kapasite Raporu - $($timestamp)" `
-Body "Merhaba, $path dizini için kapasite raporu ekte yer almaktadır." `
-Attachments $csvFile `
-SmtpServer "mail.domain.com"
#>
Write-Host "`nİşlem tamamlandı. Rapor başarıyla oluşturuldu."