功能多样的Get-VM PowerShell cmdlet,你知道多少?

日期: 2017-02-05 作者:Nirmal Sharma翻译:王学强 来源:TechTarget中国 英文

Get-VM PowerShell cmdlet能够帮助管理员获取本地或者远程Hyper-V服务器上的虚拟机配置属性。 Hyper-V管理员能够使用Get-VM PowerShell cmdlet查看并调整一系列虚拟机配置信息。微软花费大量精力对PowerShell进行优化,以提升其对本地或者远程服务器的管理功能。现在大多数服务器角色都已经能够使用PowerShell命令进行管理,而微软在加强现有PowerShell cmdlet的同时,也在不断开发全新的cmdlet,尽量缩短使用GUI完成特定操作的时间。

获取Hyper-V服务器列表 在开始了解Get-VM PowerShell cmdle……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

Get-VM PowerShell cmdlet能够帮助管理员获取本地或者远程Hyper-V服务器上的虚拟机配置属性。

Hyper-V管理员能够使用Get-VM PowerShell cmdlet查看并调整一系列虚拟机配置信息。微软花费大量精力对PowerShell进行优化,以提升其对本地或者远程服务器的管理功能。现在大多数服务器角色都已经能够使用PowerShell命令进行管理,而微软在加强现有PowerShell cmdlet的同时,也在不断开发全新的cmdlet,尽量缩短使用GUI完成特定操作的时间。

获取Hyper-V服务器列表

在开始了解Get-VM PowerShell cmdlet之前,我们需要首先获取已经加入到活动目录域中的Hyper-V服务器列表,之后将结果保存在CSV文件中。可以在安装有活动目录PowerShell模块的电脑中执行下面的脚本,

$ResultFile = "C:TempHyperVServers.CSV"

Remove-item $ResultFile -ErrorAction SilentlyContinue

$STR = "Hyper-V Server, Operating System"

Add-Content $ResultFile $STR


$AllHyperVServers = Get-ADObject -Filter 'ObjectClass -eq

"serviceConnectionPoint" -and Name -eq "Microsoft Hyper-V"'-

ErrorAction SilentlyContinue


foreach($Item in $AllHyperVServers)

{      

  $Item.DistinguishedName


  $DN1, $DN2, $DN3 = $Item.DistinguishedName.Split(",")

  $RC1, $RC2 = $DN2.Split("=")  


  $DN1,$DN2 = $Item.DistinguishedName.split(",")

  $ThisItem = Get-ADComputer -Id $RC2 -Properties *


  $HyperVServerNow = $ThisItem.Name

  $HyperVOSVersionNow = $ThisItem.OperatingSystem

  $HyperVServerNow

  $HyperVOSVersionNow

  $STR = $HyperVServerNow+","+$HyperVOSVersionNow

  Add-Content $ResultFile $STR

}          

执行上面的脚本之后,目标文件将会列出Hyper-V服务器名称和操作系统版本,如图A所示,

功能多样的Get-VM PowerShell cmdlet,你知道多少?

图A. Hyper-V服务器名称以及操作系统版本

需要注意的是许多PowerShell cmdlets只适用于特定版本的Hyper-V操作系统,这就是为什么需要在CSV文件中保存操作系统版本。

Get-VM PowerShell cmdlet

除了显示Hyper-V主机的标准虚拟机配置之外,Get-VM PowerShell cmdlet还能够提供许多其他有用信息。如果在本地Hyper-V主机中执行Get-VM命令,将会显示所有运行在该主机上的虚拟机名称;如果想要获取远程Hyper-V主机上的虚拟机信息,只需要使用-ComputerName参数指定远程Hyper-V服务器名称,如下所示:

Get-VM –ComputerName <RemoteHyper-V Server Name>

ForEach 循环

通过执行上面的命令,管理员能够获得单台远程Hyper-V主机上的虚拟机列表,但是如果想要获取多台Hyper-V主机的虚拟机信息呢?为了从多台远程Hyper-V服务器中获取虚拟机及其配置信息,管理员只需要使用下面的ForEach循环:

$ServerFile = “C:TempHyperVServers.CSV”

$CSV = Import-CSV $ServerFile

ForEach ($Item in $CSV)

{

$HyperVServerName = $Item.’Hyper-V Server’

$HyperVOS = $Item.’Operating System’

< Hyper-V PowerShell Command goes here >

}

如上所示,PowerShell脚本将会加载HyperVServers.CSV文件,其中包含了刚刚获取的Hyper-V服务器列表以及操作系统版本,脚本将HyperVServers.CSV文件赋给变量$CSV,之后每台Hyper-V主机名和操作系统版本都将存储在$HyperVServerName和$HyperVOS两个变量中。因此,如果想要对HyperVServers.CSV文件的每台Hyper-V主机都执行Get-VM命令,脚本应该如下所示:

$ServerFile = “C:TempHyperVServers.CSV”

$CSV = Import-CSV $ServerFile

ForEach ($Item in $CSV)

{

$HyperVServerName = $Item.’Hyper-V Server’

$HyperVOS = $Item.’Operating System’

Get-VM –ComputerName $HyperVServerName

}

如果管理员想获取特定Hyper-V操作系统的虚拟机配置信息,那么可以添加一条IF判断语句在执行Get-VM命令之前检查Hyper-V主机操作系统版本,如下面的斜体字所示:

$ServerFile = “C:TempHyperVServers.CSV”

$CSV = Import-CSV $ServerFile

ForEach ($Item in $CSV)

{

$HyperVServerName = $Item.’Hyper-V Server’

$HyperVOS = $Item.’Operating System’

IF ($HyperVOS –eq “Windows Server 2012”)

{

Get-VM –ComputerName $HyperVServerName

}

}

Get-VM属性

如前面所说,Get-VM PowerShell cmdlet还能够提供许多其他属性,帮助管理员获取特定类型的信息。默认情况下,不带任何参数的Get-VM命令只会显示虚拟机名称、虚拟机状态、CPU使用率、为虚拟机分配的内存以及在线时间等信息。如果管理员想要知道Get-VM命令还能够提供哪些其他信息,可以在本地Hyper-V主机上执行Get-VM | Get-Member命令。如图B所示,使用Get-VM命令还可以获取虚拟机创建时间、是否已经启用动态内存技术、虚拟机网卡等其他信息。

功能多样的Get-VM PowerShell cmdlet,你知道多少?

图B. Get-VM能够获取的属性类型

假设管理员想要获取HyperVServers.CSV文件的所有Hyper-V主机上的虚拟机动态内存状态,之后将结果生成一份CSV格式的报告,那么可以使用下面的PowerShell脚本完成这项任务:

$ServerFile = "C:TempHyperVServers.CSV"

$CSV = Import-CSV $ServerFile

$ReportFile = "C:TempHyperVReport.CSV"

$STR = "Hyper-V Server, Command Status, VM Name, Dynamic Memory Status"

Add-Content $ReportFile $STR

ForEach ($Item in $CSV)

{

$HypervServerName = $Item.'Hyper-V Server'

$HyperVOS = $Item.'Operating System'


$ComStatus = "Ok"

$Error.Clear()

$RVM = Get-VM -ComputerName $HypervServerName | select-Object Name, DynamicMemoryEnabled

IF ($Error.Count -eq 0)

{

### START - Command Goes Here ####

  ForEach ($ItemVM in $RVM)

  {

  $VMName = $ItemVM.Name

  $DMStatus = $ItemVM.DynamicMemoryEnabled


  $STR = $HypervServerName+",OK,"+$VMName+","+$DMStatus

  }

### END - Command Goes Here ####

}

else

{

  $ErrorNow = $Error[0].Exception.Message

  $ComStatus = "Error Executing Command: Error: "+$ErrorNow

  $STR = $HypervServerName+","+$ComStatus

  Add-Content $ReportFile $STR


}

}

执行上面的脚本之后,将会生成一份如图C所示的报告C:TempHyperVReport.CSV,其中包含所有虚拟机是否已经启用动态内存技术的信息。

功能多样的Get-VM PowerShell cmdlet,你知道多少?

图C. Hyper-V服务器的虚拟机动态内存状态信息

如果管理员想要从一台或者多台Hyper-V服务器中获取其他虚拟机配置信息,可以从属性开始选择,之后将其插入到上面的脚本当中。管理员还可以对### START - Command Goes Here ####部分当中的命令进行一些调整。

作者

Nirmal Sharma
Nirmal Sharma

TechTarget投稿作者

翻译

王学强
王学强

TechTarget特邀编辑,毕业于计算机专业,现任职于外企IT分析师,负责网络、防火墙和服务器等系统运维工作,对虚拟化、网络安全和渗透测试拥有浓厚兴趣,工作外热爱旅行、汽车和健身。

相关推荐