PowerShell HashTable'larını test etme


Bu yüzden Adam Bertram tarafından yazılan Pluralsight'taki PowerShell Takım Yapımının Temelleri kursunu izliyorum. PowerShell ile ilgili diğer kursları izlediğime şaşırabilirsiniz, ancak her zaman bilmediğim bir şeyi öğreniyorum, yeni bir öğretim tekniği buluyorum veya bana "bu harika" dedirten başka bir şey buluyorum. Şu ana kadar Adem'in kursunda bunlardan birkaçını buldum.

Gösterdiği püf noktalarından biri, daha sonra Set-ADuser'e gönderilebilecek gelişmiş bir işlev için parametre değeri olarak bir hash tablosu kullanmaktı. Göstermek istediğim şey adına, burada böyle bir fonksiyonun basitleştirilmiş versiyonu var.

Function Update-MyUser {
[cmdletbinding(SupportsShouldProcess)]
Param(
[Parameter(Position = 0, Mandatory, HelpMessage = "Enter a user name")]
[ValidateNotNullorEmpty()]
[Microsoft.ActiveDirectory.Management.ADUser]$Identity,
[Parameter(Position = 1, Mandatory, HelpMessage = "Enter a hashtable of parameter values for Set-ADUser")]
[ValidateNotNullorEmpty()]
[hashtable]$Settings
)

Write-Verbose "Updating $Identity"

Write-Verbose ($Settings | Out-String)
Try {
$user = Get-ADuser $Identity -ErrorAction stop
Write-Verbose $user.distinguishedname
}
Catch {
Throw $_
}

#splat the settings hashtable to Set-ADuUser

$user| Set-ADUser @settings

}

İşlev, belirtilen kullanıcıyı alır ve ardından kullanıcıyı Set-ADUser'daki parametrelerin karma tablosuyla günceller. Tüm parametre adlarını biliyorsanız bu gayet iyi çalışır.

Kullanıcı hesabını kolayca güncelledim.

Peki ya ayarların karma tablosunda bir hata yaparsam?

Set-ADUser için FirstName adında bir parametre bulunmamaktadır. GivenName olmalıdır. Yapabileceğiniz şeylerden biri ve bu makalenin amacı da budur, hash tablosu anahtarlarını Set-ADuser'deki parametre adlarına göre doğrulamaktır.

Tüm parametre adlarını listelemek için Get-Command'ı kullanabilirsiniz.

get-command Set-ADuser | Select -expand Parameters

Yapmamız gereken, ayarlar karma tablosundaki tüm anahtarların bu listede olduğundan emin olmaktır. İşte hızlı bir test.

$s = @{Title="T";Description="d"}
$p = get-command set-aduser | select -expand parameters

$s'deki anahtarların aynı zamanda $p'de olup olmadığını test etmek için buna benzer bir kod kullanabilirim:

$s.keys | where {$p.keys -contains $_}

Yine de eşleşmedikleri durumlarla daha çok ilgilenebilirim.

$s.keys | where {$p.keys -notcontains $_}

Bu herhangi bir sonuç vermeyecektir çünkü hiçbir şey filtreyle eşleşmez. Ancak karma tablosunu sahte bir girişle değiştirirsem, olur.

Bu kavramı aklımda tutarak fonksiyonu revize edebilirim.

Function Update-MyUser {
[cmdletbinding(SupportsShouldProcess)]
Param(
[Parameter(Position = 0, Mandatory, HelpMessage = "Enter a user name")]
[ValidateNotNullorEmpty()]
[Microsoft.ActiveDirectory.Management.ADUser]$Identity,
[Parameter(Position = 1, Mandatory, HelpMessage = "Enter a hashtable of parameter values for Set-ADUser")]
[ValidateNotNullorEmpty()]
[hashtable]$Settings
)

#get parameters for Set-ADUser
$setparams = Get-Command -Name Set-ADuser | Select -ExpandProperty Parameters
#get keys from Settings that aren't in $SetParams.
$bad = $settings.Keys | where {$setparams.keys -notcontains $_ }

if (-Not $Bad) {

Write-Verbose "Updating $Identity"

Write-Verbose ($Settings | Out-String)
Try {
$user = Get-ADuser $Identity -ErrorAction stop
Write-Verbose $user.distinguishedname
}
Catch {
Throw $_
}

$user| Set-ADUser @settings

}
else {
Write-Warning "The Settings hashtable contains these bad keys: $($bad -join ",")"
}
}

Elbette mevcut parametreleri listelemek, düzeltmeler önermek vb. için başka kod ekleyebilirsiniz. Ancak artık işlev çalıştırmayı denemiyor ve bozuk anahtarları incelikle ele alıyor.

Düzeltildikten sonra işlev beklendiği gibi çalışır.

Ve lütfen bunların hiçbirini Adam'ın kursunda bir şeyleri kaçırdığına dair bir gösterge olarak almayın. Ne münasebet. Hiçbir kurs size etkili PowerShell araçları oluşturmak için bilmeniz gereken her şeyi öğretemez. Sizin için neyin işe yaradığını geliştirmeniz ve uygun olduğunu düşündüğünüz hata yönetimini eklemeniz gerekir. Bu durumda bunun hash tablosu anahtarları ve birkaç operatör hakkında bilgi edinmeniz için güzel bir öğrenme fırsatı sunacağını düşündüm.

İlgili makaleler