如何解决PowerShell脚本检测Azure VM代理状态时的重复输出问题
解决PowerShell脚本重复输出"All VMs are Ready"的问题
需要编写PowerShell脚本列出运行状态(VM running)且Agent状态为Not Ready的Azure虚拟机,原脚本在无符合条件VM时无输出。添加提示逻辑后,出现与VM数量一致的重复输出"All VMs are Ready",需实现仅输出一次该提示。
原脚本
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
错误原因
修改后的脚本将提示逻辑放在foreach循环的else分支中,每遍历到一个Agent状态为Ready的VM就会执行一次输出,导致重复打印提示内容。
修正后的脚本
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 } } # 循环结束后统一判断输出逻辑 if ($output.Count -eq 0) { Write-Host "All VMs are Ready" } else { $output }
关键修改说明
- 移除循环内的
else分支,避免每次遇到Ready状态的VM就触发提示输出 - 循环结束后统一判断:检查
$output数组的元素数量,为空时仅输出一次"All VMs are Ready",否则输出筛选出的VM列表
内容的提问来源于stack exchange,提问作者JonH
相关产品推荐
相关产品推荐

