如何删除 if 语句 ps 脚本中的重复输出

问题描述 投票:0回答:1

我使用的脚本列出了正在运行且代理状态为“未就绪”的虚拟机。 如果脚本没有任何符合这些条件的虚拟机,它将不会产生任何输出。

这是脚本:

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

如何获得一个输出?

powershell virtual-machine
1个回答
0
投票

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
}
© www.soinside.com 2019 - 2024. All rights reserved.