[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[转载教程] 使用PowerShell管理微软Hyper-V

许多管理员喜欢使用PowerShell来自动执行用户创建和文件夹权限管理这类组件功能,但是,虚拟化技术也可以通过命令行管理,包括微软Hyper-V。

虽然有多种方法可以用PowerShell来管理Hyper-V,但本文将重点介绍如何免费使用Windows管理规范(WMI)脚本(来自CodePlex的开源工具)的方法。

在使用WMI脚本来管理Hyper-V之前,了解哪些类可用很重要。微软列出了大量的类。虽然相当完整,但他们不一定易于使用,并且总是不直观。因此,使用WMI来管理Hyper-V不适合心理承受能力弱的人。

使用PowerShell管理Hyper-V的比较流行方法之一是使用针对Hyper-V(PSHyperV)的PowerShell管理库。这是由James O’Neil所写的免费且开源的CodePlex项目。这是迄今为止最好的选择。它提供一个完整cmdlet集给管理员使用,可以处理从虚拟机存储管理到网络管理的所有事情。让我们来了解其中的一些:

Get-VM——返回一个Hyper-V服务器上所有的虚拟机。

下面的代码展示了Get-VM命令:
  1. Function Get-VM
  2. {# .ExternalHelp MAML-VM.XML
  3.    param(
  4.        [parameter(ValueFromPipeLine = $true)]
  5. [ValidateNotNullOrEmpty()][Alias("VMName")]
  6.        $Name = "%",
  7.        [parameter()][ValidateNotNullOrEmpty()]
  8.        $Server = ".", #May need to look for VM(s) on Multiple servers
  9.        [Switch]$Suspended,
  10.        [switch]$Running,
  11.        [switch]$Stopped
  12.    )
  13.    Process {
  14.        # In case people are used to the * as a wildcard...
  15.        if ($Name.count -gt 1 ) {[Void]$PSBoundParameters.Remove("Name")
  16. ; $Name | ForEach-object {Get-VM -Name $_ @PSBoundParameters}}
  17.        if ($name -is [String]) {
  18.           $Name = $Name.Replace("*","%")
  19.           # Note in V1 the test was for caption like "Virtual%" which
  20. did not work in languages other than English.
  21.           # Thanks to Ronald Beekelaar - we now test for a processID ,
  22. the host has a null process ID, stopped VMs have an ID of 0.
  23.           $WQL = "SELECT * FROM MSVM_ComputerSystem WHERE ElementName
  24. LIKE '$Name' AND ProcessID >= 0"
  25.           if ($Running -or $Stopped -or $Suspended) {
  26.             $state = ""
  27.              if ($Running) {$State += " or enabledState = " +
  28. [int][VMState]::Running }
  29.              if ($Stopped) {$State += " or enabledState = " +
  30. [int][VMState]::Stopped }
  31.              if ($Suspended) {$State += " or enabledState = " +
  32. [int][VMState]::Suspended }
  33.              $state = $state.substring(4)
  34.              $WQL += " AND ($state)"
  35.           }
  36.           Get-WmiObject -computername $Server -NameSpace $HyperVNamespace -Query $WQL | Add-Member -MemberType ALIASPROPERTY -Name "VMElementName" -Value "ElementName" -PassThru
  37.        }
  38.        elseif ($name.__class) {
  39.           Switch ($name.__class) {
  40.              "Msvm_ComputerSystem"      {$Name}
  41.              "Msvm_VirtualSystemSettingData"      {get-wmiobject -
  42. computername $Name.__SERVER -namespace $HyperVNamespace -Query
  43. "associators of {$($name.__path)} where
  44. resultclass=Msvm_ComputerSystem"}
  45.              Default       get-wmiobject -
  46. computername $Name.__SERVER -namespace $HyperVNamespace -Query
  47. "associators of {$($Name.__path)} where
  48. resultclass=Msvm_VirtualSystemSettingData" |
  49.                                             ForEach-Object
  50. {$_.getRelated("Msvm_ComputerSystem")} | Select-object -unique }
  51.           }
  52.        }
  53.     }
  54. }
复制代码
如您所见,这段代码包含了WMI基本类和helper逻辑并报告了结果。

Get-VMSwitch——返回所有在Hyper-V服务器上的虚拟交换。

下面的代码展示了Get-VMSwitch的命令:
  1. Function Get-VMSwitch
  2. {# .ExternalHelp MAML-VMNetwork.XML
  3.    param(
  4.        [parameter(ValueFromPipeline = $true)][Alias("Name")]
  5.        [String]$VirtualSwitchName="%",
  6.        [parameter()][ValidateNotNullOrEmpty()]
  7.        $Server = "." #Can query multiple servers for switches
  8.        )
  9.    process {
  10.        $VirtualSwitchName=$VirtualSwitchName.replace("*","%")
  11.        Get-WmiObject -computerName $server -NameSpace $HyperVNamespace
  12. -query "Select * From MsVM_VirtualSwitch Where elementname like '$VirtualSwitchname' "
  13.    }
  14. }
复制代码
Get-VMSnapShot——提供所有在Hyper-V服务器上的快照。

下面的语句展示了Get-VMSnapShot命令:
  1. Function Get-VMSnapshot
  2. {# .ExternalHelp MAML-VMSnapshot.XML
  3.    Param(
  4.        [parameter(Position=0 , ValueFromPipeline = $true)]
  5.        $VM = "%",
  6.        [String]$Name="%",
  7.        [parameter()][ValidateNotNullOrEmpty()]
  8.        $Server="." ,
  9.        [Switch]$Current,
  10.        [Switch]$Newest,
  11.        [Switch]$Root
  12.    )
  13.    process{
  14.           if ($VM -is [String]) {$VM=(Get-VM -Name $VM -Server $server) }
  15.           if ($VM.count -gt 1 ) {[Void]$PSBoundParameters.Remove("VM") ; $VM |
  16. ForEach-object { Get-VMSnapshot -VM $_ @PSBoundParameters}}
  17.           if ($vm.__CLASS -eq 'Msvm_ComputerSystem') {
  18.              if ($current) {Get-wmiobject -computerNam $vm.__server -
  19. Namespace $HyperVNamespace -q "associators of {$($vm.path)} where assocClass=MSvm_PreviousSettingData"}
  20.              else {$Snaps=Get-WmiObject -computerName $vm.__server -NameSpace $HyperVNameSpace -Query "Select * From MsVM_VirtualSystemSettingData Where systemName='$($VM.name)' and
  21. instanceID <> 'Microsoft:$($VM.name)' and elementName like '$name' "
  22.                 if ($newest) {$Snaps | sort-object -property
  23. creationTime | select-object -last 1 }
  24.                 elseif ($root) {$snaps | where-object {$_.parent -eq
  25.                 $null} }
  26.                 else {$snaps}
  27.           }
  28.        }
  29.     }
  30. }
复制代码
可以从CodePlex的网站上找到PSHyperV的多种附加功能来帮助管理员执行查找、操作和配置hypervisor的不同的组件等相关任务。

编写WMI包装器和使用PSHyperV,只是管理员用PowerShell来管理Hyper-V的一些方式。请注意,PSHyperV的最新版本并不是完整的版本,因此,它不像其他软件那么稳定。

返回列表