我的程序中有两个循环。第一个循环用于设置重试过程,内循环用于测试连接状态。
for($retry=0;$retry<=3;$retry++)
{
while (!(Test-Connection "mycomputer"))
{
if (time exceed)
{
$status=$false
Write-Host "machine is offline"
break
}
}
if($status)
{
Write-Host "machine is online"
break
}
}
有没有办法在不改变输出的情况下消除内循环
答案 0 :(得分:1)
不完全确定“超出时间”是什么意思 - 时间做什么?
如果您想在测试连接尝试之间等待,可以使用Start-Sleep
引入人为延迟:
$Computer = "mycomputer"
$TimeoutSeconds = 5
for($retry=0; $retry -lt 3; $retry++)
{
if(Test-Connection -ComputerName $Computer -Count 1 -Quiet){
# Didn't work
Write-Host "Machine is offline"
# Let's wait a few seconds before retry
Start-Sleep -Seconds $TimeoutSeconds
} else {
Write-Host "Machine is online!"
break
}
}
最简单的方法是使用Count
的{{1}}和Delay
参数:
Test-Connection
答案 1 :(得分:0)
您不必使用循环,因为测试连接已经有onCreate()
参数
答案 2 :(得分:0)
其他答案已经深入探讨了为什么你不需要循环,但我想为你的重构问题添加一个解决方案。
您可以通过预先初始化$Result
变量并在必要时在原始循环中更改它来消除内部循环和if语句。
就我个人而言,我发现这个更具可读性(主观),但需要额外付费。
$Result = "machine is online";
for($retry=0;$retry<=3;$retry++) {
while (!(Test-Connection "mycomputer"))
{
if (time exceed)
{
$Result = "machine is offline"
break
}
}
Write-Host $Result
编辑要同时测试多台计算机,我使用以下worflow
workflow Test-WFConnection {
param(
[string[]]$computers
)
foreach -parallel ($computer in $computers) {
Test-Connection -ComputerName $computer -Count 1 -ErrorAction SilentlyContinue
}
}
称为Test-WFConnection @("pc1", "pc2", ... , "pcn")
当每台计算机都在线时没有多大区别,但当多台计算机处于脱机状态时,这是一个与众不同的世界。