Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
vinicius_vianna

.BAT para verificar se host está ativo

Recommended Posts

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vou dar um chute aqui: quando voce ping -n 1 192.168.1.201 > nul quando o host não é encontrado ele não gera um erro..  ele só não consegue achar o servidor...

 

para testar isso.. coloque um parametro que não existe e veja se não é capturado.. por que ai sim é um erro

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • Autor do tópico
  • 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

     

    Compartilhar este post


    Link para o post
    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. 

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • 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

    Compartilhar este post


    Link para o post
    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

     

     

    Compartilhar este post


    Link para o post
    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.

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • 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!

    Compartilhar este post


    Link para o post
    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.

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • @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

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • Postado (editado)

    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

    Editado por vinicius_vianna
    • Curtir 3

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Crie uma conta ou entre para comentar

    Você precisar ser um membro para fazer um comentário






    Sobre o Clube do Hardware

    No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

    ×