PowerShell komutları yalnızca tek tek ezberlenecek komutlardan ibaret değildir. Profesyonel kullanımda asıl değer; cmdlet mantığını, pipeline yapısını, nesne tabanlı çalışma modelini ve çıktıyı rapora dönüştürme disiplinini birlikte kullanabilmektir.
PowerShell; Windows yönetimi, otomasyon, raporlama, uzaktan yönetim ve tekrarlayan operasyonların standartlaştırılması için sistem yöneticilerinin en önemli araçlarından biridir. Bu rehberde en çok kullanılan PowerShell komutlarını gerçek sistem yönetimi senaryolarıyla birlikte ele alıyorum.
Amaç ve Kapsam
Bu rehberin amacı yalnızca “hangi komut ne işe yarar?” sorusuna cevap vermek değil; komutların birbiriyle nasıl zincirlendiğini, nasıl filtreleme ve raporlama yapıldığını ve günlük sistem yönetiminde nasıl kullanılabileceğini göstermektir.
Ön Koşullar
- Windows PowerShell 5.1 veya PowerShell 7.x
- Temel Windows yönetim bilgisi
- Komutları üretim ortamında kullanmadan önce test ortamında doğrulama
- Uzaktan yönetim için uygun WinRM/PowerShell Remoting yapılandırması ve yetkiler
PowerShell Neden Kritik?
GUI araçları tekil işlemler için yeterli olabilir; ancak işlem sayısı arttığında standartlaştırma ihtiyacı ortaya çıkar. Çok sayıda kullanıcı oluşturmak, sunucularda servis kontrolü yapmak, log toplamak veya düzenli rapor üretmek için komut tabanlı otomasyon daha uygundur.
- Nesne tabanlı çıktı üretir.
- Filtreleme, sıralama ve raporlamayı kolaylaştırır.
- Uzak sistemlerde merkezi işlem yapılmasını sağlar.
- CSV ve JSON gibi formatlarla raporlama ve entegrasyon sağlar.
- Tekrarlayan operasyonların script haline getirilmesini sağlar.
Cmdlet Mantığı: Verb-Noun Standardı
Get-Service
Start-Service
Stop-Process
Get-ChildItem
Set-Location
Invoke-Command
Get- veri almak, Start- başlatmak, Stop- durdurmak ve New- yeni nesne oluşturmak için sık kullanılan fiillerdir.
PowerShell Öğrenmenin En Kritik 3 Komutu
Get-Command
Get-Command
Get-Command *service*
Get-Command -Verb Get
Get-Command -Noun Process
Get-Help
Get-Help Get-Service
Get-Help Get-Service -Examples
Get-Help Get-Service -Detailed
Get-Help Get-Service -Full
Get-Member
Get-Service | Get-Member
Get-Member, çıktının düz metin değil; Name, Status ve DisplayName gibi özelliklere sahip nesnelerden oluştuğunu anlamayı kolaylaştırır.
Pipeline Mantığı
Get-Service | Where-Object Status -eq 'Running'
Get-Service |
Where-Object Status -eq 'Running' |
Select-Object Name, Status
Bu akışta önce veri alınır, sonra filtrelenir ve son aşamada yalnızca ihtiyaç duyulan alanlar seçilir.
En Çok Kullanılan PowerShell Komutları
Get-ChildItem
Get-ChildItem C:\Logs
Get-ChildItem C:\Logs -Recurse
Get-ChildItem C:\Logs -Filter *.log -Recurse
Son 7 günde değişen log dosyalarını bulmak için:
Get-ChildItem C:\Logs -File -Recurse |
Where-Object LastWriteTime -gt (Get-Date).AddDays(-7) |
Select-Object FullName, Length, LastWriteTime
Get-Process
Get-Process |
Sort-Object CPU -Descending |
Select-Object -First 10 Name, Id, CPU
Get-Service
Get-Service | Where-Object Status -eq 'Running'
Get-Service |
Where-Object Status -eq 'Stopped' |
Select-Object Name, DisplayName, Status
Start-Service ve Stop-Service
Start-Service Spooler
Stop-Service Spooler
Where-Object
Get-Process | Where-Object WorkingSet -gt 200MB
Select-Object
Get-Service | Select-Object Name, Status, StartType
Sort-Object
Get-ChildItem D:\Data -File -Recurse |
Sort-Object Length -Descending |
Select-Object -First 20 FullName, Length
ForEach-Object
Get-ChildItem C:\Temp -File |
ForEach-Object {
[PSCustomObject]@{
Name = $_.Name
SizeMB = [math]::Round($_.Length / 1MB, 2)
}
}
Dosya Sistemi Yönetimi
Büyük Dosyaları Bulma
Get-ChildItem D:\Shares -File -Recurse |
Sort-Object Length -Descending |
Select-Object -First 50 FullName, Length
Belirli Tarihten Sonra Değişen Dosyaları Listeleme
Get-ChildItem D:\Shares -File -Recurse |
Where-Object LastWriteTime -gt (Get-Date).AddDays(-30) |
Select-Object FullName, LastWriteTime
Boş Klasörleri Bulma
Get-ChildItem D:\Shares -Directory -Recurse |
Where-Object { (Get-ChildItem $_.FullName -Force | Measure-Object).Count -eq 0 } |
Select-Object FullName
Bu örnekler file server housekeeping, storage analizi ve migration öncesi keşif çalışmalarında kullanılabilir.
Servis ve Process Troubleshooting
Otomatik Başlayan Ama Çalışmayan Servisler
Get-Service |
Where-Object { $_.StartType -eq 'Automatic' -and $_.Status -ne 'Running' } |
Select-Object Name, DisplayName, Status, StartType
CPU Tüketen Süreçler
Get-Process |
Sort-Object CPU -Descending |
Select-Object -First 10 Name, Id, CPU, WorkingSet
Bellek Kullanımına Göre Sıralama
Get-Process |
Sort-Object WorkingSet -Descending |
Select-Object -First 10 Name, Id,
@{Name='MemoryMB';Expression={[math]::Round($_.WorkingSet / 1MB, 2)}}
Event Log Analizi
Get-WinEvent -LogName System -MaxEvents 50
Son 24 saatteki hata kayıtlarını görmek için:
Get-WinEvent -LogName System |
Where-Object {
$_.LevelDisplayName -eq 'Error' -and
$_.TimeCreated -gt (Get-Date).AddDays(-1)
} |
Select-Object TimeCreated, Id, ProviderName, Message
Ağ ve Bağlantı Kontrolü
Test-Connection SRV-FS01 -Count 2
'SRV-FS01','SRV-APP01','SRV-DB01' |
ForEach-Object {
$result = Test-Connection $_ -Count 1 -Quiet -ErrorAction SilentlyContinue
[PSCustomObject]@{
ComputerName = $_
Reachable = $result
}
}
Uzak Sunucu Yönetimi: Invoke-Command
Invoke-Command -ComputerName SRV-FS01 -ScriptBlock {
Get-Service
}
Invoke-Command -ComputerName SRV-FS01,SRV-APP01,SRV-DB01 -ScriptBlock {
Get-Service | Where-Object Status -eq 'Running'
}
Uzak Yönetimde Dikkat Edilecekler
- PowerShell Remoting etkin olmalıdır.
- Firewall ve WinRM ayarları doğru olmalıdır.
- Yetkiler minimum gerekli seviyede tutulmalıdır.
- Komutlar önce test ortamında doğrulanmalıdır.
Raporlama ve Veri Dışa Aktarma
Export-Csv
Get-Service |
Select-Object Name, Status, StartType |
Export-Csv .\services.csv -NoTypeInformation
JSON Çıktısı
Get-Service |
Select-Object Name, Status, StartType |
ConvertTo-Json
Örnek Sağlık Raporu
$services = Get-Service |
Where-Object Status -eq 'Stopped' |
Select-Object Name, DisplayName, Status, StartType
$processes = Get-Process |
Sort-Object CPU -Descending |
Select-Object -First 10 Name, Id, CPU
$services | Export-Csv .\stopped_services.csv -NoTypeInformation
$processes | Export-Csv .\top_processes.csv -NoTypeInformation
Performans: Script Yazarken Dikkat Edilecekler
Özellikle Export-Csv gibi komutları her iterasyonda çağırmak yerine, nesneleri üretip çıktı işlemini pipeline sonunda yapmak daha uygundur.
Verimsiz Yaklaşım
Import-Csv .\Input.csv | ForEach-Object {
[pscustomobject]@{ Name = $_.Name } |
Export-Csv .\Output.csv -Append -NoTypeInformation
}
Daha Doğru Yaklaşım
Import-Csv .\Input.csv | ForEach-Object {
[pscustomobject]@{ Name = $_.Name }
} | Export-Csv .\Output.csv -NoTypeInformation
Sistem Yöneticileri İçin 15 Pratik Komut
Get-Command
Get-Help Get-Service -Examples
Get-Service | Get-Member
Get-Service | Where-Object Status -eq 'Running'
Get-Service | Where-Object Status -eq 'Stopped'
Get-Process | Sort-Object CPU -Descending | Select-Object -First 10
Get-Process | Sort-Object WorkingSet -Descending | Select-Object -First 10
Get-WinEvent -LogName System -MaxEvents 50
Get-ChildItem C:\Logs -Filter *.log -Recurse
Get-ChildItem D:\Data -File -Recurse | Where-Object LastWriteTime -gt (Get-Date).AddDays(-7)
Test-Connection SRV-FS01 -Count 2
Invoke-Command -ComputerName SRV-FS01 -ScriptBlock { Get-Service }
Get-Service | Select-Object Name, Status | Export-Csv .\services.csv -NoTypeInformation
Get-Process | Select-Object Name, Id, CPU | ConvertTo-Json
Get-Service | Select-Object Name, Status | Format-Table -AutoSize
Sık Yapılan Hatalar
Alias ile Üretim Scripti Yazmak
Üretim scriptlerinde gci yerine Get-ChildItem, ? yerine Where-Object kullanmak okunabilirliği artırır.
Format Komutlarını Pipeline’ın Ortasında Kullanmak
Format-Table ve Format-List sunum içindir; veri işleme tamamlandıktan sonra kullanılmalıdır.
Doğrudan Üretim Ortamında Deneme Yapmak
Servis durdurma, dosya silme veya yetki değiştirme gibi işlemler önce test ortamında doğrulanmalıdır.
Kopyala-Yapıştır ile Çalışmak
Bir komutun ürettiği nesneyi anlamadan kullanmak sürdürülebilir değildir. Get-Help ve Get-Member günlük kullanımın parçası olmalıdır.
PowerShell 5.1 mi, PowerShell 7 mi?
- Windows PowerShell 5.1, eski Windows odaklı modüllerle daha geniş uyumluluk sağlayabilir.
- PowerShell 7.x, modern .NET tabanı ve çapraz platform desteğiyle öne çıkar.
Üretim scriptlerinde kullanılan modüllerin hangi sürümle çalıştığı mutlaka test edilmelidir.
Gerçek Operasyon Senaryosu
Günlük servis kontrollerinin uzak masaüstü bağlantılarıyla manuel yapılması zaman alıcı ve hataya açık olabilir. Bu süreç PowerShell ile merkezi hale getirilebilir: sunucu listesi alınır, Invoke-Command ile servisler sorgulanır, sonuçlar filtrelenir ve Export-Csv ile raporlanır.
Buradaki asıl kazanım yalnızca hız değil; kontrol adımlarının standartlaştırılması ve tekrar edilebilir hale gelmesidir.
Sonuç
PowerShell komutları tek tek öğrenildiğinde araçtır; pipeline, nesne mantığı, filtreleme, uzaktan yönetim ve raporlama ile birleştirildiğinde güçlü bir sistem yönetimi yaklaşımına dönüşür.
Başlangıç için en doğru yöntem: Get-Command ile keşfet, Get-Help ile öğren, Get-Member ile nesneyi tanı ve ardından pipeline ile komutları birlikte kullan.
İlgili Rehberler
- PowerShell Windows Server Health Check ve Otomatik Raporlama
- PowerShell File Server Yönetimi ve NTFS Permission Otomasyonu
- PowerShell ile AD Kullanıcı Oluşturma ve Mailbox Atama
- NTFS Permission Tasarımı ve AGDLP Modeli
