Loop Foreach仅重复脱机计算机

时间:2017-10-28 12:32:52

标签: powershell

不知道我哪里出错了我想跳过在线重新上线的计算机,但它会不断检查在线和在线计算机。

第一次更新很好,它即将上线,它应该跳过,只能ping离线的一个输出屏幕

g-10 Is coming online...Skipping to offline one's
192.168.0.1 Is coming online...Skipping to offline one's
Testing to see if Hero is coming online...
Hero is Offline. Pausing for 2 seconds. Remaining attempts: 1
Testing to see if zero is coming online...
zero is Offline. Pausing for 2 seconds. Remaining attempts: 1

这里很好,但在线电脑再次重复......

 g-10 Is coming online...Skipping to offline one's
    192.168.0.1 Is coming online...Skipping to offline one's
    Testing to see if Hero is coming online...
    Hero is Offline.

这是我的代码

$Comps = GC c:\restarted.txt
[int]$SleepTimer = "1" #minutes to attempt after
[int]$SleepSeconds = $SleepTimer * 2
[int]$Attempts = "2"
[int]$AttemptsCounter = 0

Do 
{
   $AttemptsCounter++
   $RemainingAttempts = ([int]$Attempts - [int]$AttemptsCounter)
   Foreach($comp in $comps){
   $Online = Test-Connection -ComputerName $Comp -Quiet
   IF($online -eq "True"){
  Write-Host "$comp" -BackgroundColor Green  -NoNewline
   Write-Host " Is coming online...Skipping to offline one's"
   }

   elseIf ($Online -NE "True") 
   {
      Write-Host "Testing to see if $Comp is coming online..."
      Write-Host "$comp" -BackgroundColor Red  -NoNewline
       Write-Host " is Offline" -BackgroundColor Red -ForegroundColor Black -NoNewline
       If ($AttemptsCounter -eq $Attempts) {
          Write-Host "."
       }
       Else {
          Write-Host ". Pausing for $SleepSeconds seconds. Remaining attempts: $RemainingAttempts"
       }
   }
}
   #Check the number of attempts, break out if reached.
   If ($AttemptsCounter -eq $Attempts) {break}

   #Delay
   Start-Sleep -s ($SleepTimer * 60)
}
While ($Online -NE "True")

If ($Online -NE "True") {
   Write-Host "Maximum number of attempts reached"
   }
Else {
   Write-Host
   Write-Host "Computer $Comp is " -NoNewline
   Write-Host "ONLINE" -BackgroundColor Green
}

3 个答案:

答案 0 :(得分:0)

Test-Connection返回一个对象数组或$ null,具体取决于ip或hostname是否为活动。

所以如果你这样做就足够了:

IF($online){
  // if its alive
}
else
{
  // if its not responding
}

另一件需要指出的是你没必要

if(condition) {
}
elseif(condition) {
}

如果您正在测试“bool问题 - 答案”,则不需要elseif。在您的情况下,如果您正在检查计算机的状态,那么您的答案不能超过2(是/否)。因此elseif在这种情况下是多余的。

if(condition) {
  // if the condition is true
}
else {
  // if the condition is not true. you can't have the third option
}

此外,if条件If ($Online -NE "True")正在检查变量$Online是否与精确字符串“true”或“True”不相等,因为-ne是不区分大小写的条件运算符。 您应该检查变量是否包含任何内容或保留$Null

答案 1 :(得分:0)

尝试以下代码。

它基本上为 <?php if (isset($_POST['submit'])){ $timeout=$_POST['time_out']; $timeout = date('Y-m-d H:i:s', strtotime(str_replace('-', '/', $timeout))); mysqli_query($dbcon,"insert into user_logs_tbl (time_out) values('$timeout')")or die(mysqli_error($dbcon)); } ?> 中的每一行执行以下操作:

  1. 测试计算机是否在线(注意:我添加了c:\restarted.txt
  2. 如果是-Count 1:打印一些绿色文字和online
  3. 如果是break:打印红色文本,等待并递减$ RemainingAttempts变量并重做,直到offline$RemainingAttempts或计算机为0
  4. online变量$RemainingAttempts打印出更多文字

    0
  5. 希望这有帮助!

    如果您对该代码有任何疑问,请与我们联系。

    KR 京特

答案 2 :(得分:0)

虽然我知道Guenther Schmitz已经进行了绿色检查,但我想跟进一些额外的细节和指示。

带有Test-Connection开关的

-Quiet会返回[Boolean]类型。这是一个简单的真/假。我喜欢将字符串值与布尔值进行比较时要格外小心,因为根据测试框架的不同,可能会得到一些奇怪的结果。例如:

'false' -eq $true
$true -eq 'false'

Top 1等于false,bottom 1等于true,因为PowerShell正在将第二个对象转换为与第一个对象相同的类型,而非空字符串为true。所以我的强烈的建议是坚持打字比较。所以我开始的第一个代码更改是:

if ($Online -eq $true) {

正如@pandemic已经提到的那样,您进行了简单的比较,因此不需要elseif,只需else

您遇到的第二个问题是,没有任何内容可以从测试列表中删除计算机。编写代码的方式,如果测试列表中的最后一台计算机是&#34; down&#34;然后它再次通过所有计算机。如果列表中的最后一台计算机是&#34; up&#34;然后它退出do|while循环,无论您正在测试多少台计算机以及有多少台计算机出现故障。您可以通过在测试文件中放置1个已知主机和1个假主机的简单测试来验证这一点。如果已知的好主机是第一个,它将继续循环,直到$AttemptsCounter达到允许的最大值。如果你翻转列表,它会在测试已知的好主机后立即拯救。

您的初始代码在所有计算机上循环,然后返回并重新启动。在Guenther的例子中,他们一次循环一台计算机,并检查直到它出现,或超过测试计数后纾困。我认为Guenther的例子可能就是你所追求的,但是如果你想让它循环通过所有的计算机,然后只测试那些失败的那些,我就写下这样的东西:

$comps = Get-Content -path 'c:\restarted.txt'
[int]$SleepTimer = 1
[int]$Attempts = 2
[int]$AttemptsCounter = 0

do {
    Write-Host "Testing Network, attempt $($AttemptsCount + 1)"
    $newComps = @()
    foreach($comp in $comps) {
        $online = Test-Connection -Quiet -Count 1 -ComputerName $comp
        if ($online) {
            Write-Host "$comp" -BackgroundColor Green  -NoNewline
            Write-Host " Is coming online...Skipping to offline one's"
        } else {
            $newComps += $comp
            Write-Host "$comp" -BackgroundColor Red  -NoNewline
            Write-Host " is Offline" -BackgroundColor Red -ForegroundColor Black
        }
    }
    $comps = $newComps
    $AttemptsCounter++
    Start-Sleep -Seconds ($SleepTimer * 60)
}
while (($comps.count -gt 0) -and ($AttemptsCounter -lt $Attempts))

if ($comps.Count -gt 0) {
    Write-Host "Exceeded Attempts Counter" -BackgroundColor Red
}

在此代码中,它将获取计算机列表,当它在计算机上失败时,它会将其填充到临时列表中以供重用。