การทดสอบ PowerShell HashTables
ดังนั้นฉันจึงได้ดูหลักสูตรพื้นฐาน PowerShell Toolmaking ใน Pluralsight ซึ่งเขียนโดย Adam Bertram คุณอาจแปลกใจที่ฉันดูหลักสูตรอื่นๆ ที่เกี่ยวข้องกับ PowerShell แต่ฉันมักจะเลือกสิ่งที่ฉันไม่รู้ ค้นหาเทคนิคการสอนใหม่ๆ หรืออย่างอื่นที่ทำให้ฉันพูดว่า “เยี่ยมมาก” จนถึงตอนนี้ฉันพบสิ่งเหล่านี้บางส่วนในหลักสูตรของอดัม
หนึ่งในเทคนิคที่เขาสาธิตคือการใช้ hashtable เป็นค่าพารามิเตอร์สำหรับฟังก์ชันขั้นสูงที่สามารถระบุเป็น Set-ADuser ได้ เพื่อประโยชน์ของสิ่งที่ฉันต้องการสาธิต นี่คือเวอร์ชันที่เรียบง่ายของฟังก์ชันดังกล่าว
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
}
ฟังก์ชันรับผู้ใช้ที่ระบุแล้วอัปเดตผู้ใช้ด้วยพารามิเตอร์ hashtable จาก Set-ADUser หากคุณรู้ชื่อพารามิเตอร์ทั้งหมดก็ใช้ได้ดี
ฉันอัปเดตบัญชีผู้ใช้ได้อย่างง่ายดาย
แต่ถ้าฉันทำผิดพลาดกับ hashtable ของการตั้งค่าล่ะ?
ไม่มีพารามิเตอร์ที่เรียกว่า FirstName สำหรับ Set-ADUser มันควรจะเป็น GiveName สิ่งหนึ่งที่คุณสามารถทำได้ และนี่คือประเด็นของบทความนี้ คือการตรวจสอบความถูกต้องของคีย์ที่แฮชได้กับชื่อพารามิเตอร์จาก Set-ADuser
คุณสามารถใช้ Get-Command เพื่อแสดงรายการชื่อพารามิเตอร์ทั้งหมด
get-command Set-ADuser | Select -expand Parametersสิ่งที่เราต้องทำคือตรวจสอบให้แน่ใจว่าคีย์ทั้งหมดในการตั้งค่า hashtable อยู่ในรายการนี้ นี่คือการทดสอบอย่างรวดเร็ว
$s = @{Title="T";Description="d"}
$p = get-command set-aduser | select -expand parametersฉันสามารถใช้โค้ดเช่นนี้เพื่อทดสอบว่าคีย์จาก $s อยู่ใน $p ด้วยหรือไม่:
$s.keys | where {$p.keys -contains $_}
แม้ว่าฉันอาจจะสนใจในกรณีที่ไม่ตรงกันมากกว่าก็ตาม
$s.keys | where {$p.keys -notcontains $_}สิ่งนี้จะไม่ให้ผลลัพธ์ใดๆ เนื่องจากไม่มีสิ่งใดที่ตรงกับตัวกรอง แต่ถ้าฉันแก้ไข hashtable ด้วยรายการปลอม มันจะเป็นเช่นนั้น
ด้วยแนวคิดนี้ ฉันสามารถแก้ไขฟังก์ชันได้
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 ",")"
}
}
แน่นอนว่าคุณสามารถเพิ่มโค้ดอื่นเพื่อแสดงรายการพารามิเตอร์ที่มีอยู่ แนะนำการแก้ไข หรืออะไรก็ตาม แต่ตอนนี้ฟังก์ชันจะไม่พยายามทำงานและจัดการกับคีย์ที่ไม่ถูกต้องอย่างสวยงาม
เมื่อแก้ไขแล้ว ฟังก์ชันจะทำงานตามที่คาดไว้
และโปรดอย่าถือเอาสิ่งเหล่านี้เป็นข้อบ่งชี้ว่าอดัมพลาดบางสิ่งบางอย่างในหลักสูตรของเขา ไกลจากมัน. ไม่มีหลักสูตรใดสามารถสอนทุกสิ่งที่คุณจำเป็นต้องรู้เพื่อสร้างเครื่องมือ PowerShell ที่มีประสิทธิภาพได้อย่างแน่นอน คุณต้องสร้างสิ่งที่ใช้ได้ผลสำหรับคุณและเพิ่มการจัดการข้อผิดพลาดที่คุณรู้สึกว่าเหมาะสม ในกรณีนี้ ฉันคิดว่านี่จะมอบโอกาสในการเรียนรู้ที่ดีสำหรับคุณในการเรียนรู้เกี่ยวกับคีย์ที่แฮชได้และโอเปอเรเตอร์บางตัว