PowerShell, Microsoft’un sistem yönetimi ve otomasyon için geliştirdiği bir komut kabuğu ve betik dilidir; komutları metin yerine yapılandırılmış .NET nesneleri döndürdüğü için çıktıyı ayrıştırmadan filtreleyip işleyebilirsiniz. Bugün başlayan biri için doğru adres, Windows, Linux ve macOS’ta çalışan PowerShell 7’dir.
Bu yazı, 2020’de tuttuğum kısa komut listesinin baştan yazılmış hâli. O listedeki Get-WmiObject gibi komutlar PowerShell 7’de artık yok; aşağıda her birinin güncel karşılığını ve arkasındaki mantığı anlatıyorum.
Windows PowerShell 5.1 ile PowerShell 7 arasındaki fark
| Windows PowerShell 5.1 | PowerShell 7 | |
|---|---|---|
| Çalıştırılabilir dosya | powershell.exe |
pwsh.exe |
| Altyapı | .NET Framework | Modern .NET (7.6 için .NET 10) |
| Platform | Yalnızca Windows | Windows, Linux, macOS |
| Kurulum | Windows’la gelir | Ayrı kurulur, 5.1 ile yan yana durur |
| Geliştirme | Windows yaşam döngüsüne bağlı bakım | Aktif; LTS ve Stable sürümler |
WMI v1 cmdlet’leri (Get-WmiObject) |
Var | Kaldırıldı, yerine CIM cmdlet’leri |
| Yerleşik düzenleyici | Windows PowerShell ISE | Yok; VS Code ve PowerShell eklentisi |
Microsoft’un yaşam döngüsü sayfasına göre Eylül 2026 itibarıyla güncel LTS sürümü PowerShell 7.6 (18 Mart 2026’da yayımlandı, desteği 14 Kasım 2028’de bitiyor). PowerShell 7.5 ve önceki LTS sürümü 7.4’ün desteği 10 Kasım 2026’da sona eriyor. Sunucularda LTS sürümü tercih ediyorum; güncellemeler yalnızca güvenlik ve kararlılık düzeltmesi içeriyor.
5.1’i kaldırmanıza gerek yok, zaten kaldıramazsınız da: bazı eski modüller yalnızca orada çalışır. PowerShell 7, bu modüllerin bir kısmını Import-Module -UseWindowsPowerShell ile arka planda bir 5.1 işleminde çalıştıran bir uyumluluk katmanı sunar.
Kurulum: winget ile PowerShell 7
Windows 11’de ve Masaüstü Deneyimli Windows Server 2025’te winget hazır gelir (Windows Server 2022 ve öncesinde yoktur):
winget search --id Microsoft.PowerShell --exact
winget install --id Microsoft.PowerShell --source winget
winget install --id Microsoft.PowerShell --source winget --installer-type wix # MSI paketi
winget upgrade --id Microsoft.PowerShell
Kurulum belgesindeki önemli ayrıntı: 7.6.0’dan itibaren winget varsayılan olarak MSIX paketini kuruyor. MSIX tek kullanıcıya kurulur, gelen PowerShell uzak oturumlarını desteklemez ve Set-ExecutionPolicy -Scope LocalMachine gibi $PSHOME’a yazan ayarlara izin vermez. Uzaktan yönetilecek sunucularda bu yüzden MSI paketini (--installer-type wix) kurun. Belgeye göre 7.7 sürümüyle MSI paketi yayımlanmayacak; sunucu kurulum standardınızı buna göre gözden geçirin.
Kurulumdan sonra Başlat menüsünden “PowerShell 7”yi ya da komut satırından pwsh’yi açıp sürümü kontrol edin:
$PSVersionTable.PSVersion
Komut adlandırma: Fiil-İsim (Verb-Noun)
PowerShell komutlarına cmdlet denir ve hepsi Fiil-İsim kalıbındadır: Get-Service, Stop-Process, New-LocalUser. Fiiller onaylı bir listeden gelir (Get-Verb ile görebilirsiniz); bu sayede bir komutun adını bilmeseniz de tahmin edebilirsiniz. Get okur, Set değiştirir, New oluşturur, Remove siler. ls, dir ya da gci gibi kısayollar aslında Get-ChildItem’ın takma adlarıdır (Get-Alias). Etkileşimli kullanımda rahattırlar, ama betiklerde okunabilirlik için tam adı yazın.
Yardım ve keşif: Get-Help, Get-Command, Get-Member
Eski notumdaki get-help * tüm komutları listelemek içindi. Bugün bu üç komut, PowerShell’i ezberlemeden kullanmanın anahtarı:
Update-Help -ErrorAction SilentlyContinue # yardım dosyalarını indirir
Get-Help Get-Service -Examples # örnekler
Get-Help about_Pipelines # kavram konuları
Get-Command -Verb Get -Noun *Service* # adı bilinmeyen komutu bul
Get-Command -Module Microsoft.PowerShell.LocalAccounts
Get-Service | Get-Member # nesnenin özellik ve yöntemleri
Get-Member, bir komutun döndürdüğü nesnenin türünü, özelliklerini (Property) ve yöntemlerini (Method) gösterir. Bir sonraki adımda neyle filtreleyeceğinizi buradan öğrenirsiniz.
Pipeline ve nesneler
Pipeline (|), bir komutun çıktısını sonrakine aktarır. Linux kabuklarından farkı, aktarılanın metin değil nesne olmasıdır; sütun kesip ayrıştırmanız gerekmez:
Get-Process | Sort-Object CPU -Descending | Select-Object -First 5 Name, Id, CPU
Nesnelerin yöntemleri de doğrudan kullanılabilir. Eski notta "aBDULAZIZ".ToUpper() örneği vardı; Türkçe sistemlerde burada bir tuzak var:
'abdulaziz'.ToUpper() # tr-TR kültüründe: ABDULAZİZ (noktalı İ)
'abdulaziz'.ToUpperInvariant() # her sistemde: ABDULAZIZ
ToUpper() geçerli kültürü kullanır. Kullanıcı adı, sunucu adı ya da dosya adı gibi makinenin karşılaştıracağı değerlerde ToUpperInvariant() / ToLowerInvariant() kullanın.
Filtreleme, seçme ve sıralama
Üç komut işin çoğunu görür: Where-Object satırları süzer, Select-Object sütunları seçer, Sort-Object sıralar. Format-Table ve Format-List ise yalnızca ekranda göstermek içindir ve hattın en sonunda durmalıdır.
Get-Service -Name M* | Where-Object Status -eq 'Running' |
Sort-Object DisplayName | Select-Object Name, DisplayName, StartType
Get-Service -Name WinRM | Format-List *
Kural olarak filtreyi mümkün olduğunca sola, yani veriyi üreten komuta taşıyın. Eski nottaki olay günlüğü örneği tüm System günlüğünü okuyup sonra süzüyordu; -FilterHashtable süzmeyi kaynağında yapar:
Get-WinEvent -FilterHashtable @{ LogName = 'System'; Level = 2; StartTime = (Get-Date).AddDays(-7) } -MaxEvents 200 |
Select-Object TimeCreated, Id, ProviderName, Message |
Export-Csv -Path "$env:TEMP\sistem-hatalari.csv" -NoTypeInformation -Encoding utf8BOM
utf8BOM kodlaması, dosya Excel’de açıldığında Türkçe karakterlerin bozulmamasını sağlar (bu değer PowerShell 7’de geçerlidir; 5.1’de utf8 zaten BOM ekler).
WMI/CIM: Get-WmiObject yerine Get-CimInstance
PowerShell 7’de Get-WmiObject, Invoke-WmiMethod ve diğer WMI v1 cmdlet’leri kaldırıldı; aynı işi CIM cmdlet’leri yapıyor. Eski nottaki BIOS ve bilgisayar bilgisi sorgularının güncel hâli:
Get-CimInstance -ClassName Win32_BIOS
Get-CimInstance -ClassName Win32_BIOS -ComputerName DC01
Get-CimInstance -ClassName Win32_ComputerSystem |
Select-Object Name, Domain, Manufacturer, Model,
@{ n = 'RAM_GB'; e = { [math]::Round($_.TotalPhysicalMemory / 1GB, 1) } }
Get-CimInstance -ClassName Win32_OperatingSystem | Select-Object Caption, Version, LastBootUpTime
Get-CimInstance -ComputerName uzak bağlantıda WinRM kullanır; güvenlik duvarında DCOM yerine tek bir yönetim portu açmanız yeterli olur.
Roller ve özellikler
Eski listedeki Add-WindowsFeature ve Remove-WindowsFeature, bugün Install-WindowsFeature ve Uninstall-WindowsFeature komutlarının takma adlarıdır. PowerShell 3.0’dan beri modüller otomatik yüklendiği için Import-Module ServerManager satırına da gerek yok. Windows Server’da:
Get-WindowsFeature | Where-Object Installed
Get-WindowsFeature -Name *AD* | Where-Object Installed
Install-WindowsFeature -Name RSAT-AD-Tools, RSAT-ADCS
Uninstall-WindowsFeature -Name RSAT-AD-Tools
Microsoft’un uyumluluk notuna göre Get-WindowsFeature PowerShell 7’de doğru nesneyi döndürür ama varsayılan tablo görünümünde bazı sütunlar boş görünebilir; değerleri Select-Object ile okuyun. Windows 10/11 istemcilerde RSAT araçları “isteğe bağlı özellik” olarak gelir:
Get-WindowsCapability -Online | Where-Object Name -like 'Rsat*' | Select-Object Name, State
Add-WindowsCapability -Online -Name 'Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0'
Değişkenler ve ilk betik
Değişkenler $ ile başlar; dizi ve karma tablo (hashtable) söz dizimi kısadır, çift tırnak içinde değişkenler açılır:
$sunucu = @{ Ad = 'SRV01'; Rol = 'DC' }
$portlar = 80, 443, 3389
"Sunucu $($sunucu.Ad) icin $($portlar.Count) port kontrol edilecek."
İlk betik olarak yerel disklerin doluluğunu raporlayan küçük bir araç yazalım. disk-raporu.ps1 adıyla kaydedin:
[CmdletBinding()]
param(
[ValidateRange(1, 99)]
[int]$EsikYuzde = 15
)
$diskler = Get-CimInstance -ClassName Win32_LogicalDisk -Filter 'DriveType = 3'
foreach ($d in $diskler) {
$bosYuzde = [math]::Round($d.FreeSpace / $d.Size * 100, 1)
[pscustomobject]@{
Surucu = $d.DeviceID
BoyutGB = [math]::Round($d.Size / 1GB, 1)
BosGB = [math]::Round($d.FreeSpace / 1GB, 1)
BosYuzde = $bosYuzde
Durum = if ($bosYuzde -lt $EsikYuzde) { 'UYARI' } else { 'OK' }
}
}
Çalıştırmak için: .\disk-raporu.ps1 -EsikYuzde 20 | Format-Table. Betik ekrana metin yazmıyor, nesne döndürüyor; bu yüzden çıktısını Where-Object Durum -eq 'UYARI' ile süzebilir ya da Export-Csv ile dosyaya yazabilirsiniz. İyi PowerShell betiğinin temel alışkanlığı budur.
ExecutionPolicy: betik çalıştırma ilkesi
İndirdiğiniz ya da yazdığınız betik “betik çalıştırma devre dışı” hatası veriyorsa sebep execution policy’dir. Windows PowerShell 5.1’de Windows istemcilerde varsayılan Restricted, Windows Server’da RemoteSigned’dır; PowerShell 7 belgeleri Windows için varsayılanı RemoteSigned olarak veriyor.
Get-ExecutionPolicy -List
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
Unblock-File -Path .\disk-raporu.ps1
RemoteSigned, yerelde yazılan betikleri çalıştırır; internetten indirilenler için imza ister. Microsoft’un belgesi açıkça söylüyor: execution policy bir güvenlik sınırı değildir, derinlemesine savunmanın bir katmanıdır. Kurumsal ortamda ilkeyi Grup İlkesi’ndeki “Turn on Script Execution” ayarıyla merkezden verin, kritik betikleri kod imzalama sertifikasıyla imzalayın.
Modüller ve PowerShell Gallery
Modüller, cmdlet’leri paketleyen birimlerdir. PowerShell Gallery topluluk ve Microsoft modüllerinin merkezi deposudur. PowerShell 7.4 ve sonrasında gelen Microsoft.PowerShell.PSResourceGet modülü, eski PowerShellGet ve PackageManagement modüllerinin yerini alıyor; Windows PowerShell 5.1’le gelen PowerShellGet 1.0.0.1 sürümü ise artık desteklenmiyor.
Get-Module -ListAvailable | Select-Object Name, Version
Find-PSResource -Name PSScriptAnalyzer
Install-PSResource -Name PSScriptAnalyzer -Scope CurrentUser
Invoke-ScriptAnalyzer -Path .\disk-raporu.ps1
PSScriptAnalyzer, betiklerinizi en iyi uygulama kurallarına göre denetler. Galeriden modül kurmadan önce yayıncısını ve kaynak kodunu inceleyin; galeri bir paket deposudur, güvenlik denetiminin yerine geçmez.
Uzaktan yönetim
PowerShell uzaktan yönetimi (remoting) Windows Server’da varsayılan olarak açıktır; istemcilerde Enable-PSRemoting ile açılır. Varsayılan uç nokta Windows PowerShell 5.1’dir. PowerShell 7 oturumu için, 7’yi kurduğunuz makinede yönetici pwsh içinden Enable-PSRemoting çalıştırın; bu komut o sürüm için biri kısa, biri tam sürüm numaralı iki uç nokta oluşturur. Adları Get-PSSessionConfiguration ile görüp -ConfigurationName parametresiyle bağlanırsınız:
Enter-PSSession -ComputerName SRV01 # etkileşimli oturum
Invoke-Command -ComputerName SRV01, SRV02 -ScriptBlock { Get-Service -Name WinRM }
Invoke-Command -ComputerName SRV01 -ScriptBlock { Get-PSSessionConfiguration | Select-Object Name }
Invoke-Command -ComputerName SRV01 -ConfigurationName PowerShell.7 -ScriptBlock { $PSVersionTable.PSVersion }
WinRM tabanlı uzaktan yönetim Windows’lar arasında çalışır; Linux ve macOS makinelere bağlanmak için PowerShell 7 SSH üzerinden uzaktan yönetimi destekler (Enter-PSSession -HostName).
Toplu yerel kullanıcı ve grup işlemleri, $using: ile değişken aktarımı ve Windows LAPS için VBScript’ten PowerShell’e yerel kullanıcı ve grup yönetimi rehberine bakabilirsiniz. PowerShell’i kayıt defteri ve Grup İlkesi doğrulaması için kullanan bir örnek USB depolama engelleme yazısında, bcdedit gibi yerel komutları PowerShell’den çağırırken dikkat edilecekler de önyükleme onarımı rehberinde var.
Kontrol listesi
- PowerShell 7.6 LTS’yi kurun; sunucularda MSI paketini seçin, 5.1’i yerinde bırakın.
- Bilmediğiniz komutu
Get-Commandile bulun,Get-Help -Examplesile öğrenin,Get-Memberile çıktısını tanıyın. - Filtreyi sola taşıyın;
Format-*komutlarını yalnızca hattın sonunda kullanın. Get-WmiObjectgeçen eski betikleriGet-CimInstance’a çevirin.- Execution policy’yi güvenlik önlemi değil kaza önleyici olarak görün; kurumsal betikleri imzalayın.
- Modülleri PSResourceGet ile kurun ve betiklerinizi PSScriptAnalyzer’dan geçirin.
Sık sorulan sorular
PowerShell 7 ile Windows PowerShell 5.1 arasındaki fark nedir?
Windows PowerShell 5.1 Windows'un bileşenidir, .NET Framework üzerinde çalışır ve artık yeni özellik almaz. PowerShell 7 açık kaynaklıdır, modern .NET üzerinde Windows, Linux ve macOS'ta çalışır, ayrı kurulur ve 5.1'i kaldırmadan onunla yan yana durur. Dil büyük ölçüde aynıdır; farklar çoğunlukla kaldırılan eski cmdlet'lerde ve modül uyumluluğundadır.
PowerShell 7 Windows'a nasıl kurulur?
Windows 11'de en kolay yol winget install --id Microsoft.PowerShell --source winget komutudur. 7.6 sürümünden itibaren winget varsayılan olarak MSIX paketini kurar; uzaktan yönetim yapılacak sunucularda --installer-type wix parametresiyle MSI paketini tercih edin, çünkü MSIX kurulumu gelen uzak oturumları desteklemez.
Get-WmiObject yerine ne kullanılmalı?
Get-CimInstance kullanın. Aynı WMI sınıflarını sorgular: Get-CimInstance -ClassName Win32_BIOS -ComputerName DC01 gibi. Uzak bağlantıda varsayılan olarak WinRM (WS-Management) kullanır; eski DCOM bağlantısı gerekiyorsa New-CimSessionOption -Protocol Dcom ile bir CIM oturumu açabilirsiniz.
'Bu sistemde betik çalıştırma devre dışı' hatası nasıl çözülür?
Etkin ilkeyi Get-ExecutionPolicy -List ile görün. Kendi kullanıcınız için Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser yeterlidir. İnternetten indirilen imzasız bir betiğe güveniyorsanız Unblock-File ile engelini kaldırın. Ayar Grup İlkesi'yle zorlanıyorsa PowerShell'den değiştirilemez.
Kaynaklar
- Differences between Windows PowerShell 5.1 and PowerShell 7.x (Microsoft Learn) learn.microsoft.com
- Install PowerShell 7 on Windows (Microsoft Learn) learn.microsoft.com
- PowerShell Support Lifecycle (Microsoft Learn) learn.microsoft.com
- about_Execution_Policies (Microsoft Learn) learn.microsoft.com
- Package management for PowerShell: PSResourceGet (Microsoft Learn) learn.microsoft.com
- Working with WMI: PowerShell 101 (Microsoft Learn) learn.microsoft.com
