How to ping multiple servers and return IP address and Hostnames using batch script?

后端 未结 8 1672
余生分开走
余生分开走 2020-12-28 10:45

So I have to use batch only for this. Basically, the server HOSTNAMES are all listed in a txt file. I used the following code to ping all the servers and di

相关标签:
8条回答
  • 2020-12-28 11:21

    the problem with ping is if the host is not alive often your local machine will return an answer that the pinged host is not available, thus the errorcode of ping will be 0 and your code will run in error because not recognizing the down state.

    better do it this way

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

    this way you look for a typical string ttl which is always in the well done ping result and check error on this findstr instead of irritating ping

    overall this looks like this:

    @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 讨论(0)
  • 2020-12-28 11:22

    @echo off

    set workdir={your working dir. for example - 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 讨论(0)
  • 2020-12-28 11:26

    I worked on the code given earlier by Eitan-T and reworked to output to CSV file. Found the results in earlier code weren't always giving correct values as well so i've improved it.

    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 讨论(0)
  • 2020-12-28 11:29

    Well, it's unfortunate that you didn't post your own code too, so that it could be corrected.
    Anyway, here's my own solution to this:

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

    The outer loop iterates through the hosts and the inner loop parses the ping output. The first two if statements handle the two possible cases of IP address resolution:

    1. The host name is the host IP address.
    2. The host IP address can be resolved from its name.

    If the host IP address cannot be resolved, the address is set to "ADDRESS N/A".

    Hope this helps.

    0 讨论(0)
  • 2020-12-28 11:29

    This works for spanish operation system.

    Script accepts two parameters:

    • a file with the list of IP or domains
    • output file

    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 讨论(0)
  • 2020-12-28 11:37

    Parsing pingtest.txt for each HOST name and result with batch is difficult because the name and result are on different lines.

    It is much easier to test the result (the returned error code) of each PING command directly instead of redirecting to a file. It is also more efficient to enclose the entire construct in parens and redirect the final output just once.

    >result.txt (
      for /f %%i in (testservers.txt) do ping -n 1 %%i >nul && echo %%i UP||echo %%i DOWN
    )
    
    0 讨论(0)
提交回复
热议问题