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"
}
我有一个脚本应该有 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"
}