PowerShell WhatIf Parametresi: Sıçramadan Önce Bakmak
"Senaryolarımı her zaman test etmiyorum ama test ettiğimde bunu üretimde yapıyorum "
Yalan söyleme. Bunu daha önce de yapmıştın. Hepimizin bir noktada var. PowerShell betiklerini üretimde çalıştırırken riskli olmak zorunda değildir. Yerleşik PowerShell WhatIf parametresini kullanmayı unutmayın!
PowerShell komutunun ortamınızda değişiklik yapmadan önce ne yapacağını bilmek güzel olmaz mıydı? Komutunuza şu soruyu sorabildiğinizi hayal edin: “Kaçacak olsaydın ne yapardın?” WhatIf parametresini kullanabilirsiniz.
Derlenen tüm PowerShell cmdlet'leri WhatIf adlı bir parametre içerir. Bu parametre, bir komutun beklediğiniz gibi çalışıp çalışmayacağını veya nükleer bir erime başlatıp başlatmayacağını değerlendirmenize yardımcı olur.
Kullanışlı WhatIf parametresi yalnızca tüm yerleşik cmdlet'lerde değil, aynı zamanda komut dosyalarınızda ve gelişmiş işlevlerinizde de mevcuttur! Kodunuz ortamınızdaki bazı şeyleri değiştirecekse, uygulamayı seçmeniz durumunda arızaya karşı korumalı bir mekanizmanın avantajına sahip olursunuz.
Önkoşullar
Bu makale bir yol gösterici olacak. Bu yolculuk sırasında takip etmek istiyorsanız, birkaç şeye sahip olmalısınız.
- Powershell v5.1'i çalıştırabilen bir Windows bilgisayarı. (Windows 10 ve üzeri önerilir)
- Notepad++, Windows PowerShell ISE veya Visual Studio Code gibi bir komut dosyası düzenleyicisi.
Bu makalede, Windows 10 makinede Visual Studio Code 1.38 (Ağustos 2019) kullanacağımı unutmayın.
WhatIf PowerShell Parametresi: Tanımlanmış
Özetle, WhatIf parametresi, tüm gelişmiş işlevler ve cmdlet'lerle kullanılabilen yerleşik bir anahtar parametresidir (komut dosyalarına ve işlevlere PowerShell CmdletBinding anahtar sözcüğü eklenerek). Komut kullanıldığında, komutun beklenen etkisini konsola bildirir. Ancak gerçekte komutu yürütmez.
Tüm cmdlet'ler ve gelişmiş işlevlerde WhatIf parametresi mevcuttur. Bu makalede, Get-Service, Stop-Service ve New-Item cmdlet'lerini kullanarak bu parametreyi göstereceğiz.
Powershell WhatIf Desteğini Kontrol Etme
Belirli bir komutun WhatIf'ı destekleyip desteklemediğinden emin değilseniz kontrol etmenin iki hızlı yolu vardır.
Get-Command'ı kullanma
Aşağıda gösterildiği gibi Syntax parametresini kullanarak komut meta verilerini görüntülemek için Get-Command komutunu kullanabilirsiniz. -WhatIf referansını görüyorsanız, WhatIf desteklenmektedir.
Sekme Tamamlamayı Kullanma
Ayrıca sekme tamamlamayı kullanarak WhatIf parametre desteğini de kontrol edebilirsiniz. Kontrol etmek istediğiniz komutu bir PowerShell konsoluna ve ardından boşluk, kısa çizgi, 'Wh' ve sekme tuşunu yazmanız yeterlidir.
WhatIf görünürse, o komutun WhatIf parametresine sahip olduğunu bilirsiniz.
PowerShell WhatIf Parametresini Cmdlet'lerle Kullanma
WhatIf parametresinden yararlanmanın birçok farklı yolu vardır. Bu bölümde yerleşik cmdlet'leri kullanarak WhatIf parametresini hemen kullanmaya nasıl başlayabileceğinizi öğreneceksiniz.
Dosya Oluşturma
Tüm cmdlet'ler gibi, New-Item cmdlet'i de bir WhatIf parametresine sahiptir. Bu örnekte, aynı çalışma dizininde newfile1.txt adlı bir dosya oluşturmak için Yeni Öğe cmdlet'ini kullanacaksınız.
Aşağıdaki komutu çalıştırırsanız, newfile.txt adlı dosyayı oluşturur.
Peki ya bu komut, başarısız bir şekilde oluşturulduğu takdirde soruna neden olabilecek bir dosya oluşturursa? Sorun değil. Sonuna WhatIf parametresini ekleyebilirsiniz.
Bir Hizmeti Durdurmak
WhatIf parametresini Stop-Service cmdlet'iyle de kullanabilirsiniz. Bu örnekte, ilk beş hizmetin bir listesini alıyorsunuz ve bunları Hizmeti Durdur komutuyla durduruyorsunuz. Ama sen değilsin.
Bunun yerine, PowerShell konsoluna gönderilen ve Stop-Service cmdlet'inin hangi hizmetleri durduracağını bildiren çıktı mesajını görüyorsunuz.
Powershell WhatIf Davranışını Küresel Olarak Değiştirme
Bu noktada WhatIf parametresini bir cmdlet veya gelişmiş fonksiyonla kullanmanın sadece işlemi simüle ettiğini bilmelisiniz. Komut düzeyinde WhatIf davranışını etkiliyordunuz.
WhatIf davranışı, otomatik değişken $WhatIfPreference değiştirilerek tüm komutları etkileyecek daha yüksek bir düzeye de ayarlanabilir.
$WhatIfPreference değişkeni booleandır. Yalnızca Doğru veya Yanlış olabilir. Varsayılan olarak False olarak ayarlanmıştır, bu da komut düzeyinde geçersiz kılınmadığı sürece tüm komutlarda WhatIf desteğinin devre dışı bırakıldığı anlamına gelir. True olarak ayarlanırsa, WhatIf parametresinin açıkça kullanılıp kullanılmadığına bakılmaksızın, onu destekleyen tüm komutlar “WhatIf içinde olacaktır. kod> mod.”
Bunu, $WhatIfPreference değerini True olarak değiştirerek $WhatIfPreference=$true olarak değiştirerek test edebilirsiniz. Aşağıda New-Item olmadan kullanıldığında, WhatIf parametresi artık parametre iletilmiş gibi davrandığını görebilirsiniz.
$WhatIfPreference'ıTrueolarak değiştirdiyseniz,$WhatIfPreference aracılığıyla tekrar.Falseolarak değiştirmeyi unutmayın.=$yanlış
Bu bölümde WhatIf desteğini mevcut cmdlet'lerle nasıl kullanacağınızı öğrendiniz. Bir sonraki eylemde, özel komut dosyalarınızda ve işlevlerinizde WhatIf desteğini nasıl oluşturacağınızı öğreneceksiniz.
İşlevlerde Powershell WhatIf Desteğinin Uygulanması
Komut dosyalarınızda WhatIf desteğini uygulamaya çalışmadan önce, bunu yapmanın bir yanlış bir de doğru yolu olduğunu bilmeniz çok önemlidir. Sonraki bölümlerde bunların ne olduğunu göreceksiniz.
Yanlış Yapmak: Tekerleği Yeniden İcat Etmeyin
Komut dosyası geliştiricilerinin tekerleği yeniden icat etmesi ve kendi WhatIf desteğini bazı if/then mantığıyla uygulaması alışılmadık bir durum değildir. Aşağıda bir örnek görebilirsiniz.
Geliştiricinin kendi WhatIf anahtar parametresini tanımladığına dikkat edin. Daha sonra, bu parametrenin değerini kullanarak, WhatIf parametresi kullanılıp kullanılmadığında mantığı işlemek için bir if/then yapısını kullandılar.
Function Remove-LogFile {
param (
[Parameter(Mandatory)]
[string]$name,
[switch]$WhatIf
)
if ($WhatIf.IsPresent) { # WhatIf switch is on.
Write-Host "WhatIf: I will remove the log file ""$name""" -ForegroundColor Yellow
} else {
# WhatIf switch is off.
Write-Host "Delete log file ""$name""" -ForegroundColor Green
}
}Yukarıdaki fonksiyon aşağıda gösterildiği gibi WhatIf parametresi kullanılarak çalıştırıldığında işini yapmış gibi görünür. İşlev aslında hiçbir şeyi kaldırmadı ve konsola bir mesaj döndürmedi.
Eğer işe yarıyorsa, bu yöntemin nesi yanlış? Çünkü gelişmiş bir işlevin yerleşik yeteneklerini ihmal ediyorsunuz. Yalnızca komutun kapatıldığında ne yapacağına odaklanmak yerine, bu işlevselliği oluşturduğunuz her işleve dahil etmeniz gerekecektir.
Bunun yerine, tekerleği yeniden icat etmeyin ve SupportsShouldProcess anahtar kelimesini $PSCmdlet.ShouldProcess() ile birlikte kullanın. . Bu yaklaşıyor.
Doğru Yapmak: SupportsShouldProcess'i Kullanmak
[CmdletBinding()] anahtar sözcüğünü kullanan tüm işlevler onları "gelişmiş" yapar. Bu anahtar kelime, işleve WhatIf desteği de dahil olmak üzere çeşitli yetenekler ekler.
Tüm gelişmiş işlevler WhatIf işlevini destekler, ancak bundan yararlanmak size kalmıştır. Bunu yapmak için, aşağıda gösterildiği gibi ilk önce [CmdletBinding()] parantezleri arasında SupportsShouldProcess anahtar kelimesini kullanmanız gerekir.
[CmdletBinding(SupportsShouldProcess)] İşlev artık WhatIf parametresinin işleve aktarılıp aktarılmadığını belirlemek için $PSCmdlet işlev değişkeninde ShouldProcess() yöntemini çağırmanıza olanak tanıyor ya da değil. WhatIf parametresi kullanıldığında, ShouldProcess(), False değerini döndürür. Aksi halde her zaman True değerini döndürür.
Function Remove-LogFile {
[cmdletbinding(SupportsShouldProcess)]
param (
[Parameter(Mandatory)]
[string]$name
)
if ($PSCmdlet.ShouldProcess($name)) {
## The -WhatIf parameter was NOT used. The function should process as normal.
Write-Host ("Delete log file " + $name) -ForegroundColor Green
} else {
## The -WhatIf parameter was used. The function should NOT process.
}
}- True
YANLIŞ
- False
Doğru
Artık Remove-LogFile, WhatIf parametresiyle çalıştırıldığında aşağıdakileri görebilirsiniz; yerleşik cmdlet'lerle aynı davranışı görüntüler.
Özet
Bu makalede PowerShell WhatIf parametresini öğrendiniz. Artık nasıl çalıştığını ve ne gibi faydalar sağlayabileceğini anlamalısınız.
Ayrıca, bir dahaki sefere PowerShell işlevleriniz için arıza güvenliğine ihtiyaç duyduğunuzda tekerleği yeniden icat etmemeniz gerektiğini de bilmelisiniz. Bunun yerine mevcut PowerShell WhatIf desteğinden yararlanın!
Daha Fazla Okuma
- PowerShell Modülleriyle Daha İyi Komut Dosyaları Nasıl Yazılır
- İşlevler Hakkında CmdletBindingAttribute #SupportsShouldProcess
- Tercih Değişkenleri Hakkında