下面是我获取信息的脚本。输出中 OSStatus 和 uptime 为空白。有人能帮我使用“Get-VM | Select-Object -ExpandProperty NetworkAdapters”获取输出并指出我在这里犯了什么错误吗?
$clus = Read-Host 'Enter the Cluster Name'
$Nodes = Get-clusternode -Cluster $clus
foreach($Node in $Nodes)
{
$VMs = Get-VM | Select-Object -ExpandProperty NetworkAdapters | Select VMName, IPAddresses, State
foreach($VM in $VMs)
{
$results = [ordered]@{
'NodeName' = $Node;
'VMName' = $VM.VMName;
'IPaddress' = $VM.IPAddresses[0];
'Status' = $VM.State;
'AdapterStatus' = $VM.Status[0];
'OSStatus' = $VM.OSStatus;
'Uptime' = $VM.Uptime
}
$Output = New-Object -TypeName PSObject -Property $results
Write-Output $Output
}
}
我还想知道我们是否可以从单独的 foreach 循环中获取输出并将其放在一个数组中,并在输出结束时格式化输出。
下面是我得到的输出。OSStatus 和 Uptime 为空白。
NodeName : ABC
VMName : System1
IPaddress : 192.168.1.6
Status : Running
AdapterStatus : Degraded
OSStatus :
Uptime :
NodeName : ABC
VMName : System2
IPaddress : 192.168.1.7
Status : Running
AdapterStatus : Degraded
OSStatus :
Uptime :
NodeName : ABC
VMName : System3
IPaddress : 192.168.1.8
Status : Running
AdapterStatus : Degraded
OSStatus :
Uptime :
答案1
似乎您需要的一些信息在输出中,Get-VM
而当您仅选择 NetworkAdapters 属性时,这些信息就会丢失。这就是我在下面更改它的原因。它现在循环遍历虚拟机并在循环过程中选择 NetworkAdapters 属性。
我也:
- 把所有东西直接放进去
PSCustomObject
,这样就不需要New-Object
或[ordered]
- 将变量放在循环
$results
之前foreach
- 添加
| ft -Autosize
到您的Write-Output
以便它按照您想要的方式格式化(如果您想在脚本中进一步使用脚本的输出,请| ft -autosize
再次删除,这仅出于美观的原因) ClusterObject
在您的中指定Get-VM
- 我不太确定,因为我不使用集群,但我认为您需要指定此信息,否则它只会读取本地虚拟机,而不会从远程集群读取。- 没有 的属性
OSStatus
。我想你的意思是OperationalStatus
。我把它改成了 。
以下是代码
$clus = Read-Host 'Enter the Cluster Name'
$Nodes = Get-clusternode -Cluster $clus
$results = @()
foreach($Node in $Nodes)
{
$VMs = Get-VM -ClusterObject $Node
foreach($VM in $VMs)
{
$VMtmp = $VM | select -expand NetworkAdapters
$results += [PSCustomObject]@{
'NodeName' = $Node;
'VMName' = $VM.VMName;
'IPaddress' = $VMtmp.IPAddresses[0];
'Status' = $VM.State;
'AdapterStatus' = $VMtmp.Status[0];
'OSStatus' = $VM.OperationalStatus[0];
'Uptime' = $VM.Uptime
}
}
}
Write-Output $results | ft -AutoSize