2010-06-16 12 views
35

Voglio ping continuamente un server e vedere una finestra di messaggio ogni volta che risponde che il server è attualmente inattivo. Voglio farlo attraverso il file batch.Come verificare se il ping ha risposto o meno in un file batch

posso mostrare una finestra di messaggio come detto qui Show a popup/message box from a Windows batch file

e possono ping continuo da

ping <servername> -t 

Ma come faccio a verificare se risponde o no?

+0

non è vero in generale offrirti tornato con i byte xx di dati? – Sphvn

+0

Ma stavo chiedendo come controllarlo all'interno di una condizione if in un file batch – IsmailS

+0

Questa domanda è diventata popolare (è stata visualizzata 1000 volte) e non ci sono molti aumenti rispetto alla domanda e alle risposte. Mi fa intuire che i visitatori stanno arrivando in questa pagina per qualcos'altro e non trovandolo qui. In altre parole, immagino che questa pagina sia visualizzata nei risultati di ricerca di alcune parole chiave irrilevanti a questa domanda. Mi chiedo cosa sia qualcos'altro (o parole chiave irrilevanti a questa domanda) e come posso cambiare il titolo di questa domanda in modo che il tempo del visitatore (che si aspetta qualcosa di diverso) venga salvato. – IsmailS

risposta

15

Il seguente programma checklink.cmd è un buon punto di partenza. Essa si basa sul fatto che si può fare un ping colpo singolo e che, in caso di successo, l'uscita conterrà la riga:

Packets: Sent = 1, Received = 1, Lost = 0 (0% loss), 

Estraendo gettoni 5 e 7 e controllando che stanno rispettivamente "Received" e "1,", puoi scoprire il successo.

@setlocal enableextensions enabledelayedexpansion 
@echo off 
set ipaddr=%1 
:loop 
set state=down 
for /f "tokens=5,6,7" %%a in ('ping -n 1 !ipaddr!') do (
    if "x%%b"=="xunreachable." goto :endloop 
    if "x%%a"=="xReceived" if "x%%c"=="x1," set state=up 
) 
:endloop 
echo.Link is !state! 
ping -n 6 127.0.0.1 >nul: 2>nul: 
goto :loop 
endlocal 

Chiamata con il nome (o indirizzo IP) che si desidera verificare:

checklink 127.0.0.1 
checklink localhost 
checklink nosuchaddress 

tener conto che, se le impostazioni internazionali non è l'inglese, è necessario sostituire Received con la parola chiave corrispondente le impostazioni internazionali, ad esempio recibidos per lo spagnolo. Esegui un ping di prova per scoprire quale parola chiave viene utilizzata nelle impostazioni locali.


Per solo una notifica quando lo stato cambia, è possibile utilizzare:

@setlocal enableextensions enabledelayedexpansion 
@echo off 
set ipaddr=%1 
set oldstate=neither 
:loop 
set state=down 
for /f "tokens=5,7" %%a in ('ping -n 1 !ipaddr!') do (
    if "x%%a"=="xReceived" if "x%%b"=="x1," set state=up 
) 
if not !state!==!oldstate! (
    echo.Link is !state! 
    set oldstate=!state! 
) 
ping -n 2 127.0.0.1 >nul: 2>nul: 
goto :loop 
endlocal 

Tuttavia, come sottolinea Gabe in un commento, si può semplicemente utilizzare ERRORLEVEL così l'equivalente di questo secondo script sopra diventa:

@setlocal enableextensions enabledelayedexpansion 
@echo off 
set ipaddr=%1 
set oldstate=neither 
:loop 
set state=up 
ping -n 1 !ipaddr! >nul: 2>nul: 
if not !errorlevel!==0 set state=down 
if not !state!==!oldstate! (
    echo.Link is !state! 
    set oldstate=!state! 
) 
ping -n 2 127.0.0.1 >nul: 2>nul: 
goto :loop 
endlocal 
+0

Grazie v molto @paxdiablo! Potete per favore aiutarmi a modificare questo in modo che possa vedere una finestra di messaggio solo quando il server si alza? Il comando per mostrare la finestra di messaggio è 'msg"% username% "Link is up' e questo comando funziona per me su Windows 7. – IsmailS

+3

Si tratta di un sacco di lavoro che si fa invece di controllare'% ERRORLEVEL% '! – Gabe

+1

Questo è un buon punto, @Gabe, l'ho incorporato nella sceneggiatura. – paxdiablo

0

È possibile eseguire il ping con out "-t" e controlla il codice di uscita del ping. Segnala un errore quando non c'è risposta.

+4

Noi programmatori possiamo leggere e capire il codice più velocemente della lingua inglese;). Solo scherzando. – IsmailS

+2

L'OP probabilmente vuole impostare lo script batch in esecuzione e quindi fare altre cose sulla macchina, solo per essere avvisato in caso di cambio di stato. Non sedersi e guardare ogni risultato di risposta ping. – user66001

21

La domanda era di vedere se il ping rispondeva a questo script.

Tuttavia questo non funzionerà se si ottiene il messaggio Host Unreachable in quanto restituisce ERRORLEVEL 0 e passa il controllo per Received = 1 utilizzato in questo script, restituendo Link è UP dallo script. Host Unreachable si verifica quando il ping è stato consegnato a notwork di destinazione ma l'host remoto non può essere trovato.

Se si richiama il modo corretto per verificare se il ping ha avuto esito positivo è cercare la stringa "TTL" utilizzando Trova.

@echo off 
cls 
set ip=%1 
ping -n 1 %ip% | find "TTL" 
if not errorlevel 1 set error=win 
if errorlevel 1 set error=fail 
cls 
echo Result: %error% 

Non funziona con reti IPv6 perché ping non elenca TTL quando riceve risposta dall'indirizzo IPv6.

+0

Grazie mille :) – IsmailS

+0

Questo mi ha aiutato! Eccezionale! –

0

Versione semplice:

for /F "delims==, tokens=4" %a IN ('ping -n 2 127.0.0.1 ^| findstr /R "^Packets: Sent =.$"') DO (

if %a EQU 2 (
echo Success 
) ELSE (
echo FAIL 
) 

) 

Ma a volte primo ping solo fallire e secondo il lavoro (o viceversa) giusto?Quindi vogliamo avere successo quando almeno una risposta ICMP è stato restituito con successo:

for /F "delims==, tokens=4" %a IN ('ping -n 2 192.168.1.1 ^| findstr /R "^Packets: Sent =.$"') DO (

if %a EQU 2 (
echo Success 
) ELSE (
if %a EQU 1 (
echo Success 
) ELSE (
echo FAIL 
) 
) 

) 
-1

Ho visto tre risultati ad un tavolo da ping - Quello che "vogliamo", dove risponde il PI, "Host irraggiungibile" e "scaduto" (non sicuro dell'espressione esatta).

I primi due ERRORLEVEL di ritorno 0.

Timeout restituisce ERRORLEVEL 1.

sono gli altri risultati e livelli di errore che potrebbero essere restituiti? (Oltre a utilizzare un interruttore non valido che restituisce gli switch consentiti e un errorlevel di 1.)

Apparentemente Host Unreachable può utilizzare uno dei metodi precedentemente pubblicati (anche se è difficile capire quando qualcuno risponde a quale caso stanno scrivendo codice per) ma il timeout viene restituito in modo analogo a quanto può essere analizzato?

In generale, come si fa a sapere quale parte dei risultati del ping può essere analizzata? (Vale a dire, perché potrebbe essere inviato e/o Ricevuto e/o TTL essere analizzabile, ma non host irraggiungibile?

Oh, e iSid, forse non ci sono molti upvotes perché le persone che leggono questo non hanno abbastanza punti . Così ottenere la loro domanda ha risposto (o meno) e lasciare.

non stavo postando quanto sopra come una risposta. Sarebbe dovuto essere un commento, ma non ho visto quella scelta.

+0

C'è un collegamento "aggiungi commento" (blu, tutto in minuscolo, vicino alla riga che separa i post) sotto ogni risposta e la domanda. Si prega di copiare e incollare i commenti sopra in commenti in base alla rispettiva domanda/risposta a cui si applicano. -1 – user66001

1

ho fatto una soluzione variante basata sul post di paxdiablo

Inserire il seguente codice in Waitlink.cmd

@setlocal enableextensions enabledelayedexpansion 
@echo off 
set ipaddr=%1 
:loop 
set state=up 
ping -n 1 !ipaddr! >nul: 2>nul: 
if not !errorlevel!==0 set state=down 
echo.Link is !state! 
if "!state!"=="up" (
    goto :endloop 
) 
ping -n 6 127.0.0.1 >nul: 2>nul: 
goto :loop 
:endloop 
endlocal 

Per esempio lo usano da un altro file batch come questo

call Waitlink someurl.com 
net use o: \\someurl.com\myshare 

La chiamata a waitlink tornerà solo quando un ping era successo. Grazie a paxdiablo e Gabe. Spero che questo aiuti qualcun altro.

4

So che questo è un thread vecchio, ma volevo verificare se una macchina era presente nel mio sistema e, a meno che non abbia frainteso, nessuna delle operazioni precedenti funziona se il mio router segnala che un indirizzo non è raggiungibile. Sto usando un file batch piuttosto che uno script perché volevo "KISS" su praticamente qualsiasi macchina WIN. Quindi l'approccio che ho usato è stato quello di fare più di un ping e di prova per "Lost = 0" come segue

ping -n 2 %pingAddr% | find /I "Lost = 0" 
if %errorlevel% == 0 goto OK 

non ho ancora testato questo rigore ma finora lo fa il lavoro per me

0

Ecco qualcosa che ho trovato:

:pingtheserver 
ping %input% | find "Reply" > nul 
if not errorlevel 1 (
    echo server is online, up and running. 
) else (
    echo host has been taken down wait 3 seconds to refresh 
    ping 1.1.1.1 -n 1 -w 3000 >NUL 
    goto :pingtheserver 
) 

Nota che ping 1.1.1.1 -n -w 1000 >NUL sarà attendere 1 secondo, ma funziona solo quando è collegato a una rete

0

Spero che questo aiuta qualcuno. Io uso questo bit di logica per verificare se le condivisioni di rete sono reattive prima di controllare i singoli percorsi. Dovrebbe gestire nomi DNS e indirizzi IP

Un percorso valido nel file di testo sarebbe \ 192.168.1.2 \ 'cartella' o 'cartella' \ NAS \

@echo off 
title Network Folder Check 

pushd "%~dp0" 
:00 
cls 

for /f "delims=\\" %%A in (Files-to-Check.txt) do set Server=%%A 
    setlocal EnableDelayedExpansion 
     ping -n 1 %Server% | findstr TTL= >nul 
      if %errorlevel%==1 ( 
       ping -n 1 %Server% | findstr "Reply from" | findstr "time" >nul 
        if !errorlevel!==1 (echo Network Asset %Server% Not Found & pause & goto EOF) 
      ) 
:EOF 
-1
#!/bin/bash 
logPath="pinglog.txt" 

while(true) 
     do 
      # refresh the timestamp before each ping attempt 
      theTime=$(date -Iseconds) 

      # refresh the ping variable 
      ping google.com -n 1 

      if [ $? -eq 0 ] 
      then 
       echo $theTime + '| connection is up' >> $logPath 
      else 
       echo $theTime + '| connection is down' >> $logPath 
      fi 
      Sleep 1 
      echo ' ' 
     done 
+0

La domanda riguarda i file batch di Windows non bash – jeb

Problemi correlati