Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124

Birçok kişi PowerShell komutları konusuna yalnızca “hangi komut ne işe yarar?” düzeyinde yaklaşır. Oysa profesyonel kullanımda asıl fark yaratan konu komut ezberi değil; cmdlet mantığını, pipeline yapısını, nesne tabanlı çalışma modelini ve çıktıyı rapora dönüştürme disiplinini doğru anlamaktır.
PowerShell, modern Windows yönetiminin en kritik araçlarından biridir. Sadece komut satırından işlem yapmak için değil; otomasyon, raporlama, uzaktan yönetim, konfigürasyon standardizasyonu ve tekrarlayan operasyonların güvenli şekilde yönetilmesi için kullanılır.
Bu rehberde en çok kullanılan PowerShell komutlarını, gerçek sistem yöneticisi senaryolarıyla birlikte ele alacağız. İçerik hem başlangıç seviyesine yol gösterecek hem de orta ve ileri seviye kullanıcılar için referans niteliğinde olacaktır.
PowerShell’in en önemli özelliklerinden biri, çıktıları düz metin yerine nesne olarak iletmesidir. Bu sayede komutlar birbirine sadece yazı aktarmak yerine yapılandırılmış veri aktarır. Microsoft’un resmi dokümantasyonu da pipeline’ın, nesneleri bir komuttan diğerine bağlayan temel mekanizma olduğunu açık biçimde belirtir. Ayrıntılı teknik arka plan için şu kaynakları inceleyebilirsiniz: about_Pipelines ve Invoke-Command.
GUI araçları birçok işlem için yeterli görünse de kurumsal ölçekte yönetim yapıldığında grafik arayüzler hızla yetersiz kalır. Bir kullanıcıyı tek ekrandan oluşturmak kolaydır; ama yüzlerce kullanıcıyı standardize edilmiş şekilde oluşturmak, yüzlerce sunucuda servis kontrolü yapmak, log toplamak veya düzenli rapor üretmek için komut tabanlı otomasyon gerekir.
PowerShell bu noktada öne çıkar çünkü:
PowerShell 7.x ile birlikte platform desteği genişlemiş, ancak Windows PowerShell 5.1 ile PowerShell 7.x arasında modül uyumluluğu ve davranış farklılıkları da oluşmuştur. Microsoft, Windows PowerShell 5.1’in .NET Framework üzerinde; PowerShell 7.x’in ise modern .NET üzerinde çalıştığını ve bu nedenle bazı modül ve davranış farkları bulunduğunu belirtir. Bu ayrım özellikle üretim scriptlerinde önemlidir. :contentReference[oaicite:1]{index=1}
PowerShell komutları çoğunlukla Verb-Noun biçiminde adlandırılır. Bu standardizasyonun amacı komutların tahmin edilebilir ve okunabilir olmasıdır.
Örnek cmdlet’ler:
Get-ServiceStart-ServiceStop-ProcessGet-ChildItemSet-LocationInvoke-CommandBu yapı sayesinde bilmediğiniz bir komutu bile tahmin etmeniz kolaylaşır. Örneğin bir şeyi listelemek için çoğunlukla Get-, başlatmak için Start-, durdurmak için Stop-, yeni bir nesne oluşturmak için New- kullanılır.
Profesyonel kullanıma geçişte üç komut özellikle kritik rol oynar: Get-Command, Get-Help ve Get-Member. Bunlar sadece “komutlar” değildir; PowerShell’i öğrenme sistemidir.
Get-Command, sistemde kullanılabilir komutları listeler. Bir yönetici için keşif aracıdır.
Get-Command
Belirli bir isim desenine göre arama yapmak için:
Get-Command *service*
Belirli fiile göre arama yapmak için:
Get-Command -Verb Get
Belirli isim grubuna göre arama yapmak için:
Get-Command -Noun Process
Bu yaklaşım, yeni bir modül ya da teknoloji öğrenirken çok işe yarar. Örneğin “servislerle ilgili hangi komutlar var?” sorusunun cevabı birkaç saniyede bulunabilir.
Get-Help, bir cmdlet’in nasıl kullanıldığını, parametrelerini ve örneklerini gösterir.
Get-Help Get-Service
Örnekleri görmek için:
Get-Help Get-Service -Examples
Daha detaylı yardım için:
Get-Help Get-Service -Detailed
Pipeline desteğini görmek için tam yardım kullanmak özellikle önemlidir. Microsoft’un pipeline dokümantasyonu da, bir cmdlet’in hangi parametrelerinin pipeline girdisi kabul ettiğini anlamak için Get-Help -Full veya Get-Help -Parameter * kullanılmasını önerir. :contentReference[oaicite:2]{index=2}
Get-Member, PowerShell’in neden nesne tabanlı olduğunu anlamanın anahtarıdır. Bir komutun ürettiği nesnelerin hangi özellik ve metotlara sahip olduğunu gösterir.
Get-Service | Get-Member
Bu komutla Get-Service çıktısının sadece yazı olmadığını, aslında Status, Name, DisplayName gibi özelliklere sahip nesneler ürettiğini görürsünüz.
PowerShell’in profesyonel kullanımında kırılma noktası pipeline mantığını kavramaktır. Pipeline, bir komutun çıktısını diğerine gönderir; ancak burada iletilen şey çoğu zaman düz metin değil, nesnedir. Microsoft’un resmi açıklamasına göre pipeline, nesnelerin bir komuttan diğerine bağlanmasını sağlar ve parametreler nesneleri ByValue veya ByPropertyName ile kabul edebilir. :contentReference[oaicite:3]{index=3}
Temel örnek:
Get-Service | Where-Object Status -eq 'Running'
Burada olan şey şudur:
Get-Service servis nesnelerini üretir.Where-Object bu nesneleri filtreler.Bir adım daha ileri gidelim:
Get-Service | Where-Object Status -eq 'Running' | Select-Object Name, Status
Bu zincirde önce veri alınır, sonra filtrelenir, ardından sadece ihtiyaç duyulan alanlar seçilir. Günlük yönetim işlerinin çok büyük kısmı bu mantıkla çözülür.
Linux dünyasına alışkın olanlar çoğu zaman pipeline’ı metin borusu gibi düşünür. PowerShell’de ise borudan akan şey bir nesne koleksiyonudur. Bu nedenle sütun seçme, özellik bazlı sıralama, filtreleme ve CSV’ye aktarma çok daha doğal hale gelir.
PowerShell’de bazı parametreler pipeline girişini doğrudan nesne türüne göre kabul eder (ByValue), bazıları ise nesnenin ilgili isimde bir özelliği varsa kabul eder (ByPropertyName). Microsoft’un about_Pipelines belgesi bu ayrımı açıkça tanımlar. Bu mantığı anlamak, “neden bazı komut zincirleri çalışıyor, bazıları çalışmıyor?” sorusunu çözmenin temelidir. :contentReference[oaicite:4]{index=4}
Aşağıdaki cmdlet’ler günlük sistem yönetiminde en sık başvurulan komutlar arasındadır. Bunları sadece tanım olarak değil, kullanım mantığıyla birlikte değerlendirmek gerekir.
Dosya ve klasör içeriğini listeler. Windows tarafında klasik dir komutunun PowerShell karşılığı gibi düşünülse de çok daha güçlüdür.
Get-ChildItem C:\Logs
Alt klasörlerle birlikte taramak için:
Get-ChildItem C:\Logs -Recurse
Belli uzantıdaki dosyaları bulmak için:
Get-ChildItem C:\Logs -Filter *.log -Recurse
Gerçek kullanım senaryosu: Belirli bir klasörde son 7 günde değişen log dosyalarını bulmak.
Get-ChildItem C:\Logs -File -Recurse |
Where-Object LastWriteTime -gt (Get-Date).AddDays(-7) |
Select-Object FullName, Length, LastWriteTime
Çalışma dizinini değiştirir.
Set-Location D:\Scripts
Tek başına basit görünür, ancak script akışında göreli yollarla çalışan otomasyonlarda önemlidir.
Sistemde çalışan process’leri listeler.
Get-Process
En çok CPU kullanan süreçleri sıralamak için:
Get-Process |
Sort-Object CPU -Descending |
Select-Object -First 10 Name, Id, CPU
Bu tip kullanım, performans analizi ve anlık sorun çözümünde çok değerlidir.
Servisleri listeler.
Get-Service
Sadece çalışan servisleri göstermek için:
Get-Service | Where-Object Status -eq 'Running'
Sadece durmuş olan kritik servisleri raporlamak için:
Get-Service |
Where-Object Status -eq 'Stopped' |
Select-Object Name, DisplayName, Status
Servis başlatmak ve durdurmak için kullanılır.
Start-Service Spooler
Stop-Service Spooler
Bu komutlar özellikle otomasyon, bakım penceresi ve servis sağlığı kontrolü için önemlidir.
Pipeline’dan gelen nesneleri filtreler. En çok kullanılan komutlardan biridir.
Get-Process | Where-Object WorkingSet -gt 200MB
PowerShell’de profesyonel kullanımın büyük kısmı veri alıp filtrelemeye dayanır. Bu yüzden Where-Object çekirdek araçtır.
Gereken alanları seçer. Raporlama için vazgeçilmezdir.
Get-Service | Select-Object Name, Status, StartType
İlk 5 sonucu almak için:
Get-Process | Select-Object -First 5
Son 5 sonucu almak için:
Get-Process | Select-Object -Last 5
Nesneleri belirli özelliklere göre sıralar. Microsoft dokümantasyonu, hem metin hem sayısal dönüşüm senaryoları için kullanılabildiğini ve script block ile özel sıralama yapılabildiğini gösterir. :contentReference[oaicite:5]{index=5}
Get-Service | Sort-Object Status, Name
Diskteki en büyük dosyaları bulmak için:
Get-ChildItem D:\Data -File -Recurse |
Sort-Object Length -Descending |
Select-Object -First 20 FullName, Length
Pipeline’dan gelen her nesne için işlem yapar.
Get-Service | ForEach-Object { $_.Name }
Daha anlamlı örnek:
Get-ChildItem C:\Temp -File |
ForEach-Object {
[PSCustomObject]@{
Name = $_.Name
SizeMB = [math]::Round($_.Length / 1MB, 2)
}
}
Ancak Microsoft’un performans rehberi, pipeline içinde gereksiz şekilde başka pipeline’lar başlatmanın maliyetli olabileceğini ve özellikle Export-Csv gibi komutların her iterasyonda çağrılmasının ciddi performans kaybı oluşturduğunu vurgular. Bu nedenle ForEach-Object kullanırken akış tasarımına dikkat etmek gerekir. :contentReference[oaicite:6]{index=6}
Çıktıyı tablo halinde daha okunabilir gösterir.
Get-Service | Select-Object Name, Status | Format-Table -AutoSize
Önemli not: Format-Table raporlama zincirinin sonuna yakın kullanılmalıdır. Çünkü biçimlendirme komutları çıktıyı görsel amaçla düzenler; sonrasında CSV ya da JSON’a dönüştürmek istenirse sorun çıkabilir.
PowerShell en çok dosya, klasör, log ve arşiv yönetiminde zaman kazandırır.
Get-ChildItem D:\Shares -File -Recurse |
Sort-Object Length -Descending |
Select-Object -First 50 FullName, Length
Get-ChildItem D:\Shares -File -Recurse |
Where-Object LastWriteTime -gt (Get-Date).AddDays(-30) |
Select-Object FullName, LastWriteTime
Get-ChildItem D:\Shares -Directory -Recurse |
Where-Object { (Get-ChildItem $_.FullName -Force | Measure-Object).Count -eq 0 } |
Select-Object FullName
Bu örnekler özellikle file server housekeeping, storage analizi ve migration öncesi keşif işlemlerinde çok faydalıdır.
Sistem yöneticileri için servis sağlığı ve işlem takibi günlük işin merkezindedir.
Get-Service |
Where-Object Status -eq 'Stopped' |
Select-Object Name, DisplayName, StartType
Get-Service |
Where-Object { $_.StartType -eq 'Automatic' -and $_.Status -ne 'Running' } |
Select-Object Name, DisplayName, Status, StartType
Get-Process |
Sort-Object CPU -Descending |
Select-Object -First 10 Name, Id, CPU, WorkingSet
Get-Process |
Sort-Object WorkingSet -Descending |
Select-Object -First 10 Name, Id,
@{Name='MemoryMB';Expression={[math]::Round($_.WorkingSet / 1MB, 2)}}
Bu tip komutlar anlık troubleshooting sırasında çok değerlidir. GUI ile tek tek bakmak yerine birkaç saniyede filtrelenmiş sonuç alınabilir.
Windows troubleshooting denildiğinde event log analizi vazgeçilmezdir. Burada Get-WinEvent öne çıkar.
Get-WinEvent -LogName System -MaxEvents 50
Son 24 saatteki hata kayıtlarını bulmak için:
Get-WinEvent -LogName System |
Where-Object {
$_.LevelDisplayName -eq 'Error' -and
$_.TimeCreated -gt (Get-Date).AddDays(-1)
} |
Select-Object TimeCreated, Id, ProviderName, Message
Belirli Event ID’ye göre filtreleme:
Get-WinEvent -LogName System |
Where-Object Id -eq 7036 |
Select-Object TimeCreated, Id, Message
Bu yapı, özellikle servis restart’ları, disk hataları ve sistem kararsızlıklarında hızlı analiz sağlar.
PowerShell sadece yerel sistem yönetimi için değil, ağ sağlığı ve bağlantı testleri için de sık kullanılır.
Test-Connection, bir hedefe ICMP tabanlı erişim testi yapar.
Test-Connection SRV-FS01 -Count 2
Birden fazla sunucuyu test etmek için:
'SRV-FS01','SRV-APP01','SRV-DB01' |
ForEach-Object {
Test-Connection $_ -Count 1 -ErrorAction SilentlyContinue
}
'SRV-FS01','SRV-APP01','SRV-DB01' |
ForEach-Object {
$result = Test-Connection $_ -Count 1 -Quiet -ErrorAction SilentlyContinue
[PSCustomObject]@{
ComputerName = $_
Reachable = $result
}
}
Bu yaklaşım, günlük sağlık kontrolleri ve izleme scriptleri için temel oluşturur.
Kurumsal ortamda gerçek güç, aynı komutu onlarca hatta yüzlerce sunucuda merkezi biçimde çalıştırabilmektir. Bu noktada Invoke-Command kritik cmdlet’lerden biridir.
Invoke-Command -ComputerName SRV-FS01 -ScriptBlock { Get-Service }
Birden fazla sunucuda aynı komutu çalıştırmak için:
Invoke-Command -ComputerName SRV-FS01,SRV-APP01,SRV-DB01 -ScriptBlock {
Get-Service | Where-Object Status -eq 'Running'
}
Belirli bir servis durumunu uzaktan sorgulamak için:
Invoke-Command -ComputerName SRV-FS01 -ScriptBlock {
Get-Service -Name LanmanServer
}
Microsoft dokümantasyonuna göre Invoke-Command, yerel ya da uzak bilgisayarlarda komut çalıştırmak için kullanılır ve PowerShell remoting mimarisinin temel parçalarından biridir. :contentReference[oaicite:7]{index=7}
PowerShell’i profesyonel yapan şeylerden biri, çıktıyı yalnızca ekranda göstermeyip rapora dönüştürebilmesidir.
Export-Csv, nesneleri CSV dosyasına aktarır. Microsoft dokümantasyonu bu cmdlet’in nesneleri satır/sütun yapısına dönüştürerek dışa aktardığını belirtir. :contentReference[oaicite:8]{index=8}
Get-Service |
Select-Object Name, Status, StartType |
Export-Csv .\services.csv -NoTypeInformation
Bu çıktı Excel’de rahatlıkla açılabilir ve ekiplerle paylaşılabilir.
Get-Service |
Select-Object Name, Status, StartType |
ConvertTo-Json
JSON çıktısı özellikle API entegrasyonları ve otomasyon sistemlerinde kullanışlıdır.
$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
Bu yapı, günlük bakım raporları, audit çıktıları ve kapasite değerlendirmeleri için çok kullanışlıdır.
Birçok yönetici PowerShell’de komutu çalıştırır ama ölçek büyüdüğünde performans maliyeti fark edilir hale gelir. Microsoft’un script performansı rehberi, özellikle pipeline içinde gereksiz pipeline başlatmaktan kaçınılmasını önerir. Aynı şekilde Export-Csv komutunu her döngü adımında çağırmak yerine, nesneleri üretip en sonda tek seferde CSV’ye aktarmak çok daha verimli olabilir. Microsoft’un örneğinde bu fark yüzlerce kat performans avantajı oluşturur. :contentReference[oaicite:9]{index=9}
Import-Csv .\Input.csv | ForEach-Object {
[pscustomobject]@{
Name = $_.Name
} | Export-Csv .\Output.csv -Append -NoTypeInformation
}
Import-Csv .\Input.csv | ForEach-Object {
[pscustomobject]@{
Name = $_.Name
}
} | Export-Csv .\Output.csv -NoTypeInformation
Bu ayrım küçük görünse de büyük veri setlerinde ciddi fark yaratır.
Aşağıda günlük operasyonda çok iş gören, kısa ama güçlü komut seti yer alıyor.
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
Konsolda hızlı çalışırken alias kullanmak cazip gelebilir; ancak üretim scriptlerinde gci yerine Get-ChildItem, ? yerine Where-Object kullanmak okunabilirlik ve bakım açısından daha doğrudur.
Format-Table veya Format-List komutlarını pipeline’ın ortasında kullanmak, nesne akışını bozabilir. Bu komutlar sunum içindir; veri işleme zincirinin sonuna yakın kullanılmalıdır.
Özellikle servis durdurma, dosya silme, yetki değiştirme gibi komutlar önce test ortamında doğrulanmalıdır. PowerShell güçlüdür; bu güç hatayı da büyütebilir.
Bir komutun neden çalıştığını anlamadan kullanmak sürdürülebilir değildir. Özellikle Get-Member ve Get-Help bu nedenle sürekli kullanılmalıdır.
Büyük veri setlerinde ya da yüzlerce sunucuda çalışan scriptlerde küçük tasarım hataları ciddi gecikmeler yaratabilir. Microsoft’un performans önerileri bu konuda doğrudan uygulanabilir pratikler sunar. :contentReference[oaicite:10]{index=10}
Bu soru sahada çok sık sorulur. Kısa cevap: ortamına göre değişir.
Ancak tüm modüller PowerShell 7’de aynı şekilde çalışmayabilir. Özellikle eski Windows odaklı yönetim modüllerinde dikkatli test gerekir. Microsoft bu farkları resmi fark dokümanında ayrıntılı olarak listeler. :contentReference[oaicite:11]{index=11}
Bir kurumda onlarca Windows sunucusunun servis sağlığı her sabah manuel olarak kontrol ediliyordu. Yönetim ekibi uzak masaüstü bağlantılarıyla tek tek sunuculara bağlanıyor, kritik servisleri gözle kontrol ediyor ve sorunları Excel’e işliyordu. Süreç hem yavaştı hem de insan hatasına açıktı.
Bu süreç daha sonra PowerShell ile yeniden tasarlandı. Sunucu listesi bir metin dosyasında tutuldu, Invoke-Command ile kritik servisler merkezi olarak sorgulandı, sonuçlar filtrelenip Export-Csv ile raporlandı. Sonuç olarak günlük kontrol süresi ciddi biçimde kısaldı ve standart rapor üretimi mümkün hale geldi.
Bu örnek, PowerShell’in neden sadece “komut çalıştırma” değil, gerçek bir operasyon standardizasyon aracı olduğunu net biçimde gösterir.
PowerShell komutları konusu yüzeysel ele alındığında yalnızca bir komut listesi gibi görünür. Oysa profesyonel seviyede PowerShell; nesne mantığı, pipeline disiplini, filtreleme, uzaktan yönetim ve raporlama yeteneği sayesinde sistem yöneticilerinin en güçlü araçlarından biri haline gelir.
Bu rehberde ele alınan komutlar, günlük sistem yönetimi için çekirdek bir toolkit oluşturur. Ancak asıl değer komutların tek tek bilinmesinde değil; doğru sırayla birleştirilmesinde, çıktının anlamlandırılmasında ve otomasyona dönüştürülmesindedir.
PowerShell’i gerçekten iyi kullanmak isteyen herkes için öneri nettir: Get-Command ile keşfet, Get-Help ile öğren, Get-Member ile nesneyi tanı, sonra pipeline ile gerçek gücü kullan.
File server ve Windows yönetimi tarafında daha derin içerikler için şu rehberlere de göz atabilirsiniz: Windows File Server Güvenliği, NTFS Permission Tasarımı, File Server Migration ve Windows File Server Performans İyileştirme.
Çünkü PowerShell, Windows yönetiminde otomasyon, raporlama ve uzaktan yönetim için standart araçlardan biridir. Tekrarlayan işleri hızlandırır ve insan hatasını azaltır.
Get-Command, Get-Help ve Get-Member. Bu üç cmdlet, komut keşfi, yardım sistemi ve nesne mantığını anlamak için temel oluşturur.
Çünkü PowerShell’in asıl gücü komutları zincirlemekten gelir. Bir komutun çıktısı başka bir komuta nesne olarak aktarılır; bu da filtreleme, sıralama ve raporlamayı kolaylaştırır.
Modern özellikler ve çapraz platform desteği için PowerShell 7 avantajlıdır. Ancak bazı eski kurumsal modüller Windows PowerShell 5.1 ile daha uyumlu olabilir. Bu yüzden üretim ortamında test şarttır.
Çünkü PowerShell çıktısını paylaşılabilir, analiz edilebilir ve Excel’de açılabilir rapora dönüştürmenin en pratik yollarından biridir.
Bu makalede detaylı en çok kullanılan bir sistem yöneticisi için en gerekli powershell komutları ile ilgili bilgiler verdim. Eklemek istediğiniz ya da sormak istediğiniz ne varsa yorumlarda belirtebilirsiniz.