获取 Windows 服务器上所有 Hyper-V 虚拟机的特定属性列表

Getting list of specific attributes for all Hyper-V VMs on Windows Server

让我们从右脚开始。我不是在找人为我们编写下面讨论的脚本。我想要的是一个或多个指针,它可以让我快速了解我 需要 的 PowerShell 部分,以便在不先成为 PowerShell 专家的情况下完成此任务,然后使用 Get-VM。也就是说,请继续阅读。

我们正在尝试在计算机网络中的多个 VM 主机上进行虚拟机清点。为此,我们想编写一个脚本来写入包含主机名的 .CSV 文件,以及该主机上定义的每个 VM 的特定属性。所以,例如:


    HostName, VMName, ComputerName, ID,                Maximum memory, Minimum meomry, ...
    VMH1,     VM1,    DATACENTER1,  54324ebe-f167-..., 1099511627776, 536870912, ...

依此类推,对于该主机下的每个 VM...我们将 运行 我们每个主机上的命令将清单放入我们可以为企业视图合并的文件中。

我需要帮助的地方是 PowerShell 脚本。我精通 KornShell 和许多其他脚本语言,但这些年来我一直避免使用 PS。现在风笛手在我家门口。

试图了解如何将这两件事联系在一起: 我可以使用

获取虚拟机列表
Get-VM | ft Name

给定一个 VM,我可以通过

获得我想要的详细信息
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 * 

and/or这个...

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 '*'
}

切勿对所有属性执行 '*',除非那是您真正想要的。始终 select 只提供您所需要的。

要查看第一个VM上的所有属性,就到这里

(Get-VM)[0] | 
Select-Object -Property '*'

要查看所有 VM 的所有属性,只需删除 [0]

您可以轻松地利用 Out-GtidView cmdlet selecting VM 和查看详细信息。

(Get-VM)[0] | 
Select-Object -Property '*' | 
Out-GridView -Title 'Showing Virtual Machines' 

参见:

最后,您还说,您想要一个 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, State, Status, 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    
...
#>