Não é possível executar o arquivo em lotes no Server 2012

1

Este site é demais! Estou tentando executar um arquivo .bat simples no Server 2012 que fará ping em outro servidor, filtre todas as linhas, exceto uma, e depois grave em um arquivo para uso posterior (eu quero que esse arquivo seja enviado para algum lugar, mas esse é um projeto para outra discussão!).

Reuni alguns comandos para pesquisar neste fórum e tenho os comandos necessários para fazer isso acontecer. Quando executo esses comandos, um de cada vez, no ms-dos, ele funciona. No entanto, quando colocá-los todos em um arquivo bat, algo fica bagunçado. Eu não tenho muita experiência com o sistema operacional do servidor, então poderia ser algo simples que estou sentindo falta. Qualquer ajuda seria apreciada.

Aqui estão minhas instruções

ping 10.18.89.154 >C:\pinglog.txt
FOR /F "skip=8 delims=" %i in (C:\pinglog.txt) do @echo %i >C:\TEMP.TXT
SET /P SHOW= < C:\TEMP.TXT
ECHO %SHOW% >C:\pinglog.txt

E aqui está o resultado quando executado manualmente:

Pacotes: enviados = 4, recebidos = 4, perdidos = 0 (perda de 0%),

Mas quando executo esses comandos em um arquivo em lotes, a janela do cmd trava na primeira linha, mostra o texto abaixo na janela do cmd e produz um arquivo em branco ...

C: \ Usuários \ administrador.WSI \ Documentos> ping 10.18.89.154 1> C: \ pinglog.txt

Alguma ideia?

Clay Whitenack
fonte

Respostas:

1

Não é possível executar o arquivo em lotes no Server 2012

Aqui está uma maneira muito mais simples de fazer o que você deseja (em um comando de uma linha):

ping 10.18.89.154 | findstr "Packets" > c:\pinglog.txt

O comando acima funcionará como está na linha de comando ou em um arquivo em lotes.

O arquivo em lotes a seguir usa google.com como destino de ping, pois não consigo executar ping em algo na sua rede com um endereço IP privado.

test.cmd:

ping www.google.com | findstr "Packets" > pinglog.txt

saída de exemplo:

C:\test>test

C:\test>ping www.google.com   | findstr "Packets"  1>pinglog.txt

C:\test>type pinglog.txt
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),

C:\test>

Para usar seus comandos originais, no for /fcomando você precisa substituir %por %%:

FOR /F "skip=8 delims=" %%i in (C:\pinglog.txt) do @echo %%i >C:\TEMP.TXT

Existe uma maneira de isolar os valores nessa linha ou você só pode produzir a linha inteira?

O motivo pelo qual desejei recuperar apenas o valor "recebido" é que, se esse arquivo for "0", eu poderia disparar um alerta com base nisso.

O arquivo em lotes a seguir encontrará o valor de "Recebido" e exibirá "Falha no Ping" se esse valor for 0, caso contrário, ele não produzirá nada.

Como bônus, ele não usa nenhum arquivo.

Você pode substituir echo "Ping failed"por seu comando de alerta quando decidir o que deve ser.

test.cmd:

@echo off
for /f "usebackq skip=8 tokens=7" %%i in (`ping 10.18.89.154`) do (
   set _result=%%i
   goto :done
   )
:done
if "%_result:~0,1%"=="0" echo "Ping failed"

Leitura adicional

%%parameterUm parâmetro substituível: em um arquivo em lotes, use %%G(na linha de comandos %G)

DavidPostill
fonte
0

Eu tive o mesmo problema descrito na pergunta original. Não encontrei respostas. Finalmente, resolvi o problema criando um atalho para o arquivo em lotes. Ao iniciar o arquivo em lotes a partir de um atalho, o arquivo é executado conforme o esperado. Caso contrário, ele fica na primeira linha.

user2832948
fonte
Com base no que você escreveu, acho que você não teve o mesmo problema que a pergunta original. Isso lidou com a sintaxe e sua pergunta não indica uma solução de solução de problemas de sintaxe. Leia as perguntas com atenção e verifique se você tem algo a acrescentar à conversa antes de postar.
music2myear
Isso faz parte da pergunta original: "Quando executo esses comandos um de cada vez no ms-dos, ele funciona. Mas quando executo esses comandos em um arquivo em lotes, a janela do cmd fica na primeira linha, mostra o texto abaixo na janela do cmd e produz um arquivo em branco ... "Esse é exatamente o problema que enfrentei e resolvi conforme indicado na minha postagem original. O problema que acabei de citar não foi solucionado.
user2832948
Adicionar essas informações ao seu post de resposta tornaria mais clara a forma como elas se encaixam nesse contexto.
music2myear
Além disso, quando OP usa a palavra "travar", eles não estão usando o termo correto. Quando você executa um comando PING e o envia para texto, nada é gravado no terminal enquanto o comando está em execução, pois você redirecionou toda a saída para o arquivo de texto designado. Isso dá a aparência de um travamento, mas nada está realmente travando. Está apenas trabalhando em segundo plano. Você obterá esse comportamento com qualquer comando que leve tempo para executar cuja saída você redireciona. Pode haver travamentos reais (o programa encontrou um erro que não pode ser manipulado), mas o OP não estava descrevendo um travamento, simplesmente um comportamento inesperado.
music2myear