Como definir uma variável no arquivo em lotes do DOS?

0

Como exibir apenas o status dos resultados de ping e não a saída inteira de ping ?

** My server1 is .... online

** My server2 is .... online

** My server3 is .... offline

Eu tentei isso com o seguinte, mas falhei

@echo off ping My server1|find "Reply from " >NUL 
IF NOT ERRORLEVEL 1 echo Success 
IF     ERRORLEVEL 1 echo Fail

ping My server2|find "Reply from " >NUL 
IF NOT ERRORLEVEL 1 echo Success 
IF     ERRORLEVEL 1 echo Fail

ping My server3|find "Reply from " >NUL 
IF NOT ERRORLEVEL 1 echo Success 
IF     ERRORLEVEL 1 echo Fail

echo My server1 is ....%ver% 
echo My server2 is ....%ver% 
echo My server3 is ....%ver%

Como definir a variável aqui para fazer assim?

    
por Sunath 02.12.2014 / 21:48

2 respostas

2

Você não precisa usar find : o status de sucesso é retornado pelo comando ping : -

ping -c 1 MyServer1>nul:
set stat=on-line
if errorlevel 1 set stat=off-line
echo MyServer1 is %stat%

Você provavelmente desejaria colocar esses comandos em ServerCheck.cmd e usar %1 em vez do MyServer1 explícito, para poder chamá-lo em um loop for (lembre-se de usar call ServerCheck.cmd se o for loop é em si um arquivo de lote).

    
por 02.12.2014 / 22:10
0
@echo off

    setlocal enableextensions disabledelayedexpansion

    if "%~1"=="" goto :eof

    call :isOnline "%~1"
    if not errorlevel 1 ( echo ONLINE ) else ( echo OFFLINE )

    endlocal
    exit /b

:isOnline address pingCount
    setlocal enableextensions disabledelayedexpansion

    :: send only one ping packed unless it is indicated to send more than one
    set /a "pingCount=0", "pingCount+=%~2" >nul 2>nul 
    if %pingCount% lss 1 set "pingCount=1"

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

    :: ping the indicated address getting command output and errorlevel
    ping -w 1000 -n %pingCount% "%~1" > "%tempFile%"  && set "pingError=" || set "pingError=1"

    ::
    :: When pinging, the behaviours of ipv4 and ipv6 are different
    ::
    :: we get errorlevel = 1 when
    ::    ipv4 - when at least one packet is lost. When sending more than one packet
    ::           the easiest way to check for reply is search the string "TTL=" in 
    ::           the output of the command.
    ::    ipv6 - when all packet are lost.
    ::
    :: we get errorlevel = 0 when
    ::    ipv4 - all packets are 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
    ::
    :: We can try to determine if the input address (or host name) will result in 
    :: ipv4 or ipv6 pinging, but it is easier to check the result of the command
    ::
    ::                          +--------------+-------------+
    ::                          | 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 TTL= is not present,  
    :: errorlevel is 0 and the address is ipv6 then host is online. In the rest 
    :: of the cases 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 will be present in ping command output.

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

    :: cleanup and return errorlevel: 0=online , 1=offline 
    endlocal & exit /b %exitCode%
    
por 15.12.2014 / 11:33

Tags