Hola a todos,
Me gustaría que me ayudaseis a crear un batch para hacer ping y almacenar los resultados. Hasta ahora lo que he conseguido hacer es:
@echo off
setlocal
for /F "delims=" %%i in ('ping google.es -t') do echo %date% %time% %%i 1>> output.txt
Que al finalizar almacena los resultados en un documento TXT de salida.
Pero lo que me gustaría conseguir es una utilidad que vaya haciendo un ping solo cada 5 o 10 seg y almacene los datos en un TXT únicamente cuando se pierda un paquete, con la hora y la fecha correspondiente y en ese mismo momento, sin tener que finalizar la ejecución.
¿Sería posible?
Gracias.
Quizas esto te sirva:
@ECHO OFF
SET /P numero=¨Numero de segundos entre cada ping?
:Ciclo
SET prueba=
ping localhost -n %numero% >nul
(ping google.es
echo %DATE% %TIME%)>1.txt
FOR /F "tokens=*" %%A IN ('findstr /N " (0% perdidos)," 1.txt') DO (SET prueba=%%A)
IF NOT "%prueba%"=="" (GOTO Ciclo)
FOR /F "tokens=*" %%B IN ('TYPE 1.txt') DO (SET fecha=%%B)
echo Paquete perdido
echo Paquete perdido %fecha%>>"Paquetes perdidos.txt"
GOTO Ciclo
Gracias por la ayuda, Meine programmen.
Lo he probado, pero tras introducir el numero de segundos y generarse el fichero 1.txt, me da el error de la sintaxis del comando no es correcta, y se cierra directamente.
¿Dónde puede estar el problema?
Creo (Y solo creo) que ya lo arregle
@ECHO OFF
setlocal enabledelayedexpansion
SET /P numero=¨Numero de segundos entre cada ping?
:Ciclo
SET prueba=
ping localhost -n %numero% >nul
(ping google.es
echo %DATE% %TIME%)>1.txt
find /C /I "(0%% perdidos" "1.txt">2.txt
FOR /F "tokens=*" %%A IN ('TYPE 2.txt') DO (SET prueba=!prueba!%%A)
SET prueba=%prueba:---------- 1.TXT:=%
SET prueba=%prueba: =%
IF NOT "%prueba%"=="0" (GOTO Ciclo)
FOR /F "tokens=*" %%B IN ('TYPE 1.txt') DO (SET fecha=%%B)
echo Paquete perdido
echo Paquete perdido %fecha%>>"Paquetes perdidos.txt"
GOTO Ciclo
Cuando no hay paquetes perdidos funciona como deberia.
Hola,
Ya lo he probado y funciona correctamente, es justo lo que quería.
Gracias por la ayuda prestada.
Una cuestión: ¿por que en la instrucción find se busca "(0%% perdidos"? Me refiero al doble signo de porcentaje.
Utiliso el Batch de Meine programmen pero no me guarda los resultados? es porque no hay problema y ningún paquete se pierde?
Saludos.
yo estuve haciendo algo similar XD termine haciendolo en C y al final luego de una semana tenia una masa de 300.000 lineas que no pude analizar XD
si consigo el exe te lo publico aqui
Cita de: terrateck en 19 Junio 2013, 01:06 AM
Una cuestión: ¿por que en la instrucción find se busca "(0%% perdidos"? Me refiero al doble signo de porcentaje.
Desde cmd el comando si que llevaria solo un signo %, pero en un .bat tienes que poner dos para que funcione. Con el comando FOR pasa lo mismo. No se exactamente por qué, pero es así.
aquí está
https://mega.co.nz/#!udQhzbIJ!MWfyeSP4ttCjbNdZ3EL8xClyVlp01-c_yRi_4dEo-jA
(https://mega.co.nz/#!udQhzbIJ!MWfyeSP4ttCjbNdZ3EL8xClyVlp01-c_yRi_4dEo-jA)
el crea en la carpeta donde se ejecute un archivo llamado ping.txt con la info en el formato
2013-06-19 10:47AM. - Respuesta desde 201.248.76.20: bytes=32 tiempo=20ms TTL=59
si lo ejecutas
ping.exe -t 3
se hará ping cada 3 segundos (o los segundos que establescas luego de "-t") si no especificas nada, hará ping cada 1 segundo (sumado a la espera del ping, me dio pereza corregir eso)
si el ping falla puede decir que "tiempo de espera agotado" o simplemente dejarlo en blanco si el host lo da inaccesible... (tambien me dio pereza corregir eso)
hace ping contra google.com por si a las dudas...
el continua escribiendo el archivo donde lo dejó si lo cierras... espero te sea útil
Cita de: Royca3 en 19 Junio 2013, 01:49 AM
Utiliso el Batch de Meine programmen pero no me guarda los resultados? es porque no hay problema y ningún paquete se pierde?
Saludos.
Efectivamente si no hay ningún problema con la conexión no te generará ningún resultado. Prueba a deshabilitar la conexión a la red mientras se ejecuta y así podrás comprobar que guarda los resultados en el fichero paquetesperdidos.txt.
Cita de: Meine programmen en 19 Junio 2013, 10:18 AM
Desde cmd el comando si que llevaria solo un signo %, pero en un .bat tienes que poner dos para que funcione. Con el comando FOR pasa lo mismo. No se exactamente por qué, pero es así.
Es curioso, gracias por la información.
Cita de: engelx en 19 Junio 2013, 10:19 AM
aquí está
https://mega.co.nz/#!udQhzbIJ!MWfyeSP4ttCjbNdZ3EL8xClyVlp01-c_yRi_4dEo-jA
(https://mega.co.nz/#!udQhzbIJ!MWfyeSP4ttCjbNdZ3EL8xClyVlp01-c_yRi_4dEo-jA)
el crea en la carpeta donde se ejecute un archivo llamado ping.txt con la info en el formato
2013-06-19 10:47AM. - Respuesta desde 201.248.76.20: bytes=32 tiempo=20ms TTL=59
si lo ejecutas
ping.exe -t 3
se hará ping cada 3 segundos (o los segundos que establescas luego de "-t") si no especificas nada, hará ping cada 1 segundo (sumado a la espera del ping, me dio pereza corregir eso)
si el ping falla puede decir que "tiempo de espera agotado" o simplemente dejarlo en blanco si el host lo da inaccesible... (tambien me dio pereza corregir eso)
hace ping contra google.com por si a las dudas...
el continua escribiendo el archivo donde lo dejó si lo cierras... espero te sea útil
Gracias engelx. También había pensado hacerlo en C que lo controlo más pero al no ser demasiado complejo pensé que no merecía la pena y esto sería más rápido. De todas formas sería interesante ver como lo implementaste, ¿no tendrás el código por ahí para echarle un vistazo?
Lo suyo es ajustar el tiempo entre pings a la calidad de la conexión, porque sino como dices se te va a llenar el logs de miles de entradas xD.
Yo lo voy a usar porque actualmente tengo microcortes de conexión, y el log del cable router no es demasiado fiable. Estoy intentando que la operadora lo solucione y esto me es de gran ayuda para diagnosticarlo.
no quiero criticas sobre mi codigo XD lo hice rapido y a los golpes
#include <Windows.h>
#include <iostream>
#include <string>
#include <ctime>
#include <fstream>
using namespace std;
//aqui la funcion del pipe
string exec(char* cmd) {
FILE* pipe = popen(cmd, "r");
if (!pipe) return "ERROR";
char buffer[128];
std::string result = "";
while(!feof(pipe)) {
if(fgets(buffer, 128, pipe) != NULL)
result += buffer;
}
pclose(pipe);
return result;
}
int main(int argc, char *argv[])
{
int tiempo = 1;
if(argc==3){
tiempo = atoi(argv[2]);//no captura el "-t" porque en realidad es relleno
}
string a = "";
int b = 0, c = 0;
char bufer[80];
time_t rawtime;
struct tm * timeinfo;
//saca la direccion del exe, la recorta y le pone ping.txt
string path =argv[0];
b = path.find_last_of("/");
path = path.substr(0,b)+ "/ping.txt";
const char *sb = path.c_str() ;
ofstream myfile;
while(1){
a = exec("ping www.google.com -n 1");//abre la llamada
myfile.open (sb,ios::out|ios::app);
//captura la hora
time(&rawtime);
timeinfo=localtime(&rawtime);
strftime (bufer,80,"%F %I:%M%p.",timeinfo);
//arregla el mensaje a mostrar
b = (INT) a.find_first_of("\n")+1;
b = (INT) a.find_first_of("\n",b)+1;
c = (INT) a.find_first_of("\n",b);
a = a.substr(b,c-b);
cout << bufer << " - " << a << "\n";//muestra
myfile << bufer << " - " << a << "\n";//envia a archivo
myfile.close();//cierra por si el programa tiene un fin inesperado en la espera
sleep(tiempo);//espera
}
return 0;
}
recomiendo recompilar XD el anterior codigo tiene un error XD solo hace un ping y dice el mimo resultado siempre! sorry!
@EngelX
La intención es de agradecer, pero te recuerdo que estamos en la sección de Scripting, no en C.
Saludos!
Aquí tienes mi solución, es muy sencillo:
@echo off
Set "URL=www.google.es"
Set "Interval=5" & REM Segundos
set "LogFile=.\Ping.txt"
:PingMe
Set /A "Count+=1"
Echo [+] Haciendo Ping [%Count%]
(
ping "%URL%" | FINDSTR "perdidos.=.0$"
) || (
Echo Paquetes perdidos.
Echo %DATE% %TIME% >> "%LogFile%"
)
Ping "LOCALHOST" -n "%Interval%" 1>NUL | MORE
GoTo :PingMe
Output:
[+] Haciendo Ping [1]
Paquetes: enviados = 4, recibidos = 4, perdidos = 0
[+] Haciendo Ping [2]
Paquetes: enviados = 4, recibidos = 4, perdidos = 0
[+] Haciendo Ping [3]
Paquetes perdidos.
Saludos!
Gracias a todos
Cita de: EleKtro H@cker en 19 Junio 2013, 20:47 PM
@EngelX
La intención es de agradecer, pero te recuerdo que estamos en la sección de Scripting, no en C.
Saludos!
lo se XD solo respondia la peticion de terratek XD
CitarGracias engelx. También había pensado hacerlo en C que lo controlo más pero al no ser demasiado complejo pensé que no merecía la pena y esto sería más rápido. De todas formas sería interesante ver como lo implementaste, ¿no tendrás el código por ahí para echarle un vistazo?
disculpa si desvié el tema :P