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

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

neogara 12-06-2010 02:08 1432586

При разрыве связи с определенным IP или HOST проиграть звук
 
Помогите создать bat файл который бы следил за определенным соединением (может быть и не одно) и при изменении его статуса или вообще его отсутствия проигрывал звук
Более точнее наверно
У меня задача что при нахождении отличия статуса определенного IP для каждого соединения этого IP и если есть отличия, от заданных, то проиграть звук, а если соединение отсутствует вообще, то опять же проиграть звук
Пробую что-то типа:

Цитата:

title DisconnektSound
set address=нужный IP или HOST
set status=ESTABLISHED
:start
sleep 0
netstat
for /F "tokens=3,4 usebackq" %%i in (`netstat`)do (
set add=%%i
set stat=%%j
)
@echo %add%i%stat%
if %address%==%add% goto start
if not %address%==%add% goto next
goto start
:next
if %status%==%stat% goto start
if not %status%==%stat% goto sound
goto start
:sound
start sound.wav
pause
но не получаеться как надо

neogara 13-06-2010 14:54 1433287

Вот нашел что-то похожее, но не могу догадаться как применить в моем батнике

Код:

wander84:необходимо проверить какой сейчас IP и сравнить его с тем что создался ранее (C:\92.15.67.21). И если:
1) эти IP одинаковы(равны), то ничего не делать.
2) эти IP неодинаковы(неравны), то выполнить bat-файл »

вариант на базе предыдущего:

@Echo Off

Set $PATH=C:
Set $BATN=C:\Batnik.CMD

For /F "Tokens=1 Skip=1 Delims={,} " %%i In ('WMIC NICCONFIG Where Index^=1 Get IPAddress^|FindStr "."') Do Call :ParseIP %%i
For /F %%i In ('DIR /A:-D/B "%$PATH%\*"^|FindStr /XRC:"[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*"') Do Set %%i=X

If Not Defined %$IPAddress% Call "%$BATN%"

EXIT

:ParseIP
 Set $IPAddress=%~1
GoTo :EOF


amel27 13-06-2010 15:09 1433294

neogara, как вариант через NetStat:
Код:

title Disconnect Sound
set addr=IP Address
set stat=ESTABLISHED

:start
ping -n 2 127.0.0.1 >nul
for /f "delims=" %%i in ('netstat -n^|find /i "%addr%:"') do if /i not "%%i"=="%stat%" call :sound
goto start

:sound
start "" /WAIT sound.wav
goto :eof

по поводу скрытого проигрывания звукового файла гляньте тему:
Разное - [решено] Запуск mp3 файла в режиме скрытого процесса

P.S. на один IP может быть несколько соединений с разным состоянием

neogara 13-06-2010 15:25 1433300

А в место ping -n 2 127.0.0.1 >nul паузу можно сделать через sleep?
И еще вопрос если соединение отсутствует будет воспроисводить звук
Просто я так поня в команде for /f "tokens=4" %%i in ('netstat -n^ ищится статус, а далее он подставляется к адресу и если нет совпадения то что тогда????

neogara 13-06-2010 15:51 1433311

Ставлю за ведомо отсутствуещее соединение, а звук так и не проигрывается
и еще я так понял что определяет переменную %%i как статус для find /i "%addr%:" это так?

и еще вопрос что означает значек ^ здесь?

amel27 13-06-2010 16:26 1433336

Цитата:

Цитата neogara
А в место ping -n 2 127.0.0.1 >nul паузу можно сделать через sleep? »

при наличии утилиты sleep.exe, статья: Пауза в пакетном файле

Цитата:

Цитата neogara
Ставлю за ведомо отсутствуещее соединение, а звук так и не проигрывается »

отсутствие соединения и изменение статуса существующего соединения - разные задачи:
Код:

title Disconnect Sound
set addr=IP address
set stat=ESTABLISHED

:start
 ping -n 1 127.0.0.1 >nul
 for /f "delims=" %%i in ('netstat -n^|findstr /IERC:" %addr%:[0-9][0-9 ]*%stat%"') do goto :start
 start "" /WAIT sound.wav
goto start

Цитата:

Цитата neogara
что означает значек ^ здесь »

экранирует символ "|", чтобы тот отрабатывал только в скобках, а не раньше

neogara 13-06-2010 21:58 1433488

Спасибо за второй и первый пример
но что-то все равно не так, запускаю второй пример, а он мне звук выдает в любом случае
ниже то что дожно было бы получиться

neogara 13-06-2010 22:53 1433529

Цитата:

на один IP может быть несколько соединений с разным состоянием
вот в этом-то проблема и есть

в netstat нужны только в общем внешние адреса
Вот как должно получиться
прошу помочь доработать до конца ПЛЗ (присутствует утилита sleep.exe и cmdow)
Код:

title Disconnect Sound
set addr=IP address
set stat=ESTABLISHED

:start_1
 sleep 2
если в netstat присутствует IP address тогда идти на start_2 если нет идти на start_1
 
:start_2
Если в netstat присутствуют 2 или более одинаковых IP address,
тогда нужно проверить stat для каждого из них, то как быть тогда?


:start_3
sleep 2
Проверяем для каждого(!) IP address stat, если stat совпадает, то идти на stat_3,
если не совпадает то идти на sound

:sound
поигрываем звук в скрытом проигрывателе
cmdow.exe /RUN /hid %systemroot%\system32\mplay32.exe /play /close "sound.wav"
sleep 5
выдать окошко с соощением
echo var WSHShell = WScript.CreateObject("WScript.Shell"); > %temp%\mes.js
echo WSHShell.Popup("Disconnekt %addr%"); >> %temp%\mes.js
start %temp%\mes.js
deltree /y %temp%\mes.js


neogara 14-06-2010 02:00 1433634

Что-то лазию лазию по форуму, а подходящие более менее примеры найти не могу

amel27 14-06-2010 03:45 1433654

Цитата:

Цитата neogara
Проверяем для каждого(!) IP address stat, если stat совпадает »

sound при изменении статуса любого из соединений заданного IP:
Код:

title Disconnect Sound
set addr=IP Address
set stat=ESTABLISHED

:start
 sleep 2
 for /f "delims=" %%i in ('netstat -n^|find "%addr%:"^|find /V "%stat%"') do goto :sound
goto start

:sound
 cmdow.exe /RUN /hid %systemroot%\system32\mplay32.exe /play /close "sound.wav"
 sleep 5
 msg * "Disconnect %addr%!"
goto :eof

P.S. исчезновение соединения из списка NetStat не фиксируется - только смена статуса

neogara 14-06-2010 12:18 1433747

Пробую одновременно первый и третий примеры, но все равно при изменении статуса соединения звука не происходит(((

amel27 14-06-2010 16:12 1433887

neogara, двухэтапный вариант:

Код:

title Disconnect Sound
set addr=IP address
set stat=ESTABLISHED

:start1
 sleep 2
 for /f "delims=" %%i in ('netstat -n^|find "%addr%:"') do goto :start2
goto start1

:start2
 set $a=0& set $b=0& sleep 2
 for /f "tokens=4" %%i in ('netstat -n^|find "%addr%:"') do if "%%i"=="%stat%" (
 set /a $a+=1) else set /a $b+=1
if %$b% equ 0 if %$a% gtr 0 goto :start2

:sound
 cmdow.exe /RUN /hid %systemroot%\system32\mplay32.exe /play /close "sound.wav"
 sleep 5
 msg * "Disconnect %addr%!"
goto :start1


neogara 14-06-2010 23:59 1434166

Сейчас некогда проверить, позже отпишусь

neogara 15-06-2010 14:25 1434532

В этой формуле
Цитата:

:start1
sleep 2
for /f "delims=" %%i in ('netstat -n^|find "%addr%:"') do goto :start2
goto start1
Если ставлю IP addres существующий идет на start1, если не существующий опять идет на start1

А дальше не проходит вообще ни как(

Что ж такое-то третью неделю не могу решить(
Вроде все просто
прочитать-найти-сравнить-выдать звук, но почему не работает как надо не понятно(

amel27 15-06-2010 16:50 1434625

Цитата:

Цитата neogara
Что ж такое-то третью неделю не могу решить(
Вроде все просто »

сложно точно воспроизвести условия для проверки, так что у вас один выход - разобраться как работает скрипт, отследить историю соединения (TCPView) и найти причину того или иного его поведения... кстати, для отладки вместо NetStat можно использовать его текстовые логи:
Код:

netstat 1 >netstat.log

neogara 16-06-2010 03:49 1434987

Я пробЫвал через логи и TCPView, вобщем-то я с них и начал, и вроде бы если в лог отправить одну строчку, то кое как работает, просто не успевает, скорее всего, при разрыве связи ввести в лог и вывести из него, связь рвется быстро и это соединение просто пропадает
но вот не задача оказалась, с определением 2-х соединений, если вводит в лог 2-ве строки, то читает последнию и придумать, как читать их поочереди головы не хватает, и тем более что с 2-мя и более строками замедляется их обработка (в теории), поэтому выше описанные варианты считаю важными. ЗА НИХ СПАСИБО ОГРОМНОЕ. покручу поверчу авось получится
Я еще сокращал колличество столбцов для поиска, но проблемка все же возникает в команде "ЕСЛИ", что тут не ладится)))

И еще вопрос:
Как вывести в переменную из файла именно только первую строку, а потом только вторую? Что - то на форуме не нашел

amel27 16-06-2010 07:58 1435022

Цитата:

Цитата neogara
просто не успевает, скорее всего, при разрыве связи ввести в лог и вывести из него »

имхо проще экспериментировать с tcpvcon, т.к. она по умолчанию выводит только ESTABLISHED-соединения и нет нужды фильтровать другие состояния через IF... да и привязка к процессу не будет лишней:
Код:

@echo off
set proc=process.exe
set addr=XXX.XXX.XXX.XXX

:start1
 sleep 1
 for /f %%i in ('2^>nul tcpvcon -n -c %proc%^|find "%addr%:"') do goto start2
 echo.цикл: ожидание открытия соединения с %addr%
goto start1

:start2
 sleep 1
 echo.цикл: ожидание закрытия всех соединений с %addr%
 for /f %%i in ('2^>nul tcpvcon -n -c %proc%^| find "%addr%:"') do goto start2

echo.все соединения закрыты с %addr% - вывод сообщения
cmdow.exe /RUN /hid %systemroot%\system32\mplay32.exe /play /close "sound.wav"
sleep 5
msg * "Disconnect %addr%!"

echo.возврат на начало
goto :start1


neogara 16-06-2010 14:36 1435269

Во! Вот это выход из положения. Я уезжаю на 3 дня, поэтому нет возможности сечас протестить, как вернусь отпишу обязательно

А я и не знал, что только ESTABLISHED, спасибо еще раз

neogara 20-06-2010 01:29 1437697

Я думаю, что на этом пока все!
Если возникнут вопросы - отпишу ОГРОМНОЕ СПАСИБО!!!)))


Время: 22:44.

Время: 22:44.
© OSzone.net 2001-