如何使用批处理脚本ping多个服务器并返回IP地址和主机名?

时间:2012-09-13 14:32:46

标签: batch-file ping

所以我必须使用仅批量。基本上,服务器HOSTNAMES都列在txt文件中。我使用以下代码ping所有服务器并在txtfile中显示其结果。

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

以上针对所有服务器。现在,我想在一个单独的文件中输出IP地址和主机名。我怎样才能做到这一点? 我知道我可以运行for循环搜索“TTL”之类的单词,然后查找第三个标记(对于IP)和第二个标记(HOSTNAME)的“PINGING”等单词。但我有错误,无法正确显示它。我想在不同的文件中输出IP和主机名的原因是为了列出DOWN和UP服务器。

帮助将不胜感激。 :)

编辑:就这样它不会让人困惑,想让你们知道有3个不同的文件,testservers.txt里面有HOSTNAMES,pingtest.txt有ping结果,而result.txt会有IP主机名的当前状态为DOWN或UP。

8 个答案:

答案 0 :(得分:19)

嗯,很不幸的是你也没有发布自己的代码,因此可以纠正。
无论如何,这是我自己的解决方案:

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

外部循环遍历主机,内部循环解析ping输出。前两个if语句处理IP地址解析的两种可能情况:

  1. 主机名是主机IP地址。
  2. 可以从名称中解析主机IP地址。
  3. 如果无法解析主机IP地址,则地址设置为“ADDRESS N / A”。

    希望这有帮助。

答案 1 :(得分:4)

解析每个HOST名称和批处理结果的pingtest.txt很困难,因为名称和结果在不同的行上。

直接测试每个PING命令的结果(返回的错误代码)而不是重定向到文件要容易得多。将整个构造包含在parens中并将最终输出重定向一次也更有效。

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

答案 2 :(得分:0)

ping的问题是如果主机不活动,你的本地机器会返回ping主机不可用的答案,因此ping的错误代码为0,你的代码将运行错误,因为没有识别出状态。

最好这样做

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

这样你就可以找到一个典型的字符串ttl,它总是在做得好的ping结果中检查这个findstr的错误而不是刺激ping

整体看起来像这样:

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

答案 3 :(得分:0)

试试这个

$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

答案 4 :(得分:0)

我研究了Eitan-T早先给出的代码并重新输出到CSV文件。发现早期代码中的结果并不总是给出正确的值,所以我已经改进了它。

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

答案 5 :(得分:0)

@echo off

设置workdir = {你的工作目录。例如 - 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%
)

答案 6 :(得分:0)

这很好用我只需添加-a选项来ping解决问题 主机名。谢谢https://stackoverflow.com/users/4447323/wombat

@echo off     setlocal enabledelayedexpansion     设置OUTPUT_FILE = result.csv

getInstallerPackageName()

答案 7 :(得分:0)

这适用于西班牙语操作系统。

脚本接受两个参数:

  • 包含IP或域列表的文件
  • 输出文件
  

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!
)