消除内环

时间:2015-07-23 10:05:10

标签: powershell

我的程序中有两个循环。第一个循环用于设置重试过程,内循环用于测试连接状态。

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
}

}

有没有办法在不改变输出的情况下消除内循环

3 个答案:

答案 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")

当每台计算机都在线时没有多大区别,但当多台计算机处于脱机状态时,这是一个与众不同的世界。