eccos01
Goto Top

Batch-Skripting - Erreichbarkeit von IP-Adressen (ping)

Hallo,

ich habe ein Problem...
ich will die Erreichbarkeit einer Adresse (Ip-Adresse oder Name - LAN und WAN) in einem Batch-Skript überprüfen und abhängig vom Ergebnis etwas tun...

Eigentlich wollte ich mit PING und ERRORLEVEL arbeiten, aber bei folgendem Beispiel bekomme ich unterschiedliche Ergebnisse...

Skript:
ping  -n 1 -w 1000 -l 1000 172.16.100.139
if ERRORLEVEL 1 (
   echo ping 172.16.100.139: NOT OK
) else (
   echo ping 172.16.100.139: OK
)

Und mal bekomme ich OK und mal bekomme ich NOT OK!

Dies ist abhängig vom Output des ping...
- antwortet ping folgendermaßen erhalte ich OK:

Ping wird ausgeführt für 192.169.100.139 mit 1000 Bytes Daten:

Zeitüberschreitung der Anforderung.
Ping-Statistik für 172.16.100.139:
Pakete: Gesendet = 1, Empfangen = 0, Verloren = 1 (100% Verlust),

- antwortet ping aber so... erhalte ich OK:
Ping wird ausgeführt für 192.169.100.139 mit 1000 Bytes Daten:

Antwort von 62.24.12.197: Zielhost nicht erreichbar.
Ping-Statistik für 172.16.100.139:
Pakete: Gesendet = 1, Empfangen = 1, Verloren = 0 (0% Verlust),
Ca. Zeitangaben in Millisek.:
Minimum = 0ms, Maximum = 0ms, Mittelwert = 0ms

Weiß jemand wieso ping mal so und mal so antwortet und dementsprechend den ERRORLEVEL unterschiedlich besetzt?
Wie kann ich denn die Erreichbarkeit wirklich 100 % korrekt auswerten?

Content-ID: 165721

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

Ausgedruckt am: 22.11.2024 um 22:11 Uhr

TsukiSan
TsukiSan 05.05.2011 um 15:44:49 Uhr
Goto Top
hallo eccos01,

nur mal was zum Spielen:
@ECHO off

cls

SET ip=172.16.100.
SET log=ips.txt

IF EXIST %log% DEL %log% && ECHO Datei wurde gelöscht
IF EXIST %log% NEQ 0 ECHO Datei konnte nicht gelöscht werden! & GOTO :eof

FOR /L %%i IN (0,1,255) DO (
 	ping -n 1 -w 5 %ip%%%i|find "TTL=" && ECHO %ip%%%i >> %log% || echo %ip%%%i nicht erreichbar  
)

Falls es aber bei einer vermeintlich permanenten Verbindung ständig zu Ungereimtheiten kommt - also mal da und mal nicht - dann liegt es mit Sicherheit nicht an der Batch face-wink

Gruss
Tsuki
micneu
micneu 05.05.2011 um 16:10:30 Uhr
Goto Top
hier habe ich in powershell geschrieben

## ----------------------------------------------------------------------------
## Script Name: 	        ping-test.ps1
## CreationDate: 	05.05.2011
## Last Modified: 
## Copyright: 		M.N. (c)2011
## Purpose: 			
## 			einmal auf der powershell ausgeführen 
##     "Set-ExecutionPolicy Unrestricted"  
## ----------------------------------------------------------------------------

function timepost() {
    $gelaufenezeit_STD = ($stop - $start).TotalHours
    $gelaufenezeit_MIN = ($stop - $start).TotalMinutes
    $gelaufenezeit_SEK = ($stop - $start).TotalSeconds
    
    echo $gelaufenezeit_SEK
    If ($gelaufenezeit_SEK -ge 3600) {        
        [int]$MINUTEN = ($gelaufenezeit_SEK / 3600)        
        $MINUTEN_REST = ($gelaufenezeit_SEK - ([int]$MINUTEN*3600))
        $MINUTEN_REST = ($MINUTEN_REST / 60)        
        $MINSEK = "Std."  
        'Auftrag nach {0:0},{1:0} {2} erledigt....' -f [int]$gelaufenezeit_STD, $MINUTEN_REST, $MINSEK  
        }
    ElseIf ($gelaufenezeit_SEK -ge 60){
        [int]$SEKUNDEN = ($gelaufenezeit_SEK / 60)        
        $SEKUNDEN_REST = ($gelaufenezeit_SEK - ([int]$SEKUNDEN*60))        
        $MINSEK = "Min."  
        'Auftrag nach {0:0},{1:0} {2} erledigt....' -f $gelaufenezeit_MIN, $SEKUNDEN_REST, $MINSEK  
        }
    Else {
        $MINSEK = "Sek."  
        'Auftrag nach {0:0} {1} erledigt....' -f $gelaufenezeit_SEK, $MINSEK  
        }
    
    #'Auftrag nach {0:0.00} {1} erledigt....' -f $gelaufenezeit, $MINSEK  
    }

$start = Get-Date
echo "Programm ist am laufen seit: $start"  
echo "Start Zeit: $start" > .\ping.log  
while ($true) {
    $ausgabe = ping -n 1000 192.168.181.100
    echo $ausgabe
    if ($ausgabe -like "Zeitüberschreitung der Anforderung.") {          
        $stop = Get-Date
        echo "Fehler Zeit: $stop" >> .\ping.log  
        break 
        }
}
        
timepost >> .\ping.log
timepost
gruß michael
eccos01
eccos01 05.05.2011 um 17:34:22 Uhr
Goto Top
Um es klar zu stellen... die obige IP-Adresse ist nur ein Beispiel für eine nicht erreichbare Adresse... in diesem Beispiel ist sie in einem anderen Subnetz... und sie es existiert auch im gesamten LAN nicht.

Das heißt, daß sie zu keinem Zeitpunkt erreichbar wäre. Dennoch kommen zwei verschiedene Ergebnisse und sobald die Antwort "Antwort von" enthält, ist der ERRORLEVEL = 0.

Ach ja... und es sollte ein reines Batch-Skipt sein... und universell einsetzbar (das heißt unabhängig von der Windows Version (XP, Vista, 7, 2003, 2008) und von der Sprache (deutsch, englisch, frz)).
eccos01
eccos01 05.05.2011 um 17:36:22 Uhr
Goto Top
hallo Michael,

erst einmal Danke für das Skript.

Allerdings benötige ich nur eine Aussage, ob diese Adresse zum aktuellen zeitpunkt erreichbar und ggf. der Name auflösbar ist.

Nur sollte das Ergebnis verlässlich sein!
Biber
Biber 05.05.2011 um 19:45:21 Uhr
Goto Top
Moin eccos01,

Zitat von @eccos01:
Ach ja... und es sollte ein reines Batch-Skipt sein... und universell einsetzbar (das heißt unabhängig von der Windows
Version (XP, Vista, 7, 2003, 2008) und von der Sprache (deutsch, englisch, frz)).

Dann so [als Demo amCMD-Prompt]
>for %i in ( 172.16.100.129 xx.yyy.112.zzz localhost) do @ping  -n 1 -w 1000 -l 1000 %i |find "TTL">nul && echo ok %i ||@echo !! %i nicht erreichbar.
!! 172.16.100.129 nicht erreichbar.
ok xx.yyy.112.zzz
ok localhost
Die xx.yyy.112.zzz war natürlich eine echte IP, ist nur anonymisiert.

"TTL" sollte es in jeder noch so internationalen Ping-Ausgabe geben, ausgenommen da wo T-Mo wohnt.

Grüße
Biber
traller
traller 21.02.2012 um 18:59:24 Uhr
Goto Top
Hallo,
ich wollte das noch mal aus der Versenkung holen.
Wenn ich nun folgendes habe:
ping 192.168.0.30 -n 1 -w 1000 -l 2000
if %ERRORLEVEL%==1 (
echo ping 192.168.0.30: NOT OK!
) else (
echo ping 192.168.0.30: OK!
)

das soll für windows 7 sein.
irgendwie kommt die Batch bei mir in eine Endlosschleife und nix richtiges gibt der dann aus. was mache ich falsch?
Biber
Biber 21.02.2012 um 19:04:11 Uhr
Goto Top
Moin trailer,

benenne die Batchdatei um von "ping.bat" oder "ping.cmd" in "ichbineinsupercoder.cmd".

Dann funktioniert es.

Grüße
Biber
traller
traller 21.02.2012 um 19:24:21 Uhr
Goto Top
Zitat von @Biber:
Moin trailer,

benenne die Batchdatei um von "ping.bat" oder "ping.cmd" in "ichbineinsupercoder.cmd".

Dann funktioniert es.

Grüße
Biber

Hallo,
leider geht es dadurch immer noch nicht. Datei ist hier: http://www.dateiupload.com/files/2V4vyu4uCo.cmd ist da irgendwo ein Tippfehler drin?

hoppla, hatte deinen satz falsch gelesen, is ok geht nun.
Leonie04
Leonie04 06.01.2016 um 14:26:27 Uhr
Goto Top
Hallo,
was mir fehlt ist die Möglichkeit, dass nur die Ping Aussetzer protokolliert werden. Denn so ist das Ergebnis doch immer sehr unübersichtlich und wenn nur die Problemfälle protokolliert werden, dann wäre es doch besser.

Ein Beispiel liefert Michael mit seinem Ping Test.bat. (http://www.windows-faq.de/2015/10/21/netzwerkprobleme-feststellen-nur-p ..)

Vielleicht könnte mal die verschiedenen Möglchkeiten kombinieren?

VG
Leonie