首页 > 解决方案 > Foreach,最后一个条件不需要为它找到的每个虚拟机“确定”

问题描述

我有一个脚本,它应该有 3 个不同的退出代码: OK 0 Warning 1 Critical 2

我希望它只根据条件为每一个写入输出,并且它适用于 1 和 2,因为我想显示 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”。

标签: powershellif-statementpowerclivmware-tools

解决方案


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"
}

推荐阅读