การขยาย Hyper-V ด้วย PowerShell
เมื่อเร็วๆ นี้ ฉันได้เขียนเกี่ยวกับการใช้ส่วนขยายประเภท PowerShell เพื่อให้ทำงานเสร็จเร็วขึ้น หรืออย่างน้อยก็ให้ข้อมูลที่ฉันต้องการโดยใช้ความพยายามเพียงเล็กน้อย ฉันใช้ Hyper-V เป็นจำนวนมากและ Hyper-V cmdlets นั้นมีค่ามาก และในขณะที่คำสั่งอย่าง Get-VM ให้ข้อมูลมากมาย ดูเหมือนว่าฉันจะต้องการมากกว่านี้อยู่เสมอ ดังนั้นฉันจึงคิดว่าจะแชร์ส่วนขยายประเภทที่เกี่ยวข้องกับ Hyper-V ของฉันกับคุณ แม้ว่าคุณจะไม่จำเป็นต้องใช้หรือใช้ Hyper-V แต่คุณก็อาจพบว่าเทคนิคของฉันมีประโยชน์
ประเภทอ็อบเจ็กต์สำหรับเครื่องเสมือน Hyper-V คือ Microsoft.HyperV.PowerShell.VirtualMachine ซึ่งคุณสามารถรับได้อย่างง่ายดายโดยการรัน Get-VM และไพพ์ไปที่ Get-Member การใช้ Update-TypeData มีคุณสมบัติสคริปต์จำนวนหนึ่งที่ฉันต้องการกำหนด สิ่งเหล่านี้คือคุณสมบัติที่ค่าคำนวณโดยบล็อกสคริปต์ PowerShell ตัวอย่างเช่น ฉันต้องการดูอย่างรวดเร็วว่าเครื่องเสมือนไม่มีไฟล์ดิสก์ที่กำหนดค่าไว้หรือไม่ ฉันสามารถรันคำสั่งเช่นนี้:
แต่ถ้าฉันต้องการข้อมูลนี้บ่อยๆ นั่นก็พิมพ์มากเกินไป ดังนั้นฉันจึงสามารถสร้างคุณสมบัติสคริปต์ด้วยบล็อกสคริปต์นี้ได้ เวอร์ชันนี้คำนึงถึงว่า VM อาจมีดิสก์หลายตัว ซึ่งอย่างน้อยหนึ่งดิสก์อาจหายไป
{
if ($this.HardDrives) {
#test if there are any false results
if ( ($this | Get-VMHardDiskDrive | Test-Path) -contains $False ) {
$False
}
else {
$True
}
}
else {
#no hard drive files configured or found
$false
}
}
ในบันทึกที่เกี่ยวข้อง ฉันต้องการทราบว่าเครื่องเสมือนใช้พื้นที่ดิสก์เท่าใด
{
$stat = Get-VMHardDiskDrive -VMName $this.vmname | Get-Item | Measure-Object -Property length -sum
[math]::Round($stat.sum/1GB,2)
}
ฉันต้องการทราบเส้นทางไปยังไฟล์กำหนดค่าด้วย นี่จะเป็นไฟล์ vmcx ที่มีชื่อไฟล์ตรงกับ ID ของเครื่องเสมือน
Join-path -Path "$($this.configurationLocation)\Virtual Machines" -ChildPath "$($this.vmid).vmcx" -Resolve
เพื่อกำหนดสิ่งเหล่านี้และบางส่วน ฉันใช้โค้ดลักษณะนี้ในสคริปต์โปรไฟล์ PowerShell ของฉัน
ฉันกำหนด hashtable โดยที่คีย์จะเป็นชื่อคุณสมบัติและค่าคือ scriptblock ที่ฉันจะใช้
$extensions = @{
TestVHD = {
if ($this.HardDrives) {
#test if there are any false results
if ( ($this | Get-VMHardDiskDrive | Test-Path) -contains $False ) {
$False
}
else {
$True
}
}
else {
#no hard drive files configured or found
$false
}
}
ConfigurationFile = {
Join-path -Path "$($this.configurationLocation)\Virtual Machines" -ChildPath "$($this.vmid).vmcx" -Resolve
}
Diskpath = {$this.Harddrives.path}
Running = { if ($this.state -eq 'Running') {$True} else { $False}}
SizeGB = {
$stat = Get-VMHardDiskDrive -VMName $this.vmname | Get-Item | Measure-Object -Property length -sum
[math]::Round($stat.sum/1GB,2)
}
}
ต่อไปฉันจะกำหนดพารามิเตอร์แฮชที่ฉันจะระบุด้วย Update-TypeData
$params = @{
TypeName = 'Microsoft.HyperV.PowerShell.VirtualMachine'
MemberType = 'ScriptProperty'
MemberName = ''
Value = ''
Force = $True
}
ขั้นตอนสุดท้ายคือการระบุส่วนขยายและอัปเดตข้อมูลประเภท
$extensions.GetEnumerator() | foreach {
$params.memberName = $_.key
$params.value = $_.value
# Write-Host "Creating script property $($_.key)" -ForegroundColor cyan
Update-Typedata @params
}
การใช้ตารางแฮชช่วยให้โค้ดของฉันจัดระเบียบและอ่านง่ายขึ้น
และตอนนี้ฉันสามารถรันคำสั่งดังนี้:
ฉันชอบที่ PowerShell มอบความยืดหยุ่นในการตอบสนองความต้องการของฉัน เช่นเคยยินดีรับฟังความคิดเห็นและข้อเสนอแนะ