1 (изменено: root2, 2012-09-01 01:30:46)

Тема: CMD/BAT: Как сделать, чтобы скрипт игнорировал не нужные ответы Ping

Здравствуйте, помогите переделать скрипт.

@Echo Off
Set IP=77.88.21.3
Set Timeout=20

Set i=0
:Back
If %i% GEQ %Timeout% (Echo Результат отрицательный - Done&Exit /B 1)
Ping -n 1 -w 400 %IP% 2>nul|Find "TTL=">nul&&(
    Echo Результат положительный - Alive&Exit /B 0
)||(
    Set /A i+=1
    Ping -n 2 -w 1000 127.0.0.1>nul
    GoTo Back
)

набираю ping 124.0.1.1

Обмен пакетами с 124.0.1.1 по 32 байт:

Превышен интервал ожидания для запроса.

если появится это сообщение тогда сразу выводить "Результат отрицательный - Done"

а если

Обмен пакетами с 124.0.1.1 по 32 байт:

Заданный узел не доступен.

тогда нужно что-бы если в течении 20 сек Заданный узел не доступен - тогда нужно вывести это сообщение на экран.

ну а если пинг удачный тогда сразу выводить "Результат положительный - Alive"

Помогите переписать, буду вам очень признателен.

2 (изменено: Rumata, 2012-09-01 06:22:01)

Re: CMD/BAT: Как сделать, чтобы скрипт игнорировал не нужные ответы Ping

root2
Попробуйте этот рецепт. У меня не локализованная версия, поэтому замените значения следующим переменным на соответствующие сообщения в Вашей системе:

checkip_msg_unknown - часть строки вывода о неизвестном имени хоста (это наверно избыточно, но лишним не будет)
checkip_msg_timeout - часть строки вывода о превышении лимита ожидания
checkip_msg_unreach - часть строки вывода о недоступности узла


@echo off


setlocal enabledelayedexpansion


set checkip_msg_unknown=could not find
set checkip_msg_timeout=timed out
set checkip_msg_unreach=transmit failed


set checkip_ip=%~1
if not defined checkip_ip (
	echo.Usage: %~n0 IP [timeout]
	goto :EOF
)


set /a checkip_sleep=%~2+0 2>nul
if !checkip_sleep! leq 0 set checkip_sleep=20


:checkip_again

for /f "tokens=*" %%t in (
	'ping -n 1 -w 400 %checkip_ip%'
) do (

	echo."%%t" | find "%checkip_msg_unknown%">nul && (
		echo.NOT FOUND
		exit /b 1
	)

	echo."%%t" | find "%checkip_msg_timeout%">nul && (
		echo.DOWN
		exit /b 1
	)

	echo."%%t" | find "%checkip_msg_unreach%">nul && (
		echo.%%t
		timeout /t !checkip_sleep! >nul
		goto checkip_again
	)

)

echo.ALIVE
( 2 * b ) || ! ( 2 * b )

3

Re: CMD/BAT: Как сделать, чтобы скрипт игнорировал не нужные ответы Ping

Я так понимаю Вы меня не так поняли.

Нужно следующее.

Всё на примерах.

=========================
Например я в консоле ввожу ping 192.168.0.1 (Комп вкл.)

пошли ответы

Ответ от 192.168.0.1: число байт=32 время<1мс TTL=128

тогда нужно что бы скрипт моментально выводил на экран сообщение что интернет есть.

=========================

далее

опять же например я в консоле ввожу ping 192.168.0.1 (Комп выкл.)

пошли ответы

Превышен интервал ожидания для запроса.

тогда нужно что бы скрипт  моментально выводил на экран сообщение что интернета нет.

==========================

опять же далее

Например я в консоле ввожу ping 192.168.0.1 (Комп вкл.)

пошли ответы

Заданный узел недоступен.

вот тут ВНИМАТЕЛЬНЕЕ - тогда нужно что бы скрипт выводил на экран сообщение только через 20 сек что Заданный узел недоступен.

p.s выводит он это сообщение если адаптер отключен и мне нужно что-бы он это сообщение игнорировал 20 сек а если по истечению 20 сек адаптер не вкл. тогда выводить это сообщение Заданный узел недоступен. а если за эти 20 сек его включили тогда другие сообщения "моментальные", либо есть интернет, либо нету.
==========================

4

Re: CMD/BAT: Как сделать, чтобы скрипт игнорировал не нужные ответы Ping

root2 пишет:

Я так понимаю Вы меня не так поняли.

Мне кажется я Вас понял правильно. Скрипт именно это и делает. Но у меня Windows "нерусская", она все сообщения на английском выводит. А что именно выводит "русская" Windows я не знаю. В скрипте найдите вот эти три строчки и измените - после знака равно подставьте правильные, например,
set checkip_msg_timeout=Превышен интервал ожидания для запроса:

set checkip_msg_unknown=could not find
set checkip_msg_timeout=timed out
set checkip_msg_unreach=transmit failed
root2 пишет:

вот тут ВНИМАТЕЛЬНЕЕ

Здесь я согласен. Реализация другая. Однако меня смущает тот факт, что Ваш алгоритм требует 20 сек задержку. То есть в течение 20 сек скрипт ничего не выводит и просто ждет? Мне кажется, что ожидание при отсутствии вывода нехороший вариант. Как Вы считаете?

( 2 * b ) || ! ( 2 * b )

5

Re: CMD/BAT: Как сделать, чтобы скрипт игнорировал не нужные ответы Ping

ping -n 1 -w 20000 124.0.1.1 || echo куйня какаято

Я конечно далек от мысли... (с)

6

Re: CMD/BAT: Как сделать, чтобы скрипт игнорировал не нужные ответы Ping

а можно сделать-же что бы если Заданный узел недоступен. то что-бы скрипт проверял снова и снова.. пока не будет ответа, либо Превышен интервал ожидания для запроса - Это у нас интернета нет, либо Ответ от 192.168.0.1: число байт=32 время<1мс TTL=128 - Это у нас интернет есть.

7

Re: CMD/BAT: Как сделать, чтобы скрипт игнорировал не нужные ответы Ping

Rumata, не понимаю чёт, создаю ярлык, там ввожу, C:\check.bat 192.168.0.1 , нажимаю на ярлык и скрипт мельком открывается и закрывается.

checkip_msg_unknown - часть строки вывода о неизвестном имени хоста (это наверно избыточно, но лишним не будет)
checkip_msg_timeout - часть строки вывода о превышении лимита ожидания
checkip_msg_unreach - часть строки вывода о недоступности узла

вот мои строки

set checkip_msg_unknown=Ответ
set checkip_msg_timeout=Превышен
set checkip_msg_unreach=Заданный

8

Re: CMD/BAT: Как сделать, чтобы скрипт игнорировал не нужные ответы Ping

root2 пишет:

нажимаю на ярлык и скрипт мельком открывается и закрывается

запустите из командной строки и посмотрите ответы

( 2 * b ) || ! ( 2 * b )

9 (изменено: root2, 2012-09-02 16:16:48)

Re: CMD/BAT: Как сделать, чтобы скрипт игнорировал не нужные ответы Ping

C:\Documents and Settings\Admin>ping 192.168.0.1

Обмен пакетами с 192.168.0.1 по 32 байт:

Превышен интервал ожидания для запроса.

==================================

C:\Documents and Settings\Admin>ping 192.168.0.1

Обмен пакетами с 192.168.0.1 по 32 байт:

Заданный узел недоступен.

===================================

C:\Documents and Settings\Admin>ping 192.168.0.1

Обмен пакетами с 192.168.0.1 по 32 байт:

Ответ от 192.168.0.1: число байт=32 время<1мс TTL=128

10 (изменено: root2, 2012-09-02 16:43:11)

Re: CMD/BAT: Как сделать, чтобы скрипт игнорировал не нужные ответы Ping

Не доступный адрес
C:\>das.cmd 192.168.0.1
DOWN

доступный локальный
C:\>das.cmd 127.0.0.1
NOT FOUND

C:\>das.cmd 77.88.21.3 Доступный адрес в интернете
DOWN

11

Re: CMD/BAT: Как сделать, чтобы скрипт игнорировал не нужные ответы Ping

ещё пишет что timeout не является командой и.т.д

12 (изменено: root2, 2012-09-02 16:58:31)

Re: CMD/BAT: Как сделать, чтобы скрипт игнорировал не нужные ответы Ping

а если выключить сетевой адаптер тогда пишет

C:\>das.cmd 77.88.21.3 Доступный адрес в интернете
ALIVE

13

Re: CMD/BAT: Как сделать, чтобы скрипт игнорировал не нужные ответы Ping

В общем вот что у меня получилось, работает как надо.

Rumata - просто разобрался в вашем скрипте, когда и какие сообщения он выдаёт.

Вывод, теперь если выкл адаптер он будет всё время проверять пока не будет активных сообщений, когда адаптер вкл. тогда он сразуже проверит наличие интернета и выдаст ответ либо есть, либо нету

ну и вот он

:: Проверка интернета, с защитой от ложных срабатываний.

:back

setlocal enabledelayedexpansion
 
set checkip_msg_1=Превышен интервал
set checkip_msg_2=Ответ от
 
set checkip_ip=192.168.0.1
if not defined checkip_ip (
    echo.Usage: %~n0 IP [timeout]
    goto :EOF
)
 
for /f "tokens=*" %%t in (
    'ping %checkip_ip% -n 1 -w 400'
) do (

    echo."%%t" | find "%checkip_msg_1%">nul && (
        msg * Интернета нету
        exit /b 1
    )
    echo."%%t" | find "%checkip_msg_2%">nul && (
        msg * Интернет есть
        exit /b 1
    )
)

GoTo :back

14

Re: CMD/BAT: Как сделать, чтобы скрипт игнорировал не нужные ответы Ping

рано я обрадовался, теперь такая беда, и всю консоль мне загадило этим сообщением

Достигнут уровень рекурсии, максимально возможный для команды SETLOCAL.
Достигнут уровень рекурсии, максимально возможный для команды SETLOCAL.
Достигнут уровень рекурсии, максимально возможный для команды SETLOCAL.
Достигнут уровень рекурсии, максимально возможный для команды SETLOCAL.
Достигнут уровень рекурсии, максимально возможный для команды SETLOCAL.
Достигнут уровень рекурсии, максимально возможный для команды SETLOCAL.
Достигнут уровень рекурсии, максимально возможный для команды SETLOCAL.
Достигнут уровень рекурсии, максимально возможный для команды SETLOCAL.

15

Re: CMD/BAT: Как сделать, чтобы скрипт игнорировал не нужные ответы Ping

root2 пишет:

:back setlocal enabledelayedexpansion

поменяйте местами эти строки

:back

setlocal enabledelayedexpansion
( 2 * b ) || ! ( 2 * b )

16

Re: CMD/BAT: Как сделать, чтобы скрипт игнорировал не нужные ответы Ping

так ну и с этим разобрался, нужно просто перед GoTo :back вставить EndLocal

17

Re: CMD/BAT: Как сделать, чтобы скрипт игнорировал не нужные ответы Ping

root2 пишет:

ещё пишет что timeout не является командой

Видимо Вы работаете на WinXP. Там такой команды действительно нет.

( 2 * b ) || ! ( 2 * b )

18

Re: CMD/BAT: Как сделать, чтобы скрипт игнорировал не нужные ответы Ping

теперь если у кого есть предложения по упрощению и оптимизации скрипта, что-бы было поменьше строк ну и выполнял что-бы всё так-же

19 (изменено: root2, 2012-09-02 17:41:49)

Re: CMD/BAT: Как сделать, чтобы скрипт игнорировал не нужные ответы Ping

Rumata пишет:
root2 пишет:

:back setlocal enabledelayedexpansion

поменяйте местами эти строки

:back

setlocal enabledelayedexpansion

я бы с радостью да вот только правильно выполняться он не будет... т.к вызывается он от команды... а эта команда переходит на метку
:back
а всё что выше просто не прочитает.

20

Re: CMD/BAT: Как сделать, чтобы скрипт игнорировал не нужные ответы Ping

Rumata пишет:
root2 пишет:

ещё пишет что timeout не является командой

Видимо Вы работаете на WinXP. Там такой команды действительно нет.

вы правы

21

Re: CMD/BAT: Как сделать, чтобы скрипт игнорировал не нужные ответы Ping

Rumata, спасибо вам огромное...



root2 пишет:

теперь если у кого есть предложения по упрощению и оптимизации скрипта, что-бы было поменьше строк ну и выполнял что-бы всё так-же

22

Re: CMD/BAT: Как сделать, чтобы скрипт игнорировал не нужные ответы Ping

root2 пишет:

В общем вот что у меня получилось, работает как надо.

Rumata - просто разобрался в вашем скрипте, когда и какие сообщения он выдаёт.

Вывод, теперь если выкл адаптер он будет всё время проверять пока не будет активных сообщений, когда адаптер вкл. тогда он сразуже проверит наличие интернета и выдаст ответ либо есть, либо нету

ну и вот он

:: Проверка интернета, с защитой от ложных срабатываний.

:back

setlocal enabledelayedexpansion
 
set checkip_msg_1=Превышен интервал
set checkip_msg_2=Ответ от
 
set checkip_ip=192.168.0.1
if not defined checkip_ip (
    echo.Usage: %~n0 IP [timeout]
    goto :EOF
)
 
for /f "tokens=*" %%t in (
    'ping %checkip_ip% -n 1 -w 400'
) do (

    echo."%%t" | find "%checkip_msg_1%">nul && (
        msg * Интернета нету
        exit /b 1
    )
    echo."%%t" | find "%checkip_msg_2%">nul && (
        msg * Интернет есть
        exit /b 1
    )
)

GoTo :back

лишнее.

if not defined checkip_ip (
    echo.Usage: %~n0 IP [timeout]
    goto :EOF

23

Re: CMD/BAT: Как сделать, чтобы скрипт игнорировал не нужные ответы Ping

в общем на этом я остановился.

:: Проверка интернета, с защитой от ложных срабатываний.
:sendmsg

setlocal enabledelayedexpansion
 
for /f "tokens=*" %%t in ('ping %CheckInetIpAddr% -n 2 -w 500') do (
    echo."%%t" | find "Ответ">nul && (
    echo WScript.Echo "&#9562;эЄхЁэхЄ ЁрсюЄрхЄ." >"%WinDir%\temp\msgint.vbs" && start /B "" "%WinDir%\temp\msgint.vbs"
        exit /b 1
    )
    echo."%%t" | find "Превышен">nul && (
    echo WScript.Echo "&#9562;эЄхЁэхЄ эх ЁрсюЄрхЄ." >"%WinDir%\temp\msgint.vbs" && start /B "" "%WinDir%\temp\msgint.vbs"
        exit /b 1
    )
)

EndLocal
GoTo :sendmsg

24

Re: CMD/BAT: Как сделать, чтобы скрипт игнорировал не нужные ответы Ping

Спасибо всем кто участвовал в решении моей проблемы.

25

Re: CMD/BAT: Как сделать, чтобы скрипт игнорировал не нужные ответы Ping

Rumata,

А можно ли сделать что бы проверка была не по словам которые проверяет find а например по кодам EROORLEVEL

:TestMsgInt

setlocal enabledelayedexpansion
 
for /f %%t in ('ping 87.250.250.3 -n 2 -w 500') do (
    echo."%%t" | find "Ответ">nul && (
    echo WScript.Echo "&#9562;эЄхЁэхЄ ЁрсюЄрхЄ." >"%WinDir%\temp\msgint.vbs" && start /B "" "%WinDir%\temp\msgint.vbs"
        exit /b 1
    )
    echo."%%t" | find "Превышен">nul && (
    echo WScript.Echo "&#9562;эЄхЁэхЄ эх ЁрсюЄрхЄ." >"%WinDir%\temp\msgint.vbs" && start /B "" "%WinDir%\temp\msgint.vbs"
        exit /b 1
    )
    echo."%%t" | find "Заданный">nul && (
    EndLocal
    GoTo :TestMsgInt
    )
    echo."%%t" | find "При">nul && (
    EndLocal
    GoTo :TestMsgInt
    )
)

26

Re: CMD/BAT: Как сделать, чтобы скрипт игнорировал не нужные ответы Ping

Просто ведь если например я этот скрипт захочу в англ версии винды запустить мне же ведь каждый раз придётся менять значение find на англ.

27

Re: CMD/BAT: Как сделать, чтобы скрипт игнорировал не нужные ответы Ping

root2 пишет:

что бы проверка была <...> по кодам EROORLEVEL

Проверьте возвращаемые коды ответов команды PING.EXE в разных случаях. Скорее всего вы не сможете отличить варианты "хост недоступен" и "сеть недоступна".

( 2 * b ) || ! ( 2 * b )