Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 如何使用批处理脚本ping多个服务器并返回IP地址和主机名?_Batch File_Ping - Fatal编程技术网

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

Batch file 如何使用批处理脚本ping多个服务器并返回IP地址和主机名?,batch-file,ping,Batch File,Ping,因此,我只能使用批处理。基本上,服务器主机名都列在一个txt文件中。我使用以下代码ping所有服务器,并在txtfile中显示它们的结果 For /f %%i in (testservers.txt) do ping -n 1 %%i >>pingtest.txt 上面的命令ping了所有服务器。现在,我想在一个单独的文件中输出IP地址和主机名。我该怎么做? 我知道我可以运行for循环来搜索诸如“TTL”之类的词,然后查找第三个令牌(对于IP)和诸如“ping”之类的词来查找第二个

因此,我只能使用批处理。基本上,服务器主机名都列在一个txt文件中。我使用以下代码ping所有服务器,并在txtfile中显示它们的结果

For /f %%i in (testservers.txt) do ping -n 1 %%i >>pingtest.txt
上面的命令ping了所有服务器。现在,我想在一个单独的文件中输出IP地址和主机名。我该怎么做? 我知道我可以运行for循环来搜索诸如“TTL”之类的词,然后查找第三个令牌(对于IP)和诸如“ping”之类的词来查找第二个令牌(主机名)。但我有错误,无法正确显示。我之所以想在不同的文件中输出IP和主机名,是为了列出停机和停机的服务器

如蒙帮助,将不胜感激。:)


编辑:为了避免混淆,想让你们知道有3个不同的文件,testservers.txt有主机名,pingtest.txt有ping结果,和result.txt将具有IP以及主机名,其当前状态为DOWN或UP。

很难通过批处理解析每个主机名和结果的pingtest.txt,因为名称和结果位于不同的行中

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

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

不幸的是,您没有发布自己的代码,以便更正。
无论如何,我有自己的解决方案:

@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地址解析情况:

  • 主机名是主机IP地址
  • 主机IP地址可以从其名称解析
  • 如果无法解析主机IP地址,则将该地址设置为“地址N/A”


    希望这有帮助。

    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%
    
    试试这个

    $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
    

    我编写了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%
        )
    
    @回音

    设置workdir={您的工作目录。例如-C:\work} 设置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%
    )
    

    这非常有效,我只是在ping中添加了-a选项来解决这个问题 主机名。谢谢

    @回音 延迟扩展 设置输出文件=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%
    )
    

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

    脚本接受两个参数:

    • 包含IP或域列表的文件
    • 输出文件
    script.bat listofurls.txt output.txt


    这应该有助于整洁,但这不会提取IP地址,这需要解析ping而不是将其重定向到
    nul
    +无论如何,+1-我喜欢它。代码依赖于语言。除英语外,它还必须更改。你认为有法语/德语/荷兰语版本的
    ping
    ?绝对有!有德语、葡萄牙语、法语和波兰语的样本输出。非常感谢。很抱歉,我不能发布我的代码,因为它有一些属于该公司的东西。不能到处张贴。但尽管如此,我所做的只是有两个单独的for循环来提取IP和主机名,但我无法进行“向上”和“向下”检查,因为它是两个不同的for循环。@EitanT,它是否处理来自192.168.2.1的
    回复:无法访问目标主机。
    ?您的脚本在bash中。问题是关于批处理的。@EitanT,这不是Bash,这是Powershell。@Suncatcher我纠正了。尽管如此,问题的要求只是批量的……请解释你的答案是如何解决问题的,它将帮助每个人更清楚地理解你的解决方案,并供将来参考。
    @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!
    )