Foreach, последнее условие не нуждается в "OK" для каждого найденного виртуального файла - PullRequest
0 голосов
/ 12 марта 2020

У меня есть сценарий, который должен иметь 3 разных кода выхода: ОК 0 Предупреждение 1 Критический 2

Я хочу, чтобы он записывал выходные данные только для каждого из них в зависимости от условий, и он отлично работает для 1 и 2, так как я хочу отобразить имя виртуальной машины. Причина, по которой я использую массив, заключается в том, что я могу отображать виртуальные машины с «предупреждением» для других целей.

Проблема, с которой я столкнулся, заключается в том, что этот скрипт будет писать «ОК» для каждого виртуального компьютера, который не соответствует другие критерии. Мне просто нужно одно «ОК», что ничего не нужно делать, если нет других критериев. Мне нужна помощь с общей логикой c этого скрипта.

$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» для каждого vm.

1 Ответ

0 голосов
/ 12 марта 2020

Вам необходимо выполнить общую проверку состояния за пределами foreach l oop, если вы не хотите выводить данные для каждой итерации.

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