Foreach,最后一个条件不需要为它找到的每个虚拟机 "OK"

Foreach, last condition don't need "OK" for every vm it finds

我有一个脚本应该有 3 个不同的退出代码: 确定 0 警告 1 严重 2

我希望它只根据条件为每个输出写入输出,并且它对 1 和 2 工作正常,因为我想显示虚拟机的名称。我使用数组的原因是因为我可能想显示带有 "Warning" 的 VM 用于其他目的。

我遇到的问题是此脚本将为每个不满足其他条件的虚拟机写入 "OK"。我只需要一个 "OK",如果不满足其他条件,则无需执行任何操作。我需要有关此脚本的整体逻辑的帮助。

$old = @()
$noinstall = @()
$status = 0
$vmtools = Get-VM | select name, @{N = ”ToolsStatus”; E = { $_.Extensiondata.Summary.Guest.ToolsStatus } }

foreach ($vmtool in $vmtools) {
    if (($vmtool.ToolsStatus) -eq 'toolsOld') {
        $arraytest1 = Write-Output "CRITICAL: $($vmtool.Name) ------ $($vmtool.ToolsStatus)"
        $old += , $arraytest1
        $Status = 2
        Write-output $old

    }
    elseif (($vmtool.Toolsstatus) -eq 'toolsNotInstalled' -And $status -ne 2) {
        Write-output "WARNING: $($vmtool.Name) ------ $($vmtool.ToolsStatus)"
        $status = 1
    }
    elseif (($vmtool.Toolsstatus) -eq 'toolsNotInstalled' -And $status -eq 2) {
        $arraytest = Write-output "WARNING: $($vmtool.Name) ------ $($vmtool.ToolsStatus)"
        $noinstall += , $arraytest
    }
    else {
        Write-Output "OK"
    }    
}
exit $status

编辑:我还不如以 elseif ($status -eq 0) 结束,对吗? 它仍然会为每个虚拟机写入 "OK"。

如果您不想每次迭代都输出,则需要在 foreach 循环之外执行整体状态检查。

$status = 0
$vmtools = Get-VM | select name, @{N = ”ToolsStatus”; E = { $_.Extensiondata.Summary.Guest.ToolsStatus } }

foreach ($vmtool in $vmtools) {
    if (($vmtool.ToolsStatus) -eq 'toolsOld') {
        Write-Output "CRITICAL: $($vmtool.Name) ------ $($vmtool.ToolsStatus)"
        $Status = 2
    }
    elseif (($vmtool.Toolsstatus) -eq 'toolsNotInstalled' -And $status -ne 2) {
        Write-output "WARNING: $($vmtool.Name) ------ $($vmtool.ToolsStatus)"
        $status = 1
    }
    elseif (($vmtool.Toolsstatus) -eq 'toolsNotInstalled' -And $status -eq 2) {
        Write-output "WARNING: $($vmtool.Name) ------ $($vmtool.ToolsStatus)"
    } 
}
if ($status -eq 0) {
    Write-Output "OK"
}

或者,您可以收集 foreach 的输出,然后再进行比较。

$vmtools = Get-VM | select name, @{N = ”ToolsStatus”; E = { $_.Extensiondata.Summary.Guest.ToolsStatus } }

$output = foreach ($vmtool in $vmtools) {
    if (($vmtool.ToolsStatus) -eq 'toolsOld') {
        Write-Output "CRITICAL: $($vmtool.Name) ------ $($vmtool.ToolsStatus)"
    }
    elseif (($vmtool.Toolsstatus) -eq 'toolsNotInstalled') {
        Write-output "WARNING: $($vmtool.Name) ------ $($vmtool.ToolsStatus)"
    }
}
if (!$output) {
    Write-Output "OK"
}