用于检查服务器是否在线的批处理脚本

时间:2014-05-17 16:54:53

标签: windows batch-file networking network-programming ping

我基本上想要一个Windows批处理脚本,它通过一个服务器列表,并检查每个服务器是否在线ping。 服务器列表应该是一个简单的纯文本文件,看起来像这样:

...
"Google" www.google.com
"Node1" 221.12.123.1
"Download Server" dl.myserver.com
"Login Server" login.myserver.com
...

这是一个简单的纲要,程序应该做什么:

  1. 将列表中所有服务器的描述列表打印到屏幕上。
  2. ping第一台服务器服务器4次,如果一次ping成功,如果所有4次ping失败,它应该返回在线状态,它应该离线。
  3. 在打印列表中第一台服务器旁边的在线或离线打印
  4. 对列表中的所有其他服务器运行步骤2和3。
  5. 输出应如下所示:

    ...
    Google: online
    Stackoverflow: online
    Node1: online
    Download Server: offline
    Login server: offline
    ...
    

    我只是想知道在(windows)批处理中是否可以实现这一点以及如何做到这一点。如果批量不可能,我应该使用什么编程语言?是否可以用Python编程?

    如果有人可以发布代码如何执行此操作,我也非常感谢,谢谢!

2 个答案:

答案 0 :(得分:3)

@echo off

    setlocal enableextensions enabledelayedexpansion

    for /f usebackq^ tokens^=1^,2^ delims^=^" %%a in ("servers.txt") do (
        call :isOnline %%b && set "status=online" || set "status=offline"
        echo %%a : !status!
    )

    endlocal

    exit /b

:isOnline address
    setlocal enableextensions disabledelayedexpansion

    :: a temporary file is needed to capture ping output for later processing
    set "tempFile=%temp%\%~nx0.%random%.tmp"

    :: ping the indicated address and get errorlevel
    ping -w 1000 -n 4 %~1 > "%tempFile%"  && set "pingError=" || set "pingError=1"

    :: When pinging, 
    ::
    :: we get errorlevel = 1 when
    ::    ipv4 - when any packet is lost. It is necessary to check for "TTL="
    ::           string in the output of the ping command.
    ::    ipv6 - when all packet are lost.
    :: we get errorlevel = 0 when
    ::    ipv4 - all packets received. But pinging a inactive host on the  
    ::           same subnet result in no packet lost. It is necessary to 
    ::           check for "TTL=" string in the output of the ping command.
    ::    ipv6 - at least one packet reaches the host.
    ::
    ::                          +--------------+-------------+
    ::                          | TTL= present |    No TTL   | 
    ::  +-----------------------+--------------+-------------+
    ::  | ipv4    errorlevel 0  |      OK      |    ERROR    |
    ::  |         errorlevel 1  |      OK      |    ERROR    | 
    ::  +-----------------------+--------------+-------------+ 
    ::  | ipv6    errorlevel 0  |              |      OK     |
    ::  |         errorlevel 1  |              |    ERROR    |
    ::  +-----------------------+----------------------------+
    ::
    :: So, if TTL= is present in output, host is online. If errorlevel is 0 
    :: and the address is ipv6 then host is online. In the rest of the cases
    :: the host is offline.    
    ::
    :: To determine the ip version, a regular expresion to match a ipv6 
    :: address is used with findstr. As it will be only tested in the case 
    :: of no errorlevel, the ip address should be present in the output of
    :: ping command.

    set "exitCode=1"
    find "TTL=" "%tempFile%" >nul 2>nul && set "exitCode=0" || (
        if not defined pingError (
            findstr /r /c:" [a-f0-9:][a-f0-9]*:[a-f0-9:%%]*[a-f0-9]: " "%tempFile%" >nul 2>nul  && set "exitCode=0"
        )
    )

    :: cleanup and return errorlevel
    if exist "%tempFile%" del /q "%tempFile%" >nul 2>nul 
    endlocal & exit /b %exitCode%

答案 1 :(得分:1)

这可以在批处理中轻松完成,您只需要一些for /f循环,echo语句,if语句,goto / call语句并使用ping命令。

  

1.将列表中所有服务器的描述列表打印到   屏幕。

您可以使用echo语句,例如echo "Google" www.google.com

  2.如果一个ping成功,应该将第一台服务器服务器ping 4次   如果所有4次ping失败则返回在线状态,它应该离线返回。

for /f循环内[如for /f "tokens=5 delims==, " %%p in (],您可以使用ping命令,其中包含4个特征ping -n 4 www.google.com

  

3.打印列表中第一台服务器旁边的在线或离线打印

你可以在这里使用和if statemenet,例如:if "%status%"=="online" echo Google: onlineecho Google: %status%

  

4.运行列表中所有其他服务器的步骤2和3。

您可以在此处使用gotocall语句(将其用作函数),例如:call :server_status_function www.google.com