
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.