PowerShell

PowerShell Komutları (Profesyonel Rehber)

Saha notu / teknik rehber Son kontrol 12 Eylül 2026 Konu merkezine dön →
Tolga CEYHAN Sistem Yönetimi & IT

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

Microsoft Dokümantasyonu

Yazar

Tolga CEYHAN

Sistem Yönetimi & IT

Tolga CEYHAN, bilgi teknolojilerini severek takip eder ve BT üzerine hali hazırda aktif olarak çalışmaktadır. 2006 yılından 2017 yılına kadar web tasarım yazılım üzerine çalışmalar yaptım. Şuan ise Windows Sistem ve Sistem Güvenliği alanında çalışmalarımı sürdürmekteyim.

PROFESYONEL PROFİL

Bu teknik içeriğin arkasındaki deneyimi inceleyin.

Microsoft altyapıları, Active Directory, SCCM, PowerShell, Windows Server ve VMware odaklı teknik profil ve proje çalışmaları.

Projeler & Vaka Çalışmalarıİngilizce Profil

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir