PowerShell PSDefaultParametreDeğerler
PSDefaultParameterValuesis, herhangi bir cmdlet'teki herhangi bir parametrenin varsayılan değerlerinin üzerine kendi istediğimiz varsayılan değerleri yazmamıza olanak tanıyan bir karma tablosudur.
Daha sonra cmdlet, komutta farklı bir değer belirtilmediği sürece özel varsayılan değeri kullanacaktır.
Bu en önemli özellik gibi gelmeyebilir ama inanın bana, bu yazıdan sonra kendinize bu olmadan nasıl çalıştığınızı soracaksınız.
PowerShell PSDefaultParameterValues nasıl kullanılır?
Parametreler
Varsayılanın nasıl ayarlanacağına daha yakından bakalım.
$PSDefaulParameterValues.Add("Command:Parameter","Value")
Gördüğünüz gibi, hash tablosuna : ile ayrılmış, varsayılan olarak ayarlanacak cmdlet'i ve parametreyi belirten yeni bir anahtar ekliyoruz. Değerin parametre tarafından kabul edilen bir türde olması gerektiği açıktır, aksi takdirde cmdlet'i kullanırken hatalar alırsınız.
Somut bir örnek, Yazma Ana Bilgisayarı için özel bir ayırıcı belirtmek olabilir.
# Default
PS> Write-Host "Hello","World"
Hello World
# Adding the custom default
PS> $PSDefaultParameterValues.Add("Write-Host:Separator", "`n")
# Changed output
PS> Write-Host "Hello","World"
Hello
World
Anahtarlar
Anahtar parametreleri için bu hemen hemen aynıdır, yalnızca anahtarın mevcut olmasını isteyip istemediğimizi belirtmek için bir boolean kullanırız $true veya yok $false.
Örneğin, bir komut dosyasındaki tüm Invoke-WebRequest çağrıları için hata ayıklamayı aynı anda etkinleştirmek için bunu kullanabiliriz.
# Default, no verbosity
PS> (Invoke-WebRequest "https://ps1.guru").StatusCode
200
# Adding the custom default
PS> $PSDefaultParameterValues.Add("Invoke-WebRequest:Verbose", $true)
# Changed output, with verbosity
PS> (Invoke-WebRequest "https://ps1.guru").StatusCode
VERBOSE: GET https://ps1.guru/ with 0-byte payload
VERBOSE: received 4801-byte response of content type text/html
200
Joker karakterler
Önceki örnekteki Verbose parametresini koruyarak bunu ayarlamak için joker karakterler kullanabiliriz tüm cmdlet'ler için. Bu, komut dosyalarımda hata ayıklamak için sıklıkla kullandığım harika bir numara.
PS> $PSDefaultParameterValues.Add("*:Verbose", $true)
Gelişmiş Değerler
Statik bir değer yerine bir parametrenin varsayılanı olarak bir kod bloğu kullanmak mümkündür. Bu, bulunduğunuz ana bilgisayar, geçerli dizin ve çok daha fazlası gibi sistem durumuna bağlı olarak olağanüstü düzeyde özelleştirmeye olanak tanır.
Önceki ayrıntı örneğimize sadık kalarak davranışını $verbose değişkenine bağımlı hale getirebiliriz.
PS> $PSDefaultParameterValues.Add("*:Verbose", {$verbose -eq $true})Artık bir değişkeni ayarlayıp kaldırarak oturumumuzun varsayılan ayrıntı düzeyini kontrol edebiliriz. Bu komut dosyası bloğunun cmdlet'i her kullandığınızda çalıştırıldığını unutmayın, bu nedenle hızlı tutun. Bunu şu şekilde ölçebilirsiniz:
PS> Measure-Command {$verbose -eq $true} | ft
Days Hours Minutes Seconds Milliseconds
---- ----- ------- ------- ------------
0 0 0 0 0
Kalıcılık
Şu ana kadar yaptığımız hiçbir şey oturumlar arasında devam etmeyecektir, varsayılanların bunu yapabilmesi için bunları profilinize eklemeniz gerekir. Geçerli oturuma eklediğiniz tüm varsayılanları bulmak için geçmişi bu şekilde sorgulamanız yeterlidir.
Get-History | Where-Object CommandLine -like "`$PSDEfaultParameterValues*"PSDefaultParameterValues'un Gerçek Dünya Örneği
Bunun neden iyi bir şey olduğunu sorabilirsiniz, size kısa bir örnekle göstereyim.
Birisinin Excel'de açması için verileri her zaman CSV dosyalarına aktardığınızı varsayalım. CSV'nize çift tıklarlarsa mükemmel bir sonuç alamazlar.
Şekil 1: Excel'e aktarılan veriler
Çoğumuz daha sonra yeni bir Excel dosyası açar ve verileri Veri > Metinden ile içe aktarır, çok sayıda ekranı tıklayıp Excel'i sınırlayıcıyı gerçekten algılayacak şekilde yapılandırırdık.
Şekil 2: Elle düzenlenen veri aktarımı
Ama daha iyi bir yol var! Yalnızca CSV'yi dışa aktarmak yerine.
Get-Process -Name Microsoft* | Export-Csv msproc.csvözel bir sınırlayıcı belirleyebilir ve bu sırada tür bilgilerini ve clobber'ı kaldırabilirsiniz.
Get-Process -Name Microsoft* | Export-Csv bettermsproc.csv -Delimiter ";"
-NoTypeInformation -NoClobberArtık CSV'yi içe aktarmak, dışa aktarmak, CSV'den dönüştürmek ve CSV'ye dönüştürmek için sınırlayıcı kullanılacaktır; ve herhangi bir tür bilgisi veya clobber içermez.
Ortaya çıkan CSV dosyasını doğrudan excel ile açarsanız, daha önce yaptığımız veri içe aktarma dansına benzer bir sonuç görebilirsiniz.
Şekil 3: PowerShell ile konfigürasyondan sonra veri aktarımı
Ancak bu parametrelerin yazılması her zaman zahmetlidir ve doğası gereği yüksek bir hata payına sahiptir.
Bazı varsayılanları burada ayarlayacağız.
$PSDefaultParams.Add("Export-Csv:Delimiter", ";")
$PSDefaultParams.Add("Export-Csv:NoTypeInformation", $true)
$PSDefaultParams.Add("Export-Csv:NoClobber", $true)Bununla, basitçe Export-Csv'yi kullanmaya geri dönebiliriz ve ortaya çıkan dosya, beklendiği gibi Excel'de açılacaktır.
Hatta bir adım daha ileri giderek joker karakterler kullanarak CSV ailesindeki tüm cmdlet'ler için bu parametreleri değiştirebiliriz.
$PSDefaultParams.Add("*-Csv:Delimiter", ";")
$PSDefaultParams.Add("*-Csv:NoTypeInformation", $true)
$PSDefaultParams.Add("*-Csv:NoClobber", $true)
Komut Dosyalarında PSDefaultParameterValues Kullanımı
Artık $PSDefaulParameterValues hakkında bilgi sahibi olduğunuza göre sizi uyarmak istiyorum; lütfen yapmayın' onları kullanma
senaryolarınızda.
Bunun bazı iyi nedenleri var:
- Diğer kullanıcılar sizin varsayılan değerlerinize sahip olmayabilir ve bu nedenle komut dosyası onlar için bozulabilir
- Varsayılanlarınızı ileride değiştirebilirsiniz ve komut dosyası sizin için bozulacaktır
Bunu azaltmak için tüm komut dosyalarınızda ilk iş olarak PSDefaultParameterValues'u devre dışı bırakmanızı öneririm:
# Disable PSDefaultParameterValues
$PSDefaultParameterValues.Add("Disabled", $true)Ve sonunda onları yeniden etkinleştirmek:
# Re-Enable PSDefaultParameterValues
$PSDefaultParameterValues.Remove("Disabled")



