---
title: "PowerShell'e giriş: PowerShell 7 ile ilk adımlar"
author: "Abdulaziz Akyol"
author_url: https://www.abdulazizakyol.com/hakkimda/
url: https://www.abdulazizakyol.com/blog/power-shell-giris/
language: tr
published: 2020-07-25
updated: 2026-09-25
categories: ["PowerShell", "Sistem yönetimi"]
tags: ["PowerShell 7", "Windows PowerShell", "cmdlet", "Get-CimInstance", "winget", "PSResourceGet"]
description: "PowerShell 7 ile ilk adımlar: 5.1 farkı, winget ile kurulum, Verb-Noun, Get-Help, pipeline ve nesneler, filtreleme, ilk betik, ExecutionPolicy, modüller."
---

# PowerShell'e giriş: PowerShell 7 ile ilk adımlar

Yazar: [Abdulaziz Akyol](https://www.abdulazizakyol.com/hakkimda/) · 2020-07-25

## Öne çıkanlar

- PowerShell, komutların metin yerine .NET nesnesi döndürdüğü, Windows, Linux ve macOS'ta çalışan bir komut kabuğu ve betik dilidir.
- Windows PowerShell 5.1 (powershell.exe) Windows'la birlikte gelir ve .NET Framework üzerinde çalışır; PowerShell 7 (pwsh.exe) ayrı kurulur, modern .NET üzerinde çalışır ve 5.1 ile yan yana durur.
- Eylül 2026 itibarıyla güncel uzun süreli destek (LTS) sürümü PowerShell 7.6'dır; 18 Mart 2026'da yayımlandı, desteği 14 Kasım 2028'de bitiyor ve .NET 10 üzerinde çalışıyor.
- Get-WmiObject PowerShell 7'de yoktur; WMI sorguları aynı sınıflarla Get-CimInstance üzerinden yapılır.
- Execution policy bir güvenlik sınırı değildir; kullanıcının istemeden betik çalıştırmasını önleyen ek bir savunma katmanıdır.

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):

```powershell
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:

```powershell
$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ı:

```powershell
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:

```powershell
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:

```powershell
'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.

```powershell
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:

```powershell
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:

```powershell
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:

```powershell
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:

```powershell
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:

```powershell
$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:

```powershell
[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.

```powershell
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.

```powershell
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:

```powershell
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](https://www.abdulazizakyol.com/blog/vbscript-ten-powershell-e-yerel-kullanici-ve-grup-yonetimi/) bakabilirsiniz. PowerShell'i kayıt defteri ve Grup İlkesi doğrulaması için kullanan bir örnek [USB depolama engelleme yazısında](https://www.abdulazizakyol.com/blog/vbs-usb-enable-disable/), `bcdedit` gibi yerel komutları PowerShell'den çağırırken dikkat edilecekler de [önyükleme onarımı rehberinde](https://www.abdulazizakyol.com/blog/boot-yapilandirma/) 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-Command` ile bulun, `Get-Help -Examples` ile öğrenin, `Get-Member` ile çıktısını tanıyın.
- Filtreyi sola taşıyın; `Format-*` komutlarını yalnızca hattın sonunda kullanın.
- `Get-WmiObject` geçen eski betikleri `Get-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

1. [Differences between Windows PowerShell 5.1 and PowerShell 7.x (Microsoft Learn)](https://learn.microsoft.com/en-us/powershell/scripting/whats-new/differences-from-windows-powershell)
2. [Install PowerShell 7 on Windows (Microsoft Learn)](https://learn.microsoft.com/en-us/powershell/scripting/install/install-powershell-on-windows)
3. [PowerShell Support Lifecycle (Microsoft Learn)](https://learn.microsoft.com/en-us/powershell/scripting/install/powershell-support-lifecycle)
4. [about_Execution_Policies (Microsoft Learn)](https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_execution_policies)
5. [Package management for PowerShell: PSResourceGet (Microsoft Learn)](https://learn.microsoft.com/en-us/powershell/gallery/powershellget/overview)
6. [Working with WMI: PowerShell 101 (Microsoft Learn)](https://learn.microsoft.com/en-us/powershell/scripting/learn/ps101/07-working-with-wmi)

---

Abdulaziz Akyol, CX Teknoloji'nin (yapay zekâ, görüntü işleme ve IoT) kurucusudur. Asıl sürüm: https://www.abdulazizakyol.com/blog/power-shell-giris/
