Ping Abfrage mit IF ELSE in PowerShell
Hallo zusammen
Ich habe ein kleines Problemchen, welches ich nicht weiss wie zu lösen.
Ich möchte mit einer Ping Abfrage in PowerShell sicherstellen, dass das Zielsystem erreichbar ist und erst dann das Script weiterlaufen lassen.
Ich habe es bisher mit einer Schleifenfunktion gelöst:
sleep(1)
}
Ich möchte diese aber eher durch eine IF/ELSE-Anweisung und zum Beispiel nur für 10 Ping Abfragen lösen.
Könnt Ihr mir hier helfen?
Ich danke für Inputs.
Ich habe ein kleines Problemchen, welches ich nicht weiss wie zu lösen.
Ich möchte mit einer Ping Abfrage in PowerShell sicherstellen, dass das Zielsystem erreichbar ist und erst dann das Script weiterlaufen lassen.
Ich habe es bisher mit einer Schleifenfunktion gelöst:
- Schleifenfunktion bis Gegenstelle erreicht
sleep(1)
}
Ich möchte diese aber eher durch eine IF/ELSE-Anweisung und zum Beispiel nur für 10 Ping Abfragen lösen.
Könnt Ihr mir hier helfen?
Ich danke für Inputs.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 1917604874
Url: https://administrator.de/forum/ping-abfrage-mit-if-else-in-powershell-1917604874.html
Ausgedruckt am: 15.04.2025 um 13:04 Uhr
17 Kommentare
Neuester Kommentar
Zitat von @manuel-r:
Dann machst du es trotzdem mit WHILE zählst aber in der Schleife einen Zähler hoch und verlässt die Schleife mit BREAK sobald der Zähler den Wert X erreicht hat.
Manuel
Ich möchte diese aber eher durch eine IF/ELSE-Anweisung und zum Beispiel nur für 10 Ping Abfragen lösen.
Dann machst du es trotzdem mit WHILE zählst aber in der Schleife einen Zähler hoch und verlässt die Schleife mit BREAK sobald der Zähler den Wert X erreicht hat.
Manuel
Jetzt hab ich erst verstanden was mit 10 Ping abfragen gemeint ist.
Das macht aber keinen Sinn. Wenn ich jetzt:
while (!(Test-Connection xx.xx.xx.xx -Count 1 -quiet)){
sleep(1)
}
Test-Connection xx.xx.xx.xx -Count 10 -quiet
Ob ich jetzt einen Ping schicke, eine Sekunde warte und die Schleife 10 mal wiederhole oder ob ich einmal 10 Pings im Sekundenabstand schicke ist im Effekt dann auch egal, oder?
Gruß
Doskias
Zitat von @Charismea:
und wie müsste dies konkret als Code aussehen?
-> resp. wie speichert es den erfolgreichen Ping als Wert?
und wie müsste dies konkret als Code aussehen?
-> resp. wie speichert es den erfolgreichen Ping als Wert?
Brauchst du ja nicht speichern.
Du machst deine while-Schleife wie bisher, packst n braeak und counter rein und baust es in eine if. also etwa so:
$counter=0
while (!(Test-Connection xx.xx.xx.xx -Count 1 -quiet)
{
if (!(test-connection xxx.xxx.xxx.xxx -count 1 -quiet))
{dein code + break"}
else
{$counter ++
if ($counter -ge 10)
{break}
"}
}
Moin,
ping zeigt über den Errorlevel an ob das Ziel erreichbar war.
Das kannst Du in Deiner Schleife verwenden.
Ein Einzelping ("Geben Sie mir ein Ping Vasili, aber bitte nur ein einziges")
ping zeigt über den Errorlevel an ob das Ziel erreichbar war.
Das kannst Du in Deiner Schleife verwenden.
Ein Einzelping ("Geben Sie mir ein Ping Vasili, aber bitte nur ein einziges")
ping 8.8.8.8 -n 1
Ping wird ausgeführt für 8.8.8.8 mit 32 Bytes Daten:
Antwort von 8.8.8.8: Bytes=32 Zeit=12ms TTL=59
Ping-Statistik für 8.8.8.8:
Pakete: Gesendet = 1, Empfangen = 1, Verloren = 0
(0% Verlust),
Ca. Zeitangaben in Millisek.:
Minimum = 12ms, Maximum = 12ms, Mittelwert = 12ms
echo %errorlevel%
0
ping 8.8.8.1 -n 1
Ping wird ausgeführt für 8.8.8.1 mit 32 Bytes Daten:
Zeitüberschreitung der Anforderung.
Ping-Statistik für 8.8.8.1:
Pakete: Gesendet = 1, Empfangen = 0, Verloren = 1
(100% Verlust),
echo %errorlevel%
1
Ich möchte erreichen, dass wenn die Ziel-IP 10x erreicht wird, das nachfolgende Script ausgeführt wird und bei nicht erreichen, das Script gar nichts tut.
Und warum negierst du dann Test-Connection? Viel mehr Sinn macht dann
while (Test-Connection xx.xx.xx.xx -Count 1 -quiet) {
$Counter = $Counter + 1
sleep(1)
if ($Counter -eq 10) {
break
}
}
write-host "Hier geht es weiter"
Do {
if (Test-Connection xx.xx.xx.xx -Count 1 -Quiet) {
$Counter = $Counter + 1
start-sleep -s 1
}
} Until ($Counter -eq 10)
write-host "Hier geht es weiter"

$cnt = 0
while($cnt -lt 10){
if (Test-Connection xx.xx.xx.xx -Count 1 -Quiet){$cnt++}Else{$cnt=0}
sleep 1
}
Moin
Gruß
Doskias
Zitat von @1915348599:
Das macht doch keinen Sinn. Du setzt CNT auf 0, ok damit startest du die while schleife. Wenn die Test-Connection positiv ist, also der Rechner erreichbar ist, dann wird es um 1 hochgezählt. Läuft also bei aktiven Rechner 10 mal durch. Wenn der Rechner aus ist, wird CNT wieder auf 0 gesetzt. Ist der Rechner also aus werden nicht nur 10, sondern unendlich viele Ping-Abfragen gesendet. Wie hilft das weiter?$cnt = 0
while($cnt -lt 10){
if (Test-Connection xx.xx.xx.xx -Count 1 -Quiet){$cnt++}Else{$cnt=0}
sleep 1
}
Gruß
Doskias

Zitat von @Doskias:
Das macht doch keinen Sinn. Du setzt CNT auf 0, ok damit startest du die while schleife. Wenn die Test-Connection positiv ist, also der Rechner erreichbar ist, dann wird es um 1 hochgezählt. Läuft also bei aktiven Rechner 10 mal durch. Wenn der Rechner aus ist, wird CNT wieder auf 0 gesetzt. Ist der Rechner also aus werden nicht nur 10, sondern unendlich viele Ping-Abfragen gesendet. Wie hilft das weiter?
Doch das macht schon Sinn (für den TO), es wird bei dieser Variante nur weitergemacht wenn 10 aufeinander folgende Pings erfolgreich sind. Ist dazwischen einer nicht erfolgreich fängt die Zählung wieder bei 0 an, so lange bis 10 aufeinanderfolgende Pings erfolgreich sind. Der TO wollte das ja so oder so ähnlich, ist eben nicht so ganz klar formuliert:Das macht doch keinen Sinn. Du setzt CNT auf 0, ok damit startest du die while schleife. Wenn die Test-Connection positiv ist, also der Rechner erreichbar ist, dann wird es um 1 hochgezählt. Läuft also bei aktiven Rechner 10 mal durch. Wenn der Rechner aus ist, wird CNT wieder auf 0 gesetzt. Ist der Rechner also aus werden nicht nur 10, sondern unendlich viele Ping-Abfragen gesendet. Wie hilft das weiter?
Ich möchte erreichen, dass wenn die Ziel-IP 10x erreicht wird, das nachfolgende Script ausgeführt wird und bei nicht erreichen, das Script gar nichts tut.
Zitat von @1915348599:
Zitat von @Doskias:
Das macht doch keinen Sinn. Du setzt CNT auf 0, ok damit startest du die while schleife. Wenn die Test-Connection positiv ist, also der Rechner erreichbar ist, dann wird es um 1 hochgezählt. Läuft also bei aktiven Rechner 10 mal durch. Wenn der Rechner aus ist, wird CNT wieder auf 0 gesetzt. Ist der Rechner also aus werden nicht nur 10, sondern unendlich viele Ping-Abfragen gesendet. Wie hilft das weiter?
Doch das macht schon Sinn (für den TO), es wird bei dieser Variante nur weitergemacht wenn 10 aufeinander folgende Pings erfolgreich sind. Ist dazwischen einer nicht erfolgreich fängt die Zählung wieder bei 0 an, so lange bis 10 aufeinanderfolgende Pings erfolgreich sind. Der TO wollte das ja so auch wenn das nicht so ganz klar formuliert ist:Das macht doch keinen Sinn. Du setzt CNT auf 0, ok damit startest du die while schleife. Wenn die Test-Connection positiv ist, also der Rechner erreichbar ist, dann wird es um 1 hochgezählt. Läuft also bei aktiven Rechner 10 mal durch. Wenn der Rechner aus ist, wird CNT wieder auf 0 gesetzt. Ist der Rechner also aus werden nicht nur 10, sondern unendlich viele Ping-Abfragen gesendet. Wie hilft das weiter?
Ich möchte erreichen, dass wenn die Ziel-IP 10x erreicht wird, das nachfolgende Script ausgeführt wird und bei nicht erreichen, das Script gar nichts tut.
Ok, dennoch hast du am Ende die Situation, dass du extrem leicht in eine Endlosschleife verfallen kannst. Die ganze Anfrage des TO ist für mich immer noch nicht bis zum Ende durchdacht. Will ich 10 Pings dann mach ich n -count 10. 10 Pings in Folge mit einem Abstand von einer Sekunde einzeln abzufragen ist sinnfrei. Entweder der Rechner ist da oder nicht. In einer Sekunde wird sich da nicht viel tun.

Zitat von @Doskias:
Ok, dennoch hast du am Ende die Situation, dass du extrem leicht in eine Endlosschleife verfallen kannst.
Nur so lange der Rechner eben nicht online ist.Ok, dennoch hast du am Ende die Situation, dass du extrem leicht in eine Endlosschleife verfallen kannst.
Die ganze Anfrage des TO ist für mich immer noch nicht bis zum Ende durchdacht.
Dito, ist für mich auch ehrlich gesagt sinnfrei.Will ich 10 Pings dann mach ich n -count 10. 10 Pings in Folge mit einem Abstand von einer Sekunde einzeln abzufragen ist sinnfrei. Entweder der Rechner ist da oder nicht. In einer Sekunde wird sich da nicht viel tun.
Ich schätze mal er versucht damit ein Delay zu erreichen bis ein Rechner komplett hochgefahren ist (der Netzerkstack antwortet ja oftmals schon früher als später gestartete Dienste), und kennt mangels Wissen keine andere Möglichkeit wie man erkennt das ein Dienst erreichbar ist ... aber für so was gibt es ja weit bessere Methoden als Pings um das festzustellen ...Glaskugel polier ... ende.

# Restartet Script bei Bedarf mit erhöhten Rechten
if(!(new-object System.Security.Principal.WindowsPrincipal([System.Security.Principal.WindowsIdentity]::GetCurrent())).IsInRole(544)){start powershell -Verb runas -ArgumentList '-File',$MyInvocation.MyCommand.Definition;exit}
Das macht hier bei unbeaufsichtigtem Start keinen Sinn. Das ist nur nötig wenn man das Skript manuell mit einem User startet.if(!(new-object System.Security.Principal.WindowsPrincipal([System.Security.Principal.WindowsIdentity]::GetCurrent())).IsInRole(544)){start powershell -Verb runas -ArgumentList '-File',$MyInvocation.MyCommand.Definition;exit}
# Hier wird nur das Ergebnis der Abfrage ("erreicht"/"nicht erreicht") ausgewertet
Überflüssige doppelte Test-Connection Abfrage, pack das ganze in den "Else"-Teil der ersten IF-Abfrage, fertig.