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

การขยาย 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 มอบความยืดหยุ่นในการตอบสนองความต้องการของฉัน เช่นเคยยินดีรับฟังความคิดเห็นและข้อเสนอแนะ

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