Script em lote para descobrir se um host está ativo ou inativo

Script em lote para descobrir se um host está ativo ou inativo

Preciso escanear vários sistemas na rede dentro da faixa de IP 172.18.xx a 172.25.xx e verificar se cada um deles está ativo ou não, e então despejar o resultado em um arquivo. A seguir está o roteiro:

@echo off
for /L %%x in (18,1,25) do (
    for /L %%y in (1,1,254) do (
        for /L %%z in (1,1,254) do (

    ping -n 1 172.%%x.%%y.%%z | find "Reply" > NUL
    IF NOT ERRORLEVEL 1 (set state=UP) ELSE (set state=DOWN)

    echo 172.%%x.%%y.%%z is %state% >> state.txt
)))

Porém, o resultado conclui que todo sistema está 'UP' mesmo que alguns endereços IP não sejam utilizados.

Algum problema com o roteiro?

Responder1

o problema no seu script era muito estranho em scripts em lote. Para fazer com que as variáveis ​​de ambiente sejam atualizadas dentro de um IF ou FOR, você deve usar setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION and !var!. Se você estiver curioso, o absurdo (o que acontece se você não incluir aquela linha setlocal com !var!) é explicado mais adiante set /?.

setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
for /L %%x in (18,1,25) do (
    for /L %%y in (1,1,254) do (
        for /L %%z in (1,1,254) do (

    ping -n 1 172.%%x.%%y.%%z | find "Reply" > NUL
    IF NOT ERRORLEVEL 1 (set state=UP) ELSE (set state=DOWN)

    echo 172.%%x.%%y.%%z is !state! >> state.txt
)))

E se você quiser apenas os que estão em alta. Experimente isso

setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
for /L %%x in (18,1,25) do (
    for /L %%y in (1,1,254) do (
        for /L %%z in (1,1,254) do (

    ping -n 1 -w 1000 172.%%x.%%y.%%z | find "Reply" > NUL
    IF NOT ERRORLEVEL 1 (
        set state=UP
        echo 172.%%x.%%y.%%z is !state! >> state.txt
    ) ELSE (
        set state=DOWN
    )
)))

Responder2

Eu sugiroespeciarias(Estou sugerindo isso depois de ver sua perguntahttps://networkengineering.stackexchange.com/questions/6993/tool-or-script-for-collecting-network-inventory). Todos os detalhes de que você precisa estão disponíveis na ferramenta de inventário Spiceworks. É mais adequado para o Windows AD, mas também pode ser feito de qualquer maneira.

Responder3

Não sei quantos sistemas você precisa verificar. Encontrei a solução certaaqui.. Se você acha fácil fazer assim, aceite esta resposta...

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

**inclua todos os IPs em testservers.txt

Responder4

Eu usaria uma ferramenta comoScanner IP irritadopara fazer este trabalho. Criar scripts parece inútil quando existem tantas outras ferramentas por aí que podem fazer exatamente a mesma coisa.

informação relacionada