代码之家  ›  专栏  ›  技术社区  ›  mystack

消除内部回路

  •  0
  • mystack  · 技术社区  · 10 年前

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

    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 回复  |  直到 10 年前
        1
  •  1
  •   Mathias R. Jessen    10 年前

    不完全确定你所说的“超过时间”是什么意思——该做什么了?

    如果您想在测试连接尝试之间等待,可以使用 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 Delay 的参数 Test-Connection :

    $Status = Test-Connection -ComputerName $Computer -Count 3 -Delay $TimeoutSeconds
    
        2
  •  0
  •   Loïc MICHEL    10 年前

    您不必使用循环,因为测试连接已经具有 count 参数

        3
  •  0
  •   Lieven Keersmaekers    10 年前

    其他答案已经深入说明了为什么不需要循环,但我想为重构问题添加一个解决方案。

    可以通过预初始化 $Result 变量,并根据需要在原始循环中更改它。

    就我个人而言,我觉得这更具可读性 (主观) 以提前完成额外任务为代价。

    $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
    

    编辑 为了并行测试多台计算机,我使用以下工作流

    workflow Test-WFConnection {
      param(
        [string[]]$computers
      )
        foreach -parallel ($computer in $computers) {        
            Test-Connection -ComputerName $computer -Count 1 -ErrorAction SilentlyContinue
      }
    }
    

    称为 Test-WFConnection @("pc1", "pc2", ... , "pcn")

    当每台计算机都在线时,差别不大,但当多台计算机离线时,差别很大。

    推荐文章