Birçok geliştirici PowerShell’i sever ve bunun iyi bir nedeni vardır: çoğumuzun zamanının önemli bir bölümünü geçirdiği Windows Komut İstemi’ne güç, işlevsellik ve esneklik katar. Bununla birlikte, biraz öğrenme eğrisi ile gelir, ancak bilmeniz gereken temel komutlarda ustalaştığınızda, steroidlerle verimlilik elde edersiniz.
PowerShell komutları cmdlet’ler olarak bilinir ve bu cmdlet’ler işlevsel yeteneklerinin arkasındaki itici güçtür. Genel Windows deneyimini iyileştiren komutlardan geliştirme çalışmaları için yararlı olan komutlara kadar, geliştiricilerin bilmesi gereken düzinelerce önemli komut vardır.
Cmdlet’lere ek olarak, komut dosyalarınızdan en iyi şekilde yararlanmanıza yardımcı olan düzinelerce parametre ve yöntem vardır. WhatIf parametresi, PowerShell komut dosyalarını gerçekte çalıştırmadan test etmek için özellikle kullanışlıdır (@pluralsight). Genellikle her komut için birkaç parametre ve yöntem mevcuttur. Aşağıda listelenen komutlar, herhangi bir geliştirici için iyi bir başlangıç noktasıdır, ancak avantajlardan tam olarak yararlanmak için parametrelerde ve diğer yöntemlerde de ustalaşmanız gerekir.
Temel PowerShell Komutları
Bu temel PowerShell komutları, çeşitli biçimlerde bilgi edinmek, güvenliği yapılandırmak ve temel raporlama için yararlıdır.
Get-Command
Get-Command, mevcut oturumunuzda kullanılabilen tüm komutları getiren, kullanımı kolay bir referans cmdlet’idir.
Basitçe şu komutu yazın:
get-command
Çıktı aşağıdaki gibi görünecektir:
Komut Tipi | Adı | Tanım |
---|---|---|
Cmdlet | Add-Content | Add-Content [-Path] <String[… |
Cmdlet | Add-History | Add-History [[-InputObject] … |
Cmdlet | Add-Member | Add-Member [-MemberType] |
Get-Help
Get-Help komutu, PowerShell kullanan herkes için olmazsa olmazdır ve mevcut tüm komutları çalıştırmak ve bunlarla çalışmak için ihtiyaç duyduğunuz bilgilere hızlı bir şekilde erişmenizi sağlar.
Örneğin, bazı örnekler için aşağıdaki komutları girebilirsiniz:
Get-Help [[-Name] ] [-Path ] [-Category ] [-Component ]
[-Functionality ] [-Role ] [-Examples] []
Set-ExecutionPolicy
Microsoft, PowerShell ortamında kötü amaçlı komut dosyalarının yürütülmesini önlemek için komut dosyası oluşturmayı varsayılan olarak devre dışı bırakır. Ancak geliştiriciler komut dosyaları yazıp yürütmek isterler, bu nedenle Set-ExecutionPolicy komutu, PowerShell komut dosyalarını çevreleyen güvenlik düzeyini kontrol etmenizi sağlar. Dört güvenlik düzeyinden birini ayarlayabilirsiniz:
- Kısıtlanmış: Bu, PowerShell komut dosyalarının çalışmasını engelleyen varsayılan güvenlik düzeyidir. Bu güvenlik düzeyinde, yalnızca etkileşimli olarak komut girebilirsiniz.
- Hepsi İmzalanmış: Bu güvenlik düzeyi, komut dosyalarının yalnızca güvenilir bir yayıncı tarafından imzalanmışlarsa çalıştırılmasına izin verir.
- Uzaktan İmzalanmış: Bu güvenlik düzeyinde, yerel olarak oluşturulan tüm PowerShell komut dosyalarının çalıştırılmasına izin verilir. Uzaktan oluşturulan komut dosyalarının yalnızca saygın bir yayıncı tarafından imzalanmışlarsa çalıştırılmasına izin verilir.
- Sınırsız: Adından da anlaşılacağı gibi, sınırsız güvenlik düzeyi, yürütme ilkesinden tüm kısıtlamaları kaldırarak tüm komut dosyalarının çalıştırılmasına izin verir.
Benzer şekilde, tanıdık olmayan bir ortamda çalışıyorsanız, bu komutu kullanarak geçerli yürütme ilkesinin ne olduğunu kolayca öğrenebilirsiniz:
Get-ExecutionPolicy
Get-Service
Sistemde hangi hizmetlerin yüklü olduğunu bilmek de yararlıdır. Aşağıdaki komutla bu bilgilere kolayca erişebilirsiniz:
Get-Service
Çıktı aşağıdaki gibi görünecektir:
Durum | İsim | Görünen Ad |
---|---|---|
Çalışıyor | AdobeActiveFile… | Adobe Active File Monitor V4 |
Durduruldu | Alerter | Alerter |
Çalışıyor | ALG | Uygulama Katmanı Ağ Geçidi Hizmeti |
Durduruldu | AppMgmt | Uygulama Yönetimi |
Çalışıyor | ASChannel | Yerel İletişim Kanalı |
Belirli bir hizmetin yüklü olup olmadığını bilmeniz gerekiyorsa, -Name anahtarını ve hizmetin adını ekleyebilirsiniz; Windows hizmetin durumunu gösterecektir. Ek olarak, şu anda yüklü olan hizmetlerin belirli bir alt kümesini döndürmek için filtreleme özelliklerinden yararlanabilirsiniz. Aşağıdaki örnek, Get-Service komutundan gelen ve Where-Object cmdlet’ine aktarılan ve ardından durdurulan hizmetler dışındaki her şeyi filtreleyen bir veri çıktısıyla sonuçlanacaktır:
Get-Service | Where-Object {$_.status -eq "stopped"}
ConvertTo-HTML
Bir raporda kullanabileceğiniz veya başka birine gönderebileceğiniz verileri çıkarmanız gerekiyorsa, ConvertTo-HTML bunu yapmanın basit bir yoludur. Bunu kullanmak için, başka bir komuttan gelen çıktıyı ConvertTo-HTML komutuna aktarın ve HTML dosyasında hangi çıktı özelliklerinin olmasını istediğinizi belirtmek için -Property anahtarını kullanın. Ayrıca bir dosya adı da sağlamanız gerekecek.
Örneğin, aşağıdaki kod, geçerli konsoldaki PowerShell diğer adlarını listeleyen bir HTML sayfası oluşturur:
PS C:> get-alias | convertto-html > aliases.htm
PS C:> invoke-item aliases.htm
Get-EventLog
Get-EventLog cmdlet’ini kullanarak makinenizin olay günlüklerini ayrıştırmak için aslında PowerShell’i kullanabilirsiniz. Birkaç parametre mevcuttur. Belirli bir günlüğü görüntülemek için günlük dosyasının adını takiben -Log anahtarını kullanın. Örneğin, Uygulama günlüğünü görüntülemek için aşağıdaki komutu kullanırdınız:
Get-EventLog -Log “Application”
Bu yayında (@nextofwindows), Get-EventLog’un birkaç kullanım örneğine daha göz atın. Diğer yaygın parametreler şunlardır:
-Verbose
-Debug
-ErrorAction
-ErrorVariable
-WarningAction
-WarningVariable
-OutBuffer
-OutVariable
Get-Process
Kullanılabilir hizmetlerin bir listesini almak gibi, genellikle şu anda çalışan tüm işlemlerin hızlı bir listesini alabilmek yararlıdır. Get-Process komutu, bu bilgileri parmaklarınızın ucuna getirir.
Bonus: Donmuş veya artık yanıt vermeyen işlemleri durdurmak için Stop-Process’i kullanın. Sizi hangi işlemin engellediğinden emin değilseniz, sorunlu işlemi hızlı bir şekilde belirlemek için Get-Process’i kullanın. Ad veya işlem kimliğine sahip olduğunuzda, sonlandırmak için Stop-Process’i kullanın.
İşte bir örnek. Not Defteri’nin şu anda çalışan tüm örneklerini sonlandırmak için bu komutu çalıştırın:
Stop-Process -processname notepad
Ayrıca, Not Defteri’nin tüm örneklerini ve not ile başlayan diğer tüm işlemleri sonlandıran aşağıdaki örnek gibi joker karakterler de kullanabilirsiniz:
Stop-Process -processname note*
Clear-History
Ya komut geçmişinizdeki girişleri temizlemek isterseniz? Kolay – Clear-History cmdlet’ini kullanın. Ayrıca, yalnızca belirli komutları silmek için de kullanabilirsiniz. Örneğin, aşağıdaki komut, “help” içeren veya “command” ile biten komutları silecektir:
PS C:> Clear-History -Command help, *command
Bir oturuma giriş eklemek istiyorsanız, şunları kullanın:
Add-History
Format-Table
Bu cmdlet, herhangi bir çıktıyı tablo olarak biçimlendirmek için kullanılır. Örneğin, aşağıdaki komut çalışan işlemleri alır, bunları BasePriority’ye göre sıralar ve listeyi bir tabloda biçimlendirir:
Get-Process | Format-Table -Property Name, CPU, Memory -AutoSize
Yukarıdaki örnek, aşağıdaki gibi bir tablo biçimi üretir:
Tablonun Yapısı:
BasePriority | Handles | NPM(K) | PM(K) | WS(K) | CPU(s) | Id | SI | ProcessName |
---|---|---|---|---|---|---|---|---|
1 | 857 | 15 | 7248 | 8612 | 63.98 | 936 | 0 | services |
1 | 1824 | 30 | 11292 | 13316 | 49.44 | 964 | 0 | lsass |
2 | 640 | 22 | 67352 | 6336 | 83.28 | 17108 | 1 | Docker Desktop |
2 | 1228 | 52 | 336352 | 186876 | 9,442.59 | 10336 | 1 | chrome |
3 | 53 | 3 | 1096 | 604 | 0.33 | 420 | 0 | smss |
Tablonun Anlamı:
- BasePriority: Sürecin önceliği. Düşük sayılar daha yüksek önceliği gösterir.
- Handles: Sürecin açtığı nesne sayısı.
- NPM(K): Non-paged pool memory (sayfa olmayan havuz belleği) kullanımı (kilobyte cinsinden).
- PM(K): Private memory (özel bellek) kullanımı (kilobyte cinsinden).
- WS(K): Working set (çalışma seti) boyutu (kilobyte cinsinden).
- CPU(s): CPU kullanım süresi (saniye cinsinden).
- Id: Sürecin benzersiz kimlik numarası.
- SI: Swap usage (swap kullanımı) ile ilgili bir değer.
- ProcessName: Sürecin adı.
Tabloyu Nasıl Kullanabilirsiniz?
Bu tablo, sisteminizdeki süreçlerin kaynak kullanımını analiz etmek için kullanılabilir. Örneğin:
- Yüksek CPU kullanımı: “CPU(s)” sütunundaki yüksek değerler, hangi sürecin CPU’yu en çok kullandığını gösterir.
- Yüksek bellek kullanımı: “PM(K)” ve “WS(K)” sütunlarındaki yüksek değerler, hangi sürecin en çok bellek tükettiğini gösterir.
- Sıkıntılı süreçler: “SI” sütunundaki yüksek değerler, swap alanına sık sık yazılan ve sistem performansını düşürebilecek süreçleri işaret edebilir.
Format-List
Format-List, çıktı özelliklerinin her biri yeni bir satırda olmak üzere liste olarak verilmesini sağlar. Örneğin, aşağıdaki komut hizmetleri alır ve Format-List cmdlet’ini kullanarak her birini ayrı ayrı listeler:
Get-Service | Format-List
Name : AarSvc_5e1b8
DisplayName : AarSvc_5e1b8
Status : Stopped
DependentServices : {}
ServicesDependedOn : {}
CanPauseAndContinue : False
CanShutdown : False
CanStop : False
ServiceType : 224
Name : Appinfo
DisplayName : Application Information
Status : Running
DependentServices : {}
ServicesDependedOn : {RpcSs, ProfSvc}
CanPauseAndContinue : False
CanShutdown : False
CanStop : True
ServiceType : Win32OwnProcess, Win32ShareProcess
ForEach-Object
ForEach-Object cmdlet’i, belirtilen bir giriş nesnesi grubundaki her öğe için bir işlem gerçekleştirir. Birçok cmdlet zaten bir koleksiyondaki her nesneyle çalışırken, bir koleksiyondaki tüm nesnelerde başka değişiklikler yapmak veya belirli bir biçimlendirme uygulamak istediğiniz durumlar için ForEach-Object’e ihtiyacınız olacaktır.
İşte bir örnek: İşlem adlarının bir listesini görüntülemek istiyorsanız ve bu adların camgöbeği olarak işlenmesini istiyorsanız, şunları deneyebilirsiniz:
Get-Process | Write-Host $_.name -foregroundcolor cyan
Ancak yukarıdaki işlem aşağıdaki hatayı üretecektir:
At line:1 char:25
Çünkü Write-Host cmdlet’i, işlem hattından gönderilen verilerle ne yapmak istediğinizi anlamıyor.
Yani, ForEach-Object cmdlet’ini kullanmak bu sorunu çözer:
Get-Process | ForEach-Object {Write-Host $_.name -foregroundcolor cyan}
Clear-Content
Bir ögenin içeriğini silmek ancak ögenin kendisini korumak istiyorsanız, Clear-Content cmdlet’ini kullanırsınız:
Clear-Content C:\Temp\TestFile.txt
Bu komutu, belirli bir dosya uzantısına sahip tüm dosyaların içeriğini temizlemek için de kullanabilirsiniz. Örneğin, aşağıdaki kod, .txt uzantılı tüm dosyaların içeriğini temizler:
Clear-Content -path * -filter *.TXT –force
Ayrıca joker karakterler de kullanabilirsiniz. Bununla birlikte .txt dosyalarından .doc, .xls ve daha fazlasına kadar her tür dosyanın içeriğini de temizleyebilirsiniz.
ConvertTo-XML
Bir nesnenin XML tabanlı bir temsilini oluşturmak için ConvertTo-XML cmdlet’ini kullanın. Buna serileştirme de denir ve daha sonra yeniden kullanmak üzere verileri kaydetmek için yararlı bir işlemdir. İfadenizin işlem hattına nesneler yazmasının önemli olduğunu unutmayın. Write-Host kullanan hiçbir şey işlem hattına yazmaz ve bu nedenle serileştirilemez. İşte ConvertTo-XML’in eylem halindeki bir örneği:
Get-Service wuauserv -ComputerName chi-dc04,chi-p50,chi-core01 |
Export-Clixml -Path c:\work\wu.xml
Yukarıdaki örnekte kullanılan belirli cmdlet olan Export-Clixml, çoğu amaç için uygundur. Bir PowerShell ifadesinin çıktısını XML’ye dönüştürür ve bir dosyaya kaydeder.
New-AppLockerPolicy
New-AppLockerPolicy, bir dosya bilgisi listesinden ve diğer kural oluşturma seçeneklerinden yeni bir AppLocker ilkesi oluşturur. Toplamda, AppLocker ile etkileşim kurmanıza olanak sağlayan beş cmdlet vardır:
- Get-AppLockerFileInformation: AppLocker kurallarını oluşturmak için gereken bilgileri bir dosya listesinden veya olay günlüğünden alır.
- Get-AppLockerPolicy: Yerel, etkin veya bir etki alanı AppLocker ilkesini almak için kullanılır.
- New-AppLockerPolicy: Belirtildiği gibi, bu cmdlet yeni AppLocker ilkeleri oluşturmak için kullanılır.
- Set-AppLockerPolicy: Belirtilen bir grup ilkesi nesnesi için AppLocker ilkesini ayarlar.
- Test-AppLockerPolicy: Bir kullanıcının veya kullanıcı grubunun ilkeye göre belirli eylemleri gerçekleştirip gerçekleştiremeyeceğini belirlemek için kullanılır.
New-WebServiceProxy
New-WebServiceProxy, web hizmetini PowerShell içinden kullanmanıza ve yönetmenize olanak tanıyan bir web hizmeti proxy nesnesi oluşturur. Bu cmdlet, geliştiriciler için harika bir şeydir – PowerShell’de bir şeyi başarmaya çalışmak için zaten mümkün kılan başka bir hizmeti çağırabildiğinizde, birçok karmaşık kod yazma ihtiyacını ortadan kaldırır.
İşte bir örnek:
$url = http://.azurewebsites.net/CreateSite.asmx
$proxy = New-WebServiceProxy $url
$spAccount = “kullanıcı adı“
$spPassword = Read-Host -Prompt “Şifre Girin” –AsSecureString
$projectGuid = “”
$createOneNote = $false
Set-Alias
Set-Alias, üretkenliği artırmak için harika bir komuttur. Geçerli oturumdaki bir cmdlet veya diğer komut öğeleri için bir diğer ad ayarlamanıza (bir klavye kısayoluna benzer) olanak tanır, böylece daha hızlı çalışabilirsiniz.
Aşağıdaki örnek, Set-Alias kullanarak geçerli oturumda Notepad’i np olarak ayarlar:
New-Alias np c:\windows\system32\notepad.exe
Set-StrictMode
Set-StrictMode, komut dosyalarında, komut dosyası bloklarında ve ifadelerde kodlama kuralları oluşturur ve uygular. Kod kalitesini zorlamak ve sabah saat 3:00’te iki gündür uyuyamadığınızda gevşemenizi ve özensiz kod yazmanızı önlemek için kullanışlı bir komuttur.
Bunu kullanmak için dikkate alınması gereken iki parametre vardır: -Off ve -Version ve -Version’ın üç olası değeri vardır:
- Sürüm 1.0: Başlatılmamış değişkenleri kullanmanızı engeller (VBScript’teki Option Explicit gibi)
- Sürüm 2.0: Başlatılmamış değişkenleri kullanmanızı engeller ve ayrıca nesnelerde bulunmayan özelliklerin çağrılmasını önler, bir işleve yöntem gibi çağırılmasını engeller ve adlandırılmamış değişkenlerin oluşturulmasını yasaklar.
- En Son Sürüm: Bu seçenek, mevcut en son StrictMode sürümünü seçer ve kullanır. Bu iyi bir seçenektir çünkü kullandığınız PowerShell sürümünden bağımsız olarak en son StrictMode sürümünün kullanıldığı anlamına gelir.
Out-File
Cmdlet çıktısını bir dosyaya kaydetmeniz gerekiyorsa, yerel bir dosya oluşturan Out-File’ı kullanın.
Bu örnek, Get-Process’i kullanır ve çıktıyı ASCII biçiminde biçimlendirir, ardından Out-File, çıktıyı içeren bir Process.txt dosyası oluşturmak için FilePath kullanır.
$Procs = Get-Process
Out-File -FilePath .\Process.txt -InputObject $Procs -Encoding ASCII -Widt
Test-Connection
Bu komut, uzak bir ana bilgisayara bağlantıyı test etmek için ICMP yankı istekleri (pingler) gönderir.
PS C:> Test-Connection -ComputerName stackify.com -Count 4
Get-NetIPConfiguration
Bu komut, bilgisayarınızdaki ağ bağdaştırıcılarının IP yapılandırmasını alır.
PS C:> Get-NetIPConfiguration
Yukarıdaki komut, her bir ağ bağdaştırıcısının IP adresini, alt ağ maskesini ve varsayılan ağ geçidini görüntüler.
Get-NetAdapter
Bu komut, bilgisayarınızdaki ağ bağdaştırıcılarını ve durumlarını listeler.
PS C:> Get-NetAdapter
Komut, adlarını, durumlarını ve bağlantı hızlarını göstererek tüm ağ bağdaştırıcılarını listeler.
Get-NetIPAddress
Bu komut, ağ arabirimleriyle ilişkili IP adreslerini alır.
PS C:> Get-NetIPAddress
Komut, sisteminizdeki tüm ağ bağdaştırıcılarına atanan IP adreslerini gösterir.
New-NetIPAddress
Bu komut, bir ağ bağdaştırıcısına yeni bir IP adresi atar.
PS C:> New-NetIPAddress -InterfaceAlias "Ethernet0" -IPAddress 192.168.2.150 -PrefixLength 24 -DefaultGateway 192.168.2.1
Yukarıdaki komut, Ethernet0 ağ bağdaştırıcısına 255.255.255.0 alt ağ maskesiyle 192.168.2.150 IP adresini atar ve varsayılan ağ geçidini 192.168.2.1 olarak ayarlar.
Set-DnsClientServerAddress
Bu komut, bir ağ arabirimi için DNS sunucusu adreslerini ayarlar.
PS C:> Set-DnsClientServerAddress -InterfaceAlias "Ethernet0" -ServerAddresses "192.168.2.3","8.8.8.8"
Yukarıdaki komut, Ethernet0 ağ bağdaştırıcısı için DNS sunucularını 192.168.2.3 ve 8.8.8.8 olarak yapılandırır.