6

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

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

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

帮助将不胜感激。:)

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

4

8 回答 8

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 地址可以从其名称解析。

如果无法解析主机 IP 地址,则将该地址设置为“ADDRESS N/A”。

希望这可以帮助。

于 2012-09-13T17:34:24.517 回答
4

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

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

>result.txt (
  for /f %%i in (testservers.txt) do ping -n 1 %%i >nul && echo %%i UP||echo %%i DOWN
)
于 2012-09-13T16:20:41.447 回答
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
于 2014-02-27T22:37:22.107 回答
0

我处理了 Eitan-T 之前给出的代码,并重新设计以输出到 CSV 文件。发现早期代码中的结果并不总是给出正确的值,所以我改进了它。

测试服务器.txt

SOMESERVER
DUDSERVER

结果.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%
    )
于 2015-01-12T23:57:42.010 回答
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%
于 2013-03-14T19:34:29.283 回答
0

@echo 关闭

set 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%
)
于 2016-04-01T18:16:14.947 回答
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!
)
于 2018-04-19T15:13:50.207 回答
0

这很好用,我只是在 ping 中添加了 -a 选项来解析主机名。谢谢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%
)
于 2016-08-12T18:50:27.417 回答