2012-09-13 10 views
5

Quindi devo utilizzare il lotto solo per. Fondamentalmente, i server HOSTNAMES sono tutti elencati in un file txt. Ho usato il seguente codice per eseguire il ping di tutti i server e visualizzare i risultati in un file txt.Come eseguire il ping di più server e restituire l'indirizzo IP e i nomi host utilizzando lo script batch?

For /f %%i in (testservers.txt) do ping -n 1 %%i >>pingtest.txt 

Quanto sopra ha fatto il ping su tutti i server. Ora, voglio generare gli indirizzi IP e i nomi HOST in un file separato. Come posso fare questo? So che posso eseguire un ciclo for alla ricerca di parole come "TTL" e quindi cercare il 3 token (per l'IP) e parole come "PINGING" per il secondo token (HOSTNAME). Ma sto avendo degli errori e non posso visualizzarlo correttamente. Il motivo per cui voglio produrre IP e nomi host in un file diverso è creare un elenco dei server DOWN e UP.

L'aiuto sarà apprezzato. :)

EDIT: Basta quindi non è fonte di confusione, ha voluto farvi sapere ci sono 3 diversi file, testservers.txt ha i nomi degli host in esso, pingtest.txt ha risultati ping, e result.txt avrà gli IP insieme ai nomi host con il loro stato corrente come GIÙ o SU.

+0

http://stackoverflow.com/questions/3050898/how-to-check-if-ping-responded-or -not-in-a-batch-file dovrebbe aiutarti – SeanC

risposta

19

Beh, è ​​un peccato che non si è posta il suo codice di troppo, in modo che potesse essere corretto.
Comunque, ecco la mia soluzione a questo:

@echo off 
setlocal enabledelayedexpansion 

set OUTPUT_FILE=result.txt 
>nul copy nul %OUTPUT_FILE% 
for /f %%i in (testservers.txt) do (
    set SERVER_ADDRESS=ADDRESS N/A 
    for /f "tokens=1,2,3" %%x in ('ping -n 1 %%i ^&^& echo SERVER_IS_UP') do (
     if %%x==Pinging set SERVER_ADDRESS=%%y 
     if %%x==Reply set SERVER_ADDRESS=%%z 
     if %%x==SERVER_IS_UP (set SERVER_STATE=UP) else (set SERVER_STATE=DOWN) 
    ) 
    echo %%i [!SERVER_ADDRESS::=!] is !SERVER_STATE! >>%OUTPUT_FILE% 
) 

I ciclo esterno itera attraverso i padroni di casa e il ciclo interno analizza i ping uscita. Le prime due istruzioni if gestiscono i due possibili casi di risoluzione dell'indirizzo IP:

  1. Il nome host è l'indirizzo IP dell'host.
  2. L'indirizzo IP dell'host può essere risolto dal suo nome.

Se l'indirizzo IP dell'host non può essere risolto, l'indirizzo è impostato su "INDIRIZZO N/A".

Spero che questo aiuti.

+0

+1 - Mi piace. Il codice dipende dalla lingua. Dovrà cambiare per le lingue diverse dall'inglese. – dbenham

+0

Pensi che ci sia una versione francese/tedesca/olandese di 'ping'? –

+2

Assolutamente! [Questo thread] (https://www.itefix.no/i2/content/problem-checkwinpingexe) ha un esempio di output per tedesco, portoghese, francese? E polacco? – dbenham

4

L'analisi di pingtest.txt per ogni nome HOST e il risultato con batch è difficile perché il nome e il risultato si trovano su linee diverse.

È molto più semplice testare il risultato (il codice di errore restituito) di ciascun comando PING direttamente anziché reindirizzare a un file. È anche più efficiente racchiudere l'intero costrutto in Parens e reindirizzare l'output finale solo una volta.

>result.txt (
    for /f %%i in (testservers.txt) do ping -n 1 %%i >nul && echo %%i UP||echo %%i DOWN 
) 
+0

Neat, ma questo non estrae l'indirizzo IP, che richiede l'analisi del ping invece di reindirizzarlo a 'nul'. +1 comunque. –

+1

+1 Molto elegante. –

0

il problema con ping è se l'host non è vivo spesso la macchina locale restituirà una risposta che l'host ping non è disponibile, quindi il codice di errore del ping sarà 0 e il codice verrà eseguito in errore perché non riconosce il giù di stato.

meglio farlo in questo modo

ping -n 4 %1 | findstr TTL 
if %errorlevel%==0 (goto :eof) else (goto :error) 

questo modo si cerca una tipica TTL stringa che è sempre nel risultato ping ben fatto e di controllo degli errori in questa findstr invece di irritante ping

nel complesso questo assomiglia a questo:

@echo off 
SetLocal 


set log=path/to/logfile.txt 
set check=path/to/checkfile.txt 

:start 
echo. some echo date >>%log% 

:check 
for /f %%r in (%check%) do (call :ping %%r) 
goto :eof 

:ping 
ping -n 4 %1 | findstr TTL 
if %errorlevel%==0 (goto :eof) else (goto :error) 

:error 
echo. some errormessage to >>%log% 
echo. some blat to mail? 

:eof 
echo. some good message to >>%log% 
0

Prova questa

$servers = Get-Content test.txt 

$reg="" 

foreach ($server in $servers) 

{ 

$reg=$reg+$server+"`t"+([System.Net.Dns]::GetHostAddresses($server) | foreach {echo $_.IPAddressToString})+"`n" 

} 
$reg >reg.csv 
+0

Lo script è in bash. La domanda riguarda * lotto *. –

+0

@EitanT, non è Bash, è Powershell. – Suncatcher

+0

@Suncatcher I sta corretti. Eppure, il requisito della domanda è solo batch ... –

0

Ho lavorato sul codice fornito in precedenza da Eitan-T e rielaborato per l'output in file CSV. Ho trovato che i risultati nel codice precedente non davano sempre i valori corretti, quindi l'ho migliorato.

testservers.txt

SOMESERVER 
DUDSERVER 

results.csv

HOSTNAME LONGNAME     IPADDRESS STATE 
SOMESERVER SOMESERVER.DOMAIN.SUF  10.1.1.1 UP 
DUDSERVER UNRESOLVED     UNRESOLVED DOWN 

Pingtest.bat

@echo off 
    setlocal enabledelayedexpansion 
    set OUTPUT_FILE=result.csv 

    >nul copy nul %OUTPUT_FILE% 
    echo HOSTNAME,LONGNAME,IPADDRESS,STATE >%OUTPUT_FILE% 
    for /f %%i in (testservers.txt) do (
     set SERVER_ADDRESS_I=UNRESOLVED 
     set SERVER_ADDRESS_L=UNRESOLVED 
     for /f "tokens=1,2,3" %%x in ('ping -n 1 %%i ^&^& echo SERVER_IS_UP') do (
     if %%x==Pinging set SERVER_ADDRESS_L=%%y 
     if %%x==Pinging set SERVER_ADDRESS_I=%%z 
      if %%x==SERVER_IS_UP (set SERVER_STATE=UP) else (set SERVER_STATE=DOWN) 
     ) 
     echo %%i [!SERVER_ADDRESS_L::=!] !SERVER_ADDRESS_I::=! is !SERVER_STATE! 
     echo %%i,!SERVER_ADDRESS_L::=!,!SERVER_ADDRESS_I::=!,!SERVER_STATE! >>%OUTPUT_FILE% 
    ) 
0

@echo off

set workdir = {il tuo dir di lavoro. per esempio - C: \ lavoro} set elenco IPList =% workdir% \ IP-elenco.txt

setlocal enabledelayedexpansion 
set OUTPUT_FILE=%workdir%\result.csv 

>nul copy nul %OUTPUT_FILE% 
echo HOSTNAME,LONGNAME,IPADDRESS,STATE >%OUTPUT_FILE% 
for /f %%i in (%iplist%) do (
    set SERVER_ADDRESS_I=UNRESOLVED 
    set SERVER_ADDRESS_L=UNRESOLVED 
    for /f "tokens=1,2,3" %%x in ('ping -a -n 1 %%i ^&^& echo SERVER_IS_UP') do (
    if %%x==Pinging set SERVER_ADDRESS_L=%%y 
    if %%x==Pinging set SERVER_ADDRESS_I=%%z 
     if %%x==SERVER_IS_UP (set SERVER_STATE=UP) else (set SERVER_STATE=DOWN) 
    ) 
    echo %%i [!SERVER_ADDRESS_L::=!] !SERVER_ADDRESS_I::=! is !SERVER_STATE! 
    echo %%i,!SERVER_ADDRESS_L::=!,!SERVER_ADDRESS_I::=!,!SERVER_STATE! >>%OUTPUT_FILE% 
) 
+0

Spiega come la tua risposta risolve il problema, aiuterà tutti a capire la tua soluzione con maggiore chiarezza e per riferimento futuro. – Aziz

0

Ciò ha funzionato grande Ho solo aggiungere l'opzione -a per eseguire il ping per risolvere il nome host. Grazie https://stackoverflow.com/users/4447323/wombat

@echo off setlocal enabledelayedexpansion set output_file = Result.csv

>nul copy nul %OUTPUT_FILE% 
echo HOSTNAME,LONGNAME,IPADDRESS,STATE >%OUTPUT_FILE% 
for /f %%i in (testservers.txt) do (
    set SERVER_ADDRESS_I=UNRESOLVED 
    set SERVER_ADDRESS_L=UNRESOLVED 
    for /f "tokens=1,2,3" %%x in ('ping -n 1 -a %%i ^&^& echo SERVER_IS_UP') do (
    if %%x==Pinging set SERVER_ADDRESS_L=%%y 
    if %%x==Pinging set SERVER_ADDRESS_I=%%z 
     if %%x==SERVER_IS_UP (set SERVER_STATE=UP) else (set SERVER_STATE=DOWN) 
    ) 
    echo %%i [!SERVER_ADDRESS_L::=!] !SERVER_ADDRESS_I::=! is !SERVER_STATE! 
    echo %%i,!SERVER_ADDRESS_L::=!,!SERVER_ADDRESS_I::=!,!SERVER_STATE! >>%OUTPUT_FILE% 
)