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 -NoClobber

Artı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")

İlgili makaleler