powershell komutları
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.
Kurumsal IT altyapılarında zamanla depolama ihtiyaçlarının artması, eski sunucuların performansının yetersiz kalması veya yeni mimariye…
NTFS Permission Tasarımı: AGDLP Modeli ile Kurumsal Yetkilendirme Rehberi Kurumsal ortamlarda NTFS permission tasarımı, dosya…
Kurumsal yapılarda Windows File Server güvenliği, veri bütünlüğü ve iş sürekliliği açısından kritik öneme sahiptir.…
Blockchain Log Bütünlüğü Bu yazımızda blockchain log bütünlüğü üzerine incelemelerde bulunacağız. Günümüz kurumsal sistemlerinde en…
A PowerShell SQL Server backup script is a practical way to standardize SQL backups across…
Kurumsal ortamlarda test, eğitim veya lab senaryolarında çok sayıda sanal makineyi manuel oluşturmak hem zaman…
This website uses cookies.
Read More