Ir ao conteúdo
  • Cadastre-se

.BAT para verificar se host está ativo


Posts recomendados

Pessoal, boa tarde

 

Estou tentando fazer uma rotina em meu servidor que funcione da seguinte maneira: Ele deve verificar se o host está ligado ou não. Se estiver, monte o compartilhamento, senão passe para a próxima linha

 

Vou tentar descrever o cenário para ficar mais fácil:

 

  1. Tenho um servidor onde armazeno os backups dos hosts;
  2. Todo dia, em um determinado horário, a tarefa monta os compartilhamentos e o robocopy copia os dados dos hosts para o servidor.

 

Tentei com o seguinte código, mas ao que parece não funcionou, pois ele entra e tenta executar o que está dentro do IF, mesmo a condição estando errada para tal

 

@echo off

ping -n 1 192.168.1.201 > nul

if %errorlevel% == 1 (
	
	REM echo "HOST ATIVO"

	net use z: \\192.168.1.201\d

	echo Set oShell = CreateObject("Shell.Application") >> c:\Users\%username%\Drive_Rename.vbs
	echo oShell.NameSpace("Z:\").Self.Name = "Sala Anexa" >> c:\Users\%username%\Drive_Rename.vbs 

	CD C:\Users\%username%\
	Drive_Rename.vbs /f

	del c:\Users\%username%\Drive_Rename.vbs
) else (
  echo "HOST DESLIGADO OU INACESSIVEL" 
)

Grato pela ajuda e atenção de todos

Link para o comentário
Compartilhar em outros sites

Oi bngomes

 

Não entendi ao certo o que quer que eu faça (desculpe... sou beeem leigo nisso, rs). Se puder me explicar, com certeza o farei prontamente.

 

Bom... mas o que eu fiz: removi todo o código dentro do IF, deixando somente que ele escreva na tela se o host está ligado. Além disso, alterei para um host que sei que está ligado.

 

  1. Quando coloco o %errorlevel% == 0 ele responde "HOST ATIVO";
  2. Quando coloco o %errorlevel% == 1 ele responde "HOST DESLIGADO OU INACESSIVEL".

 

Posso entender então que, no final das contas, ele não está realizando teste algum? Pois se altero a condição, ele deveria permanecer dizendo que o host está ativo, estou certo?

 

Obrigado pela ajuda

 

Link para o comentário
Compartilhar em outros sites

Eu tambem não sou especialiasta em Bat.. a ultima vez que escrevi um foi no DOS.. rss

 

Eu achei esse codigo na net.. veja se te ajuda 

@echo  off
rem  myprogram.exe  0
set errorlevel=%1
echo errorlevel = %errorlevel%
IF %errorlevel% EQU 1 GOTO ERROR
IF %errorlevel% EQU 0 GOTO OK

:ERROR
ECHO "Program failed, please check this log file for errors ..."
GOTO END

:OK

echo  mynestprogram.exe
:END

repare que no exemplo ele esta setando a variável errolevel com o um valor..  e depois a sintaxe do igual é diferente:

 

Então no seu código.. depois do ping eu daria um echo (pra exibir na tela o errorlevel...

 

e rescreveria o if usando essa sintaxe.. usando um goto. 

Link para o comentário
Compartilhar em outros sites

Opa bngomes... desculpe a demora

 

Segui o que me aconselhou... o código ficou assim então:

 

@echo off

ping -n 1 192.168.1.205

set errorlevel=%1
echo errorlevel = %errorlevel%
IF %errorlevel% EQU 0 GOTO ERROR
IF %errorlevel% EQU 1 GOTO OK

:ERROR

	ECHO "HOST DESLIGADO OU INACESSIVEL"

:OK

	ECHO "HOST LIGADO"

:END

Bom, para testar, fiz com 2 hosts.... o 205 está desligado e o 202 está ligado... o resultado foi o da imagem anexa.

 

Pelo que entendi, em ambos ele está assumindo que a variável errorlevel é 0, como se ambos estivessem ligados, estou certo?

 

Mas, como disse, o host com final 205 está desligado, como pode ver no resultado do ping ao mesmo.

 

Mais alguma ideia ou eu fiz algo de errado no código

 

Muito obrigado pela ajuda e atenção!

 

 

erro2.png

Link para o comentário
Compartilhar em outros sites

Pela que entendi é isso tambem.. por que os dois comandos foram executados e bem sucedidos.. so que em a resposta foi que o host esta inalcançável, mas isso para ele não é um erro (e se você pensar bem não é mesmo)

 

Acho que o errolevel só mudaria para 1 se for um erro de sintaxe. tipo voce digitar ping -x -2 168.192.0.0, por que estaria passando uma opção que o comando ping não tem...

 

Outra coisa... depois do echo em error ou Ok.. você tem que dar o goto end.. senão ele continua para linha de baixo.. e errorlevel 0 é execução ok.. pelo seu código é a execução com erro

 

 

Link para o comentário
Compartilhar em outros sites

O problema é que a variável de ambiente %ERRORLEVEL% recebe 0 mesmo se der "Host inacessível" quando você executa o comando ping...

 

Pelo visto %ERRORLEVEL% tá recebendo apenas o status de que o programa ping foi concluído corretamente, o que é verdade em ambos os casos, pois não importa se o host está acessível ou não.

Link para o comentário
Compartilhar em outros sites

bngomes / isrnick

 

É, a questão é que o ping dá como recebido, mesmo que o host esteja desligado. A própria maquina retorna que não foi possível comunicar com o host.

 

@bngomes Eu tentei com esse parâmetro -x (que não existe para o ping) mas da mesma forma ele responde que o host está ligado. Estou procurando alguma solução pra isso, eventualmente usar mais algum algum parâmetro do ping que nos ajude a identificar se o host está ativo ou não.

 

De toda forma agradeço a ajuda e sim, caso haja mais alguma luz, fiquem a vontade em postar.

 

Obrigado pela ajuda e atenção!

Link para o comentário
Compartilhar em outros sites

A questão é que o programa ping não retorna valores 0 ou 1 para o sistema dependendo do status do IP testado.

Então o problema foi em assumir que ele se comporta dessa maneira.

 

Uma possível solução seria analisar o texto gerado pelo ping para detectar a frase de falha:

 

@ECHO OFF
FOR /F "eol=  skip=2 tokens=2 delims=:" %%A IN ('ping -n 1 192.168.1.205') DO (
    IF "%%A"==" Host de destino inacess¡vel." (
        ECHO "HOST DESLIGADO OU INACESSIVEL"
    ) ELSE (
        ECHO "HOST LIGADO"
    )
)

Obs: O caractere ¡ no arquivo .bat salvo com codificação ANSI, vira o caractere í quando executado no Prompt.

Link para o comentário
Compartilhar em outros sites

@isrnick Cara... acho que chegamos a uma solução, mas com certas ressalvas

 

Usei o código que você postou, mas não sei se por causa da codificação ("escrevi" o script e salvei usando o Sublime Text3) ele estava dando erro ainda. Coloquei a imagem para que você possa ver. Daqui tiramos uma coisa positiva... Windows Server em português é melhor evitar, rs!

 

A solução foi fazer uma pequena alteração no código. Coloquei a condição favorável do IF apontado para o host estando ligado (bytes=32 tempo<1ms TTL=128). Dessa maneira tudo funcionou, e ele identificou qual host estava ligado e qual não

 

Eis como ficou o código alterado:

 

ECHO ON
FOR /F "eol=  skip=2 tokens=2 delims=:" %%A IN ('ping -n 1 192.168.1.202') DO (
    IF "%%A"==" bytes=32 tempo<1ms TTL=128" (
        ECHO "HOST LIGADO"
    ) ELSE (
        ECHO "HOST DESLIGADO OU INACESSIVEL"
    )
)

PS: Só coloquei o ECHO ON para conseguir analisar e trazer a solução aqui.

 

Vou implementar no código do backup e testar. Espero que funcione satisfatoriamente!

 

Muito obrigado pela ajuda e atenção de todos!

erro3.png

solucao.png

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

Bom pessoal, tudo funcionando e conforme prometido, o script "completo" está aqui:

 

@ECHO OFF

ECHO ###################################################
ECHO ####                                           ####
ECHO ####             BACKUP SALA ANEXA             ####
ECHO ####                                           ####
ECHO ###################################################

:MSALA

FOR /F "eol=  skip=2 tokens=2 delims=:" %%A IN ('ping -n 1 192.168.1.201') DO (
    IF "%%A"==" bytes=32 tempo<1ms TTL=128" (
        net use Z: /d /y
    	net use Z: \\192.168.1.201\d
        ECHO "COMPARTILHAMENTO MONTADO COM SUCESSO"
        GOTO :RSALA
    ) ELSE (
        ECHO "IMPOSSIVEL MONTAR O COMPARTILHAMNETO. VERIFIQUE A CONEXAO COM O HOST"
        GOTO :ESALA
    )
)

:RSALA

echo Set oShell = CreateObject("Shell.Application") >> c:\Users\%username%\Drive_Rename.vbs
echo oShell.NameSpace("Z:\").Self.Name = "Sala Anexa" >> c:\Users\%username%\Drive_Rename.vbs 

CD C:\Users\%username%\
Drive_Rename.vbs /f

del c:\Users\%username%\Drive_Rename.vbs
ECHO "COMPARTILHAMENTO RENOMEADO COM SUCESSO - PRONTO PARA BACKUP"
GOTO :BSALA

:ESALA

ECHO "NAO FOI POSSIVEL REALIZAR O BACKUP: A UNIDADE NAO FOI MONTADA - INICIANDO PROXIMO BACKUP"
GOTO :MDANIEL

:BSALA

ECHO "INICIANDO BACKUP SALA ANEXA"

CD  c:\Program Files (x86)\Windows Resource Kits\Tools

robocopy.exe "Z:\AGIE" "F:\Backup Engenharia\Sala_Anexa\BKP\AGIE" /E /R:0 /W:0  /LOG:C:\robocopy\LOG\sala_anexa\sala_anexa-agie.log
ECHO "BACKUP AGIE REALIZADO COM SUCESSO - INICIANDO BACKUP HD Virtual"

robocopy.exe "Z:\HD Virtual" "F:\Backup Engenharia\Sala_Anexa\BKP\HD Virtual" /E /R:0 /W:0  /LOG:C:\robocopy\LOG\sala_anexa\sala_anexa-hd.log
ECHO "BACKUP HD Virtual REALIZADO COM SUCESSO - INICIANDO BACKUP PMCommandXML"

robocopy.exe "Z:\PMCommandXML" "F:\Backup Engenharia\Sala_Anexa\BKP\PMCommandXML" /E /R:0 /W:0  /LOG:C:\robocopy\LOG\sala_anexa\sala_anexa-pmc.log
ECHO "BACKUP PMCommandXML REALIZADO COM SUCESSO - INICIANDO BACKUP PowerMill"

robocopy.exe "Z:\PowerMill" "F:\Backup Engenharia\Sala_Anexa\BKP\PowerMill" /E /R:0 /W:0  /LOG:C:\robocopy\LOG\sala_anexa\sala_anexa-powermill.log
ECHO "BACKUP PowerMill REALIZADO COM SUCESSO - INICIANDO BACKUP Teste"

robocopy.exe "Z:\Teste" "F:\Backup Engenharia\Sala_Anexa\BKP\Teste" /E /R:0 /W:0  /LOG:C:\robocopy\LOG\sala_anexa\sala_anexa-teste.log
ECHO "BACKUP Teste REALIZADO COM SUCESSO - INICIANDO BACKUP Tutorial"

robocopy.exe "Z:\Tutorial" "F:\Backup Engenharia\Sala_Anexa\BKP\Tutorial" /E /R:0 /W:0  /LOG:C:\robocopy\LOG\sala_anexa\sala_anexa-tutorial.log
ECHO "BACKUP Tutorial REALIZADO COM SUCESSO - INICIANDO BACKUP User"

robocopy.exe "Z:\User" "F:\Backup Engenharia\Sala_Anexa\BKP\User" /E /R:0 /W:0  /LOG:C:\robocopy\LOG\sala_anexa\sala_anexa-user.log
ECHO "BACKUP User REALIZADO COM SUCESSO - INICIANDO BACKUP VirtualBox VMs"

robocopy.exe "Z:\VirtualBox VMs" "F:\Backup Engenharia\Sala_Anexa\BKP\VirtualBox VMs" /E /R:0 /W:0  /LOG:C:\robocopy\LOG\sala_anexa\sala_anexa-vbox.log
ECHO "BACKUP SALA ANEXA CONCLUIDO COM EXITO - INICIANDO PROXIMO BACKUP"

GOTO :MDPROG

Não é o completo, pois tem mais alguns hosts nem tampouco o final, pois sempre pode melhorar... mas a ideia geral é essa, para os outros hosts só se altera a letra e as pastas a serem backupeadas. E lógico, se alguém estiver com um problema parecido, pode usar livremente o código.

 

Muito obrigado a todos, em especial ao @bngomes e ao @isrnick pela ajuda e paciência em me ajudar no caminho das pedras, rs!

 

A moderação caso queira, pode fechar o tópico

  • Curtir 3
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...