PowerShell 测试连接到多个 IP 并对结果执行 xyz
PowerShell Test-Connection to multiple IPs and do xyz on Results
我目前正在编写一行代码来对多个 IP 进行 ping 测试,并让它 return 进行一次状态更新。我试图拥有它所以如果所有结果都是 $true
然后显示绿色,如果结果包含 $false
但还有一个 $true
然后显示黄色最后如果所有结果都是 $false
然后显示红色。
下面是我得到的。这是我尝试过的一种迭代,但我只能让它响应黄色而不是红色。非常感谢任何帮助。
$octets = (Get-NetIPAddress | ?{$_.PrefixOrigin -eq "Manual","Dhcp"}).IPAddress.Split(".")
$ipFirst3 = $octets[0] + "." + $octets[1] + "." + $octets[2]
$ESX1MGT = $ipFirst3 + '.' + "181" #esxi management
$ESX1STG = $ipFirst3 + '.' + "151" #esxi storage
$ESX1VMO = $ipFirst3 + '.' + "71" #esxi vmotion
If(Test-Connection $ESX1MGT -count 2 -Quiet){
$MGTStatus = "True"
}else{
$MGTStatus = "False"
}
If(Test-Connection $ESX1STG -count 2 -Quiet){
$STGStatus = "True"
}else{
$STGStatus = "False"
}
If(Test-Connection $ESX1VMO -count 2 -Quiet){
$VMOStatus = "True"
}else{
$VMOStatus = "False"
}
$ESX1Status = @($MGTStatus,$STGStatus,$VMOStatus)
If($ESX1Status -eq "True"){
$ESX1StatusLabel.BackColor = "Green"
}elseif ($ESX1Status -contains "False") {
$ESX1StatusLabel.BackColor = "Yellow"
}elseif ($ESX1Status -eq "False") {
$ESX1StatusLabel.BackColor = "Red"
}
编辑这是我试过的另一个想法
$ESX1Status = @($ESX1MGT,$ESX1STG,$ESX1VMO)
$result = Foreach($ESX in $ESX1Status){
Test-Connection $ESX -Count 2 -Quiet
}
If($result -is $true){
$ESX1StatusLabel.BackColor = "Green"
}
If($result -contains $false -and $true){
$ESX1StatusLabel.BackColor = "Yellow"
}
If($result -is $false){
$ESX1StatusLabel.BackColor = "Red"
}
当 运行 两个版本时,我有时会遇到此错误
Cannot convert value "True" to type "System.Type". Error: "Invalid cast from 'System.Boolean' to 'System.Type'."
At C:\Source\Scripts\PowerShell\Verification.ps1:420 char:4
+ If($result -is $true){
+ ~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], RuntimeException
+ FullyQualifiedErrorId : RuntimeException
这对我来说非常完美。
答案来自 Reddit 上的 post 我也在 r/PowerShell 来自 u/engageant
“有一种简单的方法可以简化这一切:
$mgmt = Test-Connection $ESX1MGT -Count 2 -Quiet
$storage = Test-Connection $ESX1STG -Count 2 -Quiet
$vmotion = Test-Connection $ESX1VMO -Count 2 -Quiet
$status = $mgmt + $storage + $vmotion
switch ($status) {
3 {ESX1StatusLabel.BackColor = "Green"}
2 {ESX1StatusLabel.BackColor = "Yellow"}
1 {ESX1StatusLabel.BackColor = "Yellow"}
0 {ESX1StatusLabel.BackColor = "Red"}
}
这里发生的是我们将每个测试的结果放入其自己的变量中,然后对变量求和(记住 0 = false,1 = true)。然后我们评估总和并采取相应行动。还可以在此处进行其他调整以可能增加 readability/scalability,但为了解释“如何”,我特意明确了。”
我目前正在编写一行代码来对多个 IP 进行 ping 测试,并让它 return 进行一次状态更新。我试图拥有它所以如果所有结果都是 $true
然后显示绿色,如果结果包含 $false
但还有一个 $true
然后显示黄色最后如果所有结果都是 $false
然后显示红色。
下面是我得到的。这是我尝试过的一种迭代,但我只能让它响应黄色而不是红色。非常感谢任何帮助。
$octets = (Get-NetIPAddress | ?{$_.PrefixOrigin -eq "Manual","Dhcp"}).IPAddress.Split(".")
$ipFirst3 = $octets[0] + "." + $octets[1] + "." + $octets[2]
$ESX1MGT = $ipFirst3 + '.' + "181" #esxi management
$ESX1STG = $ipFirst3 + '.' + "151" #esxi storage
$ESX1VMO = $ipFirst3 + '.' + "71" #esxi vmotion
If(Test-Connection $ESX1MGT -count 2 -Quiet){
$MGTStatus = "True"
}else{
$MGTStatus = "False"
}
If(Test-Connection $ESX1STG -count 2 -Quiet){
$STGStatus = "True"
}else{
$STGStatus = "False"
}
If(Test-Connection $ESX1VMO -count 2 -Quiet){
$VMOStatus = "True"
}else{
$VMOStatus = "False"
}
$ESX1Status = @($MGTStatus,$STGStatus,$VMOStatus)
If($ESX1Status -eq "True"){
$ESX1StatusLabel.BackColor = "Green"
}elseif ($ESX1Status -contains "False") {
$ESX1StatusLabel.BackColor = "Yellow"
}elseif ($ESX1Status -eq "False") {
$ESX1StatusLabel.BackColor = "Red"
}
编辑这是我试过的另一个想法
$ESX1Status = @($ESX1MGT,$ESX1STG,$ESX1VMO)
$result = Foreach($ESX in $ESX1Status){
Test-Connection $ESX -Count 2 -Quiet
}
If($result -is $true){
$ESX1StatusLabel.BackColor = "Green"
}
If($result -contains $false -and $true){
$ESX1StatusLabel.BackColor = "Yellow"
}
If($result -is $false){
$ESX1StatusLabel.BackColor = "Red"
}
当 运行 两个版本时,我有时会遇到此错误
Cannot convert value "True" to type "System.Type". Error: "Invalid cast from 'System.Boolean' to 'System.Type'."
At C:\Source\Scripts\PowerShell\Verification.ps1:420 char:4
+ If($result -is $true){
+ ~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], RuntimeException
+ FullyQualifiedErrorId : RuntimeException
这对我来说非常完美。 答案来自 Reddit 上的 post 我也在 r/PowerShell 来自 u/engageant
“有一种简单的方法可以简化这一切:
$mgmt = Test-Connection $ESX1MGT -Count 2 -Quiet
$storage = Test-Connection $ESX1STG -Count 2 -Quiet
$vmotion = Test-Connection $ESX1VMO -Count 2 -Quiet
$status = $mgmt + $storage + $vmotion
switch ($status) {
3 {ESX1StatusLabel.BackColor = "Green"}
2 {ESX1StatusLabel.BackColor = "Yellow"}
1 {ESX1StatusLabel.BackColor = "Yellow"}
0 {ESX1StatusLabel.BackColor = "Red"}
}
这里发生的是我们将每个测试的结果放入其自己的变量中,然后对变量求和(记住 0 = false,1 = true)。然后我们评估总和并采取相应行动。还可以在此处进行其他调整以可能增加 readability/scalability,但为了解释“如何”,我特意明确了。”