如何解决获取 Windows Server 上所有 Hyper-V VM 的特定属性列表
让我们从右脚开始。我不是在找人来为我们编写下面讨论的脚本。我想要的是一个或多个指针,它可以让我快速了解我需要的 PowerShell 部分,以便完成此任务,而无需先成为 PowerShell 专家,然后再使用获取-VM。也就是说,请继续阅读。
我们正在尝试在计算机网络中的多个 VM 主机上进行虚拟机清单。为此,我们想编写一个脚本来编写一个包含主机名的 .CSV 文件,以及该主机上定义的每个 VM 的特定属性。因此,例如:
HostName,VMName,ComputerName,ID,Maximum memory,Minimum meomry,...
VMH1,VM1,DATACENTER1,54324ebe-f167-...,1099511627776,536870912,...
依此类推,对于该主机下的每个虚拟机......我们将在我们的每个主机上运行该命令以将清单放入我们可以合并以用于企业视图的文件中。
我需要帮助的地方是 PowerShell 脚本。我对 KornShell 和许多其他脚本语言非常熟练,但这些年来我一直避免使用 PS。现在吹笛人在我家门口。
试图了解如何将这两件事联系在一起: 我可以通过
获取虚拟机列表Get-VM | ft Name
给定一个虚拟机,我可以获得我想要的详细信息
Get-VM <vmname> |
Select-Object Name,etc...
我相信我需要将命令通过管道传输到命令中,但这对我不起作用。然后一旦完成,需要操作输出,使 %COmpuTERNAME% 位于输出的前面,所以简单的 Export-Csv 对我们也不起作用。
同样,我不希望这是一个“这是我的家庭作业 - 帮我做”的条目;只是在寻找指针。
感谢您抽出宝贵时间。
解决方法
您所追求的所有内容都在该 cmdlet 的 PowerShell 帮助文件中的示例中。
# Get specifics for a module,cmdlet,or function
(Get-Command -Name Get-VM).Parameters
(Get-Command -Name Get-VM).Parameters.Keys
Get-help -Name Get-VM -Examples
# Results
<#
Get-VM -ComputerName Server1 |
Where-Object {$_.State -eq 'Running'}
Get-ClusterGroup |
Where {$PSItem.GroupType -eq 'VirtualMachine' } |
Get-VM
#>
Get-help -Name Get-VM -Full
Get-help -Name Get-VM -Online
至于你在评论区的代码,这个...
Get-VM |
ForEach-Object Get-VM |
Select-Object *
和/或这个...
Get-VM |
ft Name|
ForEach-Object Get-VM |
Select-Object *
...两者在语法上都是错误的。如果您使用 PowerShell_ISE 或 VSCode 编辑器,它们会立即将这些标记为错误。如果您倾向于呆在控制台主机中,请使用 Invoke-ScriptAnalyzer
cmdlet 检查您的代码并使用 Trace-Command
查看它正在执行的所有操作。详情请参阅帮助文件。
(Get-Command -Name Invoke-ScriptAnalyzer).Parameters
(Get-Command -Name Invoke-ScriptAnalyzer).Parameters.Keys
Get-help -Name Invoke-ScriptAnalyzer -Examples
Get-help -Name Invoke-ScriptAnalyzer -Full
Get-help -Name Invoke-ScriptAnalyzer -Online
(Get-Command -Name Trace-Command).Parameters
(Get-Command -Name Trace-Command).Parameters.Keys
Get-help -Name Trace-Command -Examples
Get-help -Name Trace-Command -Full
Get-help -Name Trace-Command -Online
应该是这样
Get-VM |
ForEach-Object {
$PSItem |
Select-Object -Property '*'
}
永远不要对所有属性执行 '*'
,除非这是您真正想要的。始终只选择您需要的。
要查看第一个虚拟机的所有属性,就到这里
(Get-VM)[0] |
Select-Object -Property '*'
要查看所有 VM 的所有属性,只需删除 [0]
。
您可以轻松利用 Out-GtidView
cmdlet 来选择 VM 和查看详细信息。
(Get-VM)[0] |
Select-Object -Property '*' |
Out-GridView -Title 'Showing Virtual Machines'
见:
- https://mcpmag.com/articles/2016/02/17/creating-a-gui-using-out-gridview.aspx
- https://spiderzebra.com/2020/05/26/utilizing-powershell-out-gridview-as-a-gui-alternative
- https://mikefrobbins.com/2014/09/11/creating-a-simplistic-gui-interface-with-out-gridview
最后,您还说,您需要一个 VMHost 列表,然后尝试从这些主机上获取 VM 来宾。这不是 Get-VM 的用途。
如果您的 VMHost 是 Windows 服务器,并加入您的域,您将使用 Get-ADComputer
获取 VMHost 名称列表(无论您如何命名),然后将其传递给 Get-VM 以获取来宾.
示例:
Get-ADComputer -Identity 'VMHost*' |
ForEach-Object {Get-VM -ComputerName $PSitem}
如果它们不是 Windows 机器,请使用您选择的方法获取该主机名,然后将其传递给 Get-VM
。
在我的本地 Hyper-V 机器上执行此操作
$env:COMPUTERNAME,'Localhost' |
ForEach {
Get-VM -ComputerName $PSItem |
Select-Object -Property Name,State,Status,Version
}
# Results
<#
Name State Status Version
---- ----- ------ -------
WS2K16 Off Operating normally 9.0
...
#>
$env:COMPUTERNAME,'Localhost' |
ForEach-Object {
$VMHostName = $PSItem
Get-VM -ComputerName $VMHostName |
Select-Object -Property @{
Name = 'VMHost'
Expression = {$VMHostName }
},Name,Version |
Export-Csv -Path 'D:\Temp\VMGuestReport.Csv' -Append
}
Import-Csv -Path 'D:\Temp\VMGuestReport.Csv' |
Format-Table -AutoSize
# Results
<#
VMHost Name State Status Version
------ ---- ----- ------ -------
SRV1 WS2K16 Off Operating normally 9.0
...
Localhost WS2K16 Off Operating normally 9.0
...
#>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。