powershell - 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”。
解决方案
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"
}
推荐阅读
- css - 如何防止我的网站中出现这种负面空白?
- spring - 使用 Spring JPA 规范和分页的不同列选择给出 InvalidDataAccessApiUsageException
- r - 如何为 Shiny 应用的不同用户创建不同的仪表板?(在相同的应用程序代码上)
- python - 如何使用正则表达式在字符串之间提取一个数字
- java - 如何修复此代码?将字符串从方法传递到 MainActivity
- flutter - 颤振范围模型不更新所有后代“
- html - 如何从同一行更改元素的位置
- c++ - 包含库时无法在 VS Code 中使用 GDB 调试 C++ 文件
- python - 在 MicroPython 中检查线程是否已启动
- python - 安装 line-in 包时出错:NodeJS