Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Ping раз в минуту (http://forum.oszone.net/showthread.php?t=170285)

krumane 15-03-2010 23:57 1369543

Ping раз в минуту
 
помогите в написании batch файла для одинарного запроса pingа раз в минуту в течении 9 часов

Anonymоus 24-03-2010 22:26 1376426

Держи. Как ты и просил, раз в минуту пингует одиночным запросом удаленный компьютер. Для работы нужна консольная версия утилиты NirCmd (nc.exe) В начале устанавливаешь переменные - подставь нужные тебе числа. От себя добавил счетчик пингов и количество оставшегося до завершения времени. Если не секрет, для чего тебе такой скрипт?

Код:

@echo off
rem Установка общего времени работы (в минутах)
set time=540
rem Установка интервала срабатывания (в минутах)
set frequency=1
rem Установка IP
set ip=127.0.0.1

rem Перевод величин из минут в милисекунды и ввод поправки на продолжительность одиночного пинга
set /A time_ms=time*60000
set /A fq_ms=frequency*60000-2000

set /A remain=time_ms
:loop
rem Цикл пинга с убывающим счетчиком времени
set /A remain=remain-fq_ms
if %remain% LEQ 0 goto :EOF
set /A c_ping=c_ping+1
ping -n 1 %ip%>nul
set /A r_tmm=remain/60000+1
set /A r_tmh=r_tmm/60
cls
echo Пинг ^#%c_ping%. Осталось: %r_tmm% минут (%r_tmh% часов)
nc wait %fq_ms%
goto loop


zonderz 25-03-2010 00:27 1376485

krumane

сравните:
примерный код в делфи:


Код:

...
var i: integer;
Timer1.Interval:= 60;
i:=0;
procedure Timer1.Timer;
begin
  if i = 60*9 then Terminate;
  inc(i);
  WinExec(Pchar(ping 127.0.0.1), SW_SHOW);
end;

:) В autoIt тоже легко

Busla 25-03-2010 17:21 1377007

слов нет, одни эмоции:
ping -n 360 -w 60000 узел

romero 25-03-2010 17:33 1377021

2Busla
Цитата:

слов нет, одни эмоции:
ping -n 360 -w 60000 узел
вот вот...
читайте хелп внимательнее товарисч Busla

NiOl 30-03-2010 17:07 1380766

В декабре я кому-то писал похожий скриптик. Смысл такой, что узел пингуется время-от времени (по-дефолту каждые 10 сек), работает на бэкграунде и кидает в лог время, когда узел был недоступен. Есть несколько ключей для запуска и краткий хелп по ним. Дефолтные значения также легко редактируются.
Из минусов - несколько одновременных запусков могут привести к вываливанию с ошибкой.
Код:

@Echo off
SetLocal EnableExtensions
rem SetLocal EnableDelayedExpansion

rem Флаг подпроцесса. Устанавливается в режиме Multi. Запуск батника с параметром "." запрещен!
if "%1"=="." Goto Once

set Name=%~dpn0
set Ext=%~x0

rem Значения "по-умолчанию"

set IP=ya.ru
set Wait=10
set LogFile=%Name%.txt

set Log=SingleLog
rem set Log=MultiLog

rem set Mode=Once
set Mode=Multi


rem Чтение и обработка параметров. Порядок любой, возможны повторы.
:ParamChk
cls
rem Инфа для сообщения о неправильном параметре. Если все ОК, то инфа пропадет.
if "%1"=="" Goto %Mode%
Echo Error! Wrong Parameter!
Echo.
Echo Use: %Name% [/W nnn] [/IP addr] [/O] [/i] [/S] [/M]
Echo.
Echo  /W - Wait for nnn Seconds between Tests
Echo  /IP - Destination Address (IP or FQDN). * If Address FQDN (like ya.ru) - Test can fail on DNS
Echo  /O or /I - Instance: Once or Infinite (use TaskManager to Break CMD service)
Echo  /S or /M - LogFile Name: Single (ChkNet.txt) or Multi (Based on Date, Ex: ChkNet_2009-12-23.txt)
Goto P%1

:P/W
if not "%2"=="" set Wait=%2
shift & shift & goto ParamChk

:P/IP
if not "%2"=="" set IP=%2
shift & shift & goto ParamChk

:P/O
set Mode=Once
shift & goto ParamChk

:P/I
set Mode=Multi
shift & goto ParamChk

:P/S
set Log=SingleLog
shift & goto ParamChk

:P/M
set Log=MultiLog
shift & goto ParamChk


:Once
rem дата/время в виде yyyy-mm-dd_hh-mm-ss - очень удобно для имен файлов и логов
set tm=%time::=-%
set tm=%date:~6,4%-%date:~3,2%-%date:~0,2%_%tm:~0,-3%
goto %Log%
:MultiLog
set LogFile=%Name%_%tm:~0,10%.txt
:SingleLog
ping -n 1 %IP% >nul
if errorlevel 1 echo %tm%: %IP%>>%LogFile%

if %Mode%==Once exit

ping -n %Wait% 127.0.0.1 >nul
Goto Once

:Multi
start /b /low %Name%%Ext% .


Smith_Wesson 28-04-2011 13:32 1667120

Народ, помогите - есть вот такой примерно, код батника. Т.е. мы пингуем диапазон IP-адрессов (нужно пинговать в цикле)
при достижении определенного числа не пингуемого узла/узлов, записывать его IP в
лог и преустанавливать соединение.
У меня почему-то не отрабатывает If ErrorLevel 1 - т.е.
отрабатывает только по последнему IP-адрессу (если последний IP не пингуется, то нормально, а если предпоследний не пингуется а
последний пигуется, то он пропускается ). Наверное причина в параметре %1.
А If ErrorLevel 0 (set /a cWork=%cWork%+1 && goto :EOF) счётчик меняет, но не
возвращается обратно в цикл Call
Что я тут делаю не так?

Код:

@Echo Off
:PING
Set /a cWork=0
Set /a err=0
For /l %%a In (70,1,76) Do Call :CompWork 10.1.5.%%a
If %err%==30 goto END
If %cWork%==50 goto PING
GoTo :EOF
:CompWork
Echo Ping %1
Ping -n 2 %1 >Nul
If ErrorLevel 0 (set /a cWork=%cWork%+1 && goto :EOF)
If ErrorLevel 1 (set /a err=%err%+1 && goto :EOF)
:END
rasdial people /disconnect
rasdial people admin admin
goto PING


amel27 28-04-2011 18:20 1667251

Цитата:

Цитата Smith_Wesson
If ErrorLevel 0 (set /a cWork=%cWork%+1 && goto :EOF) счётчик меняет, но не
возвращается обратно в цикл Call »

может так?
Код:

If %ErrorLevel%==0 set /a cWork=%cWork%+1 & goto :EOF
If %ErrorLevel%==1 set /a err=%err%+1 & goto :EOF


Smith_Wesson 28-04-2011 18:43 1667259

нет. Не помогает... Я вообще не понимаю, как может отработать goto :EOF если самой метки :EOF в батнике нет!
P.S. батник не мой (нашел в Инете и решил приспособить под свои нужды) - но, не работает...

amel27 29-04-2011 07:04 1667395

Цитата:

Цитата Smith_Wesson
не понимаю, как может отработать goto :EOF если самой метки :EOF в батнике нет! »

"GoTo:EOF" - аналог команды "Exit /B", т.е. он выполняет либо выход из процедуры (после CALL, как это сделано в процедуре :CompWork), либо выход из батника - строка перед меткой :CompWork. Т.е. этот цикл по факту одноразовый - если счетчики err/cWork не наберут заданной величины, производится выход из скрипта, так как 6 адресов явно недостаточно для набора числа 30/50.

P.S. в исходном скрипте была ошибка в строке:
Код:

If ErrorLevel 0 (set /a cWork=%cWork%+1 && goto :EOF)
условие выполняется ВСЕГДА, из справки к IF:
Код:

  ERRORLEVEL число  Условие является истинным, если код возврата последней
                    выполненной программы не меньше указанного числа.


Smith_Wesson 11-05-2011 14:17 1674275

Вот такой вот скриптик - скажем так, более навороченный пингер с анализом отсутствия пингов по удаленным узлам. Дело в том, что машин в сети несколько (скажем так 10, может больше) - все они на usb-модемах PEOPLE_NET (которые имеют свойство периодически подвисать) и тогда спасает только ребут всего системника!
Код:

 
@Echo Off
setlocal enableextensions enabledelayedexpansion
:NEW
Set /a cWork=0
Set /a err=0
Set /a rebut=0
goto PING
:EOF
If %cWork%==5 echo NEW & goto NEW
rem "если два цикла подряд отсутсвуют пинги, переходим к пересозданию подключения"
If %err%==2 goto DIAL

:PING
rem "указываем пингуемый диапазон"
For /l %%a In (70,1,80) Do Ping.exe > nul -n 10 -w 3000 10.1.5.%%a
 
rem "если последний узел не пингуется, либо не пингуется весь диапаон"
If ErrorLevel 1 (set /a err=%err%+1 & goto EOF)
rem "ну, тут всё понятно: увеличиваем счётчик успешных попыток"
If ErrorLevel 0 (set /a cWork=%cWork%+1 & goto EOF)
:DIAL

rasdial people /disconnect
rasdial people admin admin
rem "сбрасываем счётчик ошибок в 0 и увеличиваем счётчик редиала на 1"
Set /a err=0
set /a rebut=%rebut%+1
If %rebut%==4 (echo %rebut% >> logging.log && shutdown.exe -r -t 5)
rem "возвращаемся к началу цикла"
goto EOF
exit



Время: 17:07.

Время: 17:07.
© OSzone.net 2001-