it-swarm.com.de

Wie kann ein Ping an mehrere Server gesendet und IP-Adresse und Hostnamen mithilfe von Batch-Skript zurückgegeben werden?

Also muss ich nur Batch verwenden. Grundsätzlich sind die Server HOSTNAMES alle in einer TXT-Datei aufgelistet. Ich habe den folgenden Code verwendet, um alle Server zu pingen und ihre Ergebnisse in einer Textdatei anzuzeigen. 

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

Das obige pingte alle Server. Nun möchte ich die IP-Adressen und die Hostnamen in einer separaten Datei ausgeben. Wie kann ich das tun? Ich weiß, dass ich eine for-Schleife ausführen kann, um nach Wörtern wie "TTL" zu suchen und dann nach dem dritten Token (für die IP) und Wörtern wie "PINGING" für das zweite Token (HOSTNAME) zu suchen. . Aber ich habe Fehler und kann es nicht richtig anzeigen. Der Grund, warum ich IPs und Hostnamen in einer anderen Datei ausgeben möchte, ist das Erstellen einer Liste der DOWN- und UP-Server. 

Hilfe wird geschätzt. :)

EDIT: Nur so ist es nicht verwirrend. Ich wollte euch wissen lassen, dass es 3 verschiedene Dateien gibt. Testservers.txt enthält die HOSTNAMES, pingtest.txt hat Ping-Ergebnisse und result.txt enthält die IPs zusammen mit Hostnamen ihren aktuellen Status als DOWN oder UP.

6
Gutsygibbon

Nun, es ist bedauerlich, dass Sie keinen eigenen Code gepostet haben, damit er korrigiert werden kann.
Wie auch immer, hier ist meine eigene Lösung dazu:

@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%
)

Die äußere Schleife durchläuft die Hosts und die innere Schleife analysiert die ping-Ausgabe. Die ersten beiden if-Anweisungen behandeln die zwei möglichen Fälle der IP-Adressauflösung:

  1. Der Hostname ist die Host-IP-Adresse.
  2. Die Host-IP-Adresse kann nach ihrem Namen aufgelöst werden.

Wenn die Host-IP-Adresse nicht aufgelöst werden kann, ist die Adresse auf "ADDRESS N/A" gesetzt.

Hoffe das hilft.

19
Eitan T

Das Analysieren von pingtest.txt für jeden Hostnamen und das Ergebnis mit batch ist schwierig, da sich der Name und das Ergebnis in unterschiedlichen Zeilen befinden.

Es ist viel einfacher, das Ergebnis (den zurückgegebenen Fehlercode) jedes PING-Befehls direkt zu testen, anstatt auf eine Datei umzuleiten. Es ist auch effizienter, das gesamte Konstrukt in parens einzuschließen und die endgültige Ausgabe nur einmal umzuleiten.

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

Versuche dies 

$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
Naveen Sharma

Das funktionierte großartig. Ich füge einfach die Option -a zu ping hinzu, um den Hostnamen aufzulösen. Danke https://stackoverflow.com/users/4447323/wombat

@echo aus setlocal enabledelayedexpansion setze 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%
)
0
mkemp

Ich habe an dem von Eitan-T angegebenen Code gearbeitet und die Ausgabe in eine CSV-Datei überarbeitet. Ich habe festgestellt, dass die Ergebnisse in früherem Code nicht immer korrekte Werte angaben. Daher habe ich sie verbessert.

testservers.txt

SOMESERVER
DUDSERVER

ergebnisse.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
Wombat

@echo aus

set workdir = {dein Arbeitsverzeichnis. Beispiel: C:\work} set iplist =% workdir%\IP-list.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
Marcuscus

das Problem mit Ping ist, wenn der Host nicht aktiv ist. Oftmals gibt Ihr lokaler Computer eine Antwort zurück, dass der Ping-Host nicht verfügbar ist. Daher wird der Fehlercode von Ping 0 und der Code wird fehlerhaft ausgeführt, da der Abwärtsstatus nicht erkannt wird.

mach es besser so

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

auf diese Weise suchen Sie nach einem typischen String ttl, der sich immer im durchgeführten Ping-Ergebnis befindet, und überprüfen den Fehler in diesem findstr, anstatt den Ping zu irritieren

insgesamt sieht das so aus:

@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
peet

Dies funktioniert für ein spanisches Betriebssystem.

Skript akzeptiert zwei Parameter:

  • eine Datei mit der Liste der IP-Adressen oder Domänen
  • ausgabedatei

script.bat listofurls.txt output.txt

@echo off
setlocal enabledelayedexpansion
set OUTPUT_FILE=%2
>nul copy nul %OUTPUT_FILE%
for /f %%i in (%1) do (
    set SERVER_ADDRESS=No se pudo resolver el Host
    for /f "tokens=1,2,3,4,5" %%v in ('ping -a -n 1 %%i ^&^& echo SERVER_IS_UP') 
    do (
        if %%v==Haciendo set SERVER_ADDRESS=%%z
        if %%v==Respuesta set SERVER_ADDRESS=%%x
        if %%v==SERVER_IS_UP (set SERVER_STATE=UP) else (set SERVER_STATE=DOWN)
    )
    echo %%i [!SERVER_ADDRESS::=!] is !SERVER_STATE! >>%OUTPUT_FILE%
    echo %%i [!SERVER_ADDRESS::=!] is !SERVER_STATE!
)
0
Pablo Videla