2017-10-28 1 views
1

Nicht sicher, wo ich falsch liege Ich möchte die Computer überspringen, die online zurückkehren, aber es überprüft online und online Computer.Loop Foreach nur Offline-Computer wiederholen

erstes Update ist in Ordnung, dass seine Online-kommen und es sollte überspringen und ping nur die offline eine ist ein Screenhot Ausgang

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 

Sein feine bis hier aber Online-Computer wieder wiederholt ...

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. 

hier ist mein Code

$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 
} 

Antwort

0

Halten Sie den folgenden Code.

Es im Grunde macht folgendes für jede Zeile in c:\restarted.txt:

  1. prüft, ob der Computer online ist (Anmerkung: Ich habe -Count 1)
  2. wenn es online ist: druckt einige grüne Text und break
  3. Wenn es offline ist: roten Text drucken, warten und dekrementiert die Variable $ RemainingAttempts und wiederholen, bis $RemainingAttempts ist 0 oder der Computer ist online
  4. es die $RemainingAttempts Variable ist 0 Druck

    $ComputerNameArray = Get-Content -Path c:\restarted.txt 
    [int]$SleepTimer = "1" #minutes to attempt after 
    [int]$Attempts = "2" 
    $DefaultBackgroundColor = (Get-Host).ui.rawui.BackgroundColor 
    
    foreach($ComputerName in $ComputerNameArray) { 
        $AttemptsCounter = 0 
        $RemainingAttempts = $Attempts - $AttemptsCounter 
    
        Write-Host "Testing to see if ""$ComputerName"" is coming online..." -BackgroundColor $DefaultBackgroundColor 
    
        while($RemainingAttempts -gt 0) { 
         if(Test-Connection -ComputerName $ComputerName -Quiet -Count 1) { 
          Write-Host """$ComputerName""" -BackgroundColor Green -NoNewline 
          Write-Host " Is coming online...Skipping to offline one's" 
          break 
         } else { 
          Write-Host """$ComputerName""" -BackgroundColor Red -NoNewline 
          Write-Host " is Offline" -BackgroundColor Red -ForegroundColor Black -NoNewline 
          Write-Host ". Pausing for $SleepTimer minutes. Remaining attempts: $($RemainingAttempts - 1)" 
          Start-Sleep -Seconds ($SleepTimer * 60) 
          $RemainingAttempts-- 
         } 
        } 
    
        if($RemainingAttempts -eq 0) { 
         Write-Host "Maximum number of attempts reached" -BackgroundColor $DefaultBackgroundColor 
        } 
    } 
    

Hoffnung etwas mehr Text heraus, das hilft!

Lassen Sie mich wissen, wenn Sie Fragen zum Code haben.

KR Günther

0

Test-Connection ein ar zurück Strahl von Objekten oder ein $ null abhängig davon, ob die IP oder der Hostname live ist.

so reicht es, wenn Sie dies tun:

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

eine andere Sache ist darauf hinzuweisen, Sie haben nicht zu

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

wenn Sie testen „Bool Frage-Antwort“ Sie dies nicht tun brauche die elseif. In Ihrem Fall, wenn Sie den Zustand des Computers überprüfen, können Sie nicht mehr Antworten als 2 (ja/nein) haben. So ist die elseif in diesem Fall redundant.

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

Auch Ihr, wenn die Bedingung If ($Online -NE "True") wird überprüft, ob die Variable $Online nicht gleich die genaue Zeichenfolge „true“ oder „True“ ist seit -ne Groß- und Kleinschreibung Bedingungsoperator ist. Sie sollten überprüfen, ob die Variable hält oder $Null

+0

'Test-Verbindung -Quiet' gibt einen' boolean' zurück. Ohne "-Quiet" sind Sie richtig, es gibt bei einem Fehler ein Array oder $ NULL zurück. –

0

Während ich weiß Günther Schmitz hat bereits den grünen Haken bekam, wollte ich mit einigen zusätzlichen Details und Hinweise verfolgen.

Test-Connection mit dem -Quiet Schalter gibt einen [Boolean] Typ zurück. Dies ist ein einfaches Wahr/Falsch. Ich möchte besonders vorsichtig mit dem Vergleichen von String-Werten mit booleschen Werten sein, da Sie abhängig davon, wie Sie Ihre Tests gestalten, einige seltsame Ergebnisse erhalten. Zum Beispiel:

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

Top eins gleich falsch, unten eins gleich wahr, weil Power ist, das zweite Objekt in der gleichen Art wie die erste Konvertierung, und eine nicht-leere Zeichenfolge wahr. Also meine starke Empfehlung ist, typisierte Vergleiche zu halten. So ist die erste Codeänderung ich anfangen würde mit ist:

if ($Online -eq $true) { 

Wie @pandemic bereits erwähnt, sind Sie einen einfachen Vergleich zu tun, so dass keine Notwendigkeit für elseif, nur else.

Das zweite Problem, das Sie haben, ist, dass es nichts Computer von Ihrer Testliste ist zu entfernen. Wie der Code geschrieben wird, wenn der letzte Computer in der Testliste "down" ist, würde er alle Computer erneut durchlaufen. Wenn der letzte Computer in der Liste "up" ist, würde er die do|while-Schleife verlassen, unabhängig davon, wie viele Computer Sie testen und wie viele ausfallen. Sie können dies mit einem einfachen Test überprüfen, indem Sie 1 bekannte Hosts und 1 falschen Host in die Testdatei setzen. Wenn der bekannte gute Host zuerst ist, wird er weiterlaufen, bis $AttemptsCounter das maximal zulässige Maximum erreicht. Wenn Sie die Liste umdrehen, wird sie sofort nach dem Testen des bekannten guten Hosts gerettet.

Ihr Anfangscode durchgeschleift alle Computer einmal ging dann zurück und begann wieder. In Guenthers Beispiel durchlaufen sie einen Computer nach dem anderen und prüfen, bis er auftaucht. Ich denke, Guenthers Beispiel war wahrscheinlich das, was Sie waren nach, aber wenn man es durch alle Computer machen wollte, und testen Sie dann nur diejenigen, die nicht gelungen war, würde ich so etwas schreiben:

$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 
} 

In dieser Code, nimmt es die Liste der Computer, und wenn es auf einem Computer fehlschlägt, stopft es es in eine temporäre Liste zur Wiederverwendung.

+0

Wow, deine Idee ist auch gut, wenn ich sie teste, nehme an, dass 3 Computer offline sind und es heißt, 3 sind offline und in der Mitte, während es dasjenige überspringt, das online ist? Das macht Spaß mit diesem Skript zu spielen –