ค้นหาเว็บไซต์

การทดสอบ 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 ที่มีประสิทธิภาพได้อย่างแน่นอน คุณต้องสร้างสิ่งที่ใช้ได้ผลสำหรับคุณและเพิ่มการจัดการข้อผิดพลาดที่คุณรู้สึกว่าเหมาะสม ในกรณีนี้ ฉันคิดว่านี่จะมอบโอกาสในการเรียนรู้ที่ดีสำหรับคุณในการเรียนรู้เกี่ยวกับคีย์ที่แฮชได้และโอเปอเรเตอร์บางตัว

บทความที่เกี่ยวข้อง