我使用的脚本列出了正在运行且代理状态为“未就绪”的虚拟机。 如果脚本没有任何符合这些条件的虚拟机,它将不会产生任何输出。
这是脚本:
Set-AzContext -Subscription "MySub"
$WarningPreference = 'SilentlyContinue'
$output = @()
$VMs_running = Get-AzVM -status | ?{$_.PowerState -eq 'VM running'}
foreach($VM in $VMs_running)
{
$VM_status = Get-AzVM -ResourceGroupName $VM.ResourceGroupName -Name $VM.Name -Status
$Row = "" | select Name, ResourceGroupName, VMAgent_Status, VMAgent_Version
$Row.Name = $VM_status.Name
$Row.ResourceGroupName = $VM_status.ResourceGroupName
$Row.VMAgent_Status = $VM_status.VMAgent.Statuses.DisplayStatus
$Row.VMAgent_Version = $VM_status.VMAgent.VmAgentVersion
if ($Row.VMAgent_Status -ne "Ready"){
$output += $Row
}
}
$output
我想补充一点,如果输出为空,则打印“All VMs are Ready”。 当我添加它时,我得到重复的输出(与预期存在的虚拟机数量匹配):
foreach($VM in $VMs_running)
{
$VM_status = Get-AzVM -ResourceGroupName $VM.ResourceGroupName -Name $VM.Name -Status
$Row = "" | select Name, ResourceGroupName, VMAgent_Status, VMAgent_Version
$Row.Name = $VM_status.Name
$Row.ResourceGroupName = $VM_status.ResourceGroupName
$Row.VMAgent_Status = $VM_status.VMAgent.Statuses.DisplayStatus
$Row.VMAgent_Version = $VM_status.VMAgent.VmAgentVersion
if ($Row.VMAgent_Status -ne "Ready"){
$output += $Row
}
Else
{
$VMsReady = Write-Host "All VMs are Ready"
$output | Group-Object | Where-Object Count -gt 1 | Select-Object $VMsReady
}
}
$output
输出为:
All VMs are Ready
All VMs are Ready
All VMs are Ready
All VMs are Ready
All VMs are Ready
如何获得一个输出?
else
条件实际上应该在循环之外。首先检查是否有满足条件VMAgent.Statuses.DisplayStatus -ne 'Ready'
的虚拟机,然后循环所有之后,检查是否有$output
:
$output = foreach ($VM in $VMs_running) {
Get-AzVM -ResourceGroupName $VM.ResourceGroupName -Name $VM.Name -Status |
Where-Object { $_.VMAgent.Statuses.DisplayStatus -ne 'Ready' } |
Select-Object @(
'Name'
'ResourceGroupName'
@{ N = 'VMAgent_Status'; E = { $_.VMAgent.Statuses.DisplayStatus } }
@{ N = 'VMAgent_Version'; E = { $_.VMAgent.VmAgentVersion } })
}
if (-not $output) {
Write-Host 'All VMs are Ready'
}
else {
$output
}
可能,通过组合这两个条件可以简单地删除
Get-AzVM
中对 foreach
的后续调用:
Set-AzContext -Subscription 'MySub'
$WarningPreference = 'SilentlyContinue'
$output = Get-AzVM -Status |
Where-Object { $_.PowerState -eq 'VM running' } |
Where-Object { $_.VMAgent.Statuses.DisplayStatus -ne 'Ready' } |
Select-Object @(
'Name'
'ResourceGroupName'
@{ N = 'VMAgent_Status'; E = { $_.VMAgent.Statuses.DisplayStatus } }
@{ N = 'VMAgent_Version'; E = { $_.VMAgent.VmAgentVersion } })
if (-not $output) {
Write-Host 'All VMs are Ready'
}
else {
$output
}