traller
Goto Top

Batch mit ping, die sich automatisch selbst beendet

Hallo,
ich möchte eine Batch schreiben, die einen "ping IP -t" ausführt und sobald ein Wert in Millisekunden angezeigt wird, sich automatisch selbst beendet. Vorher kommen dann natürlich die Fehlermeldung "Zeitüberschreitung" und "Kein Host". Wie würde das gehen? Müsste ich da eine if-else Schnittstelle entwickeln?

Danke!!!

Content-Key: 244961

Url: https://administrator.de/contentid/244961

Printed on: April 25, 2024 at 15:04 o'clock

Member: killtec
killtec Jul 29, 2014 at 12:33:47 (UTC)
Goto Top
Hi,
wie wäre es anstelle eines -t ein -n 1 zu nehmen und dann den errorlevel abfragen?

Gruß
Member: traller
traller Jul 29, 2014 updated at 12:46:06 (UTC)
Goto Top
Zitat von @killtec:
wie wäre es anstelle eines -t ein -n 1 zu nehmen und dann den errorlevel abfragen?


wohl nicht möglich. Es soll ein Computer per WOL gestartet werden und wenn er per Ping erreichbar ist, soll das Fenster einfach zu gehen, damit man weißt, das er den Bootvorgang beendet hat.
Member: killtec
killtec Jul 29, 2014 at 12:59:04 (UTC)
Goto Top
Hast du denn schon was mit dem Script per WOL?
weil ein -t heißt ja nur, dass er das so lange macht. Du kannst das ganze was ich geschrieben habe ja in einer Schleife laufen lassen.

Sprich starten, Prüfen, Wenn Erfolgreich -> Beenden, wenn nicht, -> Zurück zum start. (geht recht schnell mit einer if und einem Sprungpunkt.

Gruß
Member: Sheogorath
Sheogorath Jul 30, 2014 at 06:45:47 (UTC)
Goto Top
Moin,

geht recht schnell:
:Loop
ping -n 1 %host%
if %errorlevel% eq 0 Exit
goto :loop

Darüber schreibst du deinen WOL-Aufruf und schon passt es.

Gruß
Chris
Member: traller
traller Aug 02, 2014 at 11:40:37 (UTC)
Goto Top
Zitat von @Sheogorath:

Moin,

geht recht schnell:
:Loop
> ping -n 1 %host%
> if %errorlevel% eq 0 Exit
> goto :loop
> 

Darüber schreibst du deinen WOL-Aufruf und schon passt es.

Gruß
Chris
Deine Lösung scheint der richtige Weg zu sein. Aber welches Errorlevel ist denn das richtige ? wie frage ich das ab?
Member: Sheogorath
Sheogorath Aug 03, 2014 at 23:48:00 (UTC)
Goto Top
Hallöchen,

Genau das ist der Weg. Du willst, dass bei einem erfolgreichen Ping die Batch endet. Genau das macht sie. Erfolgreicher Ping ist Errorlevel 0 alles andere Errorlevel 1.

Gruß
Chris
Member: traller
traller Aug 04, 2014 updated at 12:54:25 (UTC)
Goto Top
Hallöle,
ich habe das mal so wie oben eingefügt und den host durch die IP ersetzt. Es muss aber das "eq" mit "==" ersetzt werden, sonst kommt Ausführen folgende Fehlermeldung:
"eq" kann syntaktisch an dieser Stelle nicht verarbeitet werden.  
nun sieht es also wie folgt aus.
:Loop
ping -n 1 192.168.6.5
if %errorlevel% == 0 exit
goto :loop
trotzdem stimmt was mit den Errorlevels nicht. der Schließt nämlich viel zu früh, nämich dann, wenn "Zielhost nicht erreichbar." angezeigt wird. Das kommt der Ping-Abfrage zwischendurch natürlich auch vor, nur schließt er dann zu früh ...
Member: Sheogorath
Solution Sheogorath Aug 05, 2014 updated at 14:01:44 (UTC)
Goto Top
Moin,

stimmt, da war ja noch was ;)

eine verbesserte variante, die nun wirklich das richtige Errorlevel zur wirft:

:Loop
ping -n 1 192.168.1.1 | find "TTL"  
if %errorlevel% == 0 exit
goto :loop

Das sollte aber nun wirklich klappen. Hier wird nämlich die TTL (Time To Life) abgefragt, die nur bei wirklich lebendigen Paketen zurück kommt. wenn nicht, wird es nicht gefunden und läuft auf Fehler.

Gruß
Chris
Member: traller
traller Aug 05, 2014 at 14:01:59 (UTC)
Goto Top
Zitat von @Sheogorath:

Moin,

stimmt, da war ja noch was ;)

eine verbesserte variante, die nun wirklich das richtige Errorlevel zur wirft:

> :Loop
> ping -n 1 192.168.1.1 | find "TTL"  
> if %errorlevel% == 0 exit
> goto :loop
> 

Das sollte aber nun wirklich klappen. Hier wird nämlich die TTL (Time To Life) abgefragt, die nur bei wirklich lebendigen
Paketen zurück kommt. wenn nicht, wird es nicht gefunden und läuft auf Fehler.

Gruß
Chris
danke, klappt nun wunderbar !!!
Member: traller
traller Sep 20, 2014 at 19:45:01 (UTC)
Goto Top
Hallo,
das Script funktioniert so weit sehr gut. Ich wollte nun den umgekehrten Weg machen, also es soll nun bei "Zielhost nicht erreichbar" und "Zeitüberschreitung der Anforderung" geschloßen werden. Soweit so gut, sollte das über
Zitat von @traller:
nun sieht es also wie folgt aus.
> :Loop
> ping -n 1 192.168.6.5
> if %errorlevel% == 0 exit
> goto :loop
> 
trotzdem stimmt was mit den Errorlevels nicht. der Schließt nämlich viel zu früh, nämich dann, wenn
"Zielhost nicht erreichbar." angezeigt wird.
also funktionieren. Problem ist aber nun: ich muss davor aber folgenden Befehl ausführen:
plink.exe -pw Passwort Nutzer@IP sudo pm-suspend
Problem ist aber, dass wenn ich diesen Befehl in einer Batch ausführe, er nicht zu einem weiteren geht, da wohl nichts zurück geliefert wird etc. Sprich, es muss der Befehl ausgeführt werden und ohne wenn und aber in die Ping-Prüfung gegangen werden. Wie bekommt man das hin?
Member: Sheogorath
Solution Sheogorath Sep 21, 2014 updated at 17:45:41 (UTC)
Goto Top
Moin,

das ist auch kein Problem, das mittel deiner Wahl ist "start"

start c:\pfad\zur\plink.exe -pw Passwort nutzer@ip sudo pm-suspend

wobei man bei sowas dann lieber von Linux aus einen Ping an das gerät sendet, welches online ist.

Wenn das gerät ja nicht erreichbar ist, dann wirst du dort auch nichts abschlaten können, aber das ist ja deine Sache ;)

Gruß
Chris
Member: traller
traller Sep 21, 2014 at 17:47:09 (UTC)
Goto Top
Zitat von @Sheogorath:

Moin,

das ist auch kein Problem, das mittel deiner Wahl ist "start"

start c:\pfad\zur\plink.exe -pw Passwort nutzer@ip sudo pm-suspend

wobei man bei sowas dann lieber von Linux aus einen Ping an das gerät sendet, welches online ist.

Wenn das gerät ja nicht erreichbar ist, dann wirst du dort auch nichts abschlaten können, aber das ist ja deine Sache
;)

Gruß
Chris

brachte mich auf alle Fälle weiter. Nun sieht das Script so aus und funktioniert face-smile
start plink.exe -pw Passwort nutzer@ip sudo pm-suspend
timeout /t 3
taskkill /IM plink.exe
:Loop
ping -n 1 ip
if %errorlevel% == 1 exit
goto :loop