Показать полную графическую версию : [решено] При разрыве связи с определенным 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
но не получаеться как надо
Вот нашел что-то похожее, но не могу догадаться как применить в моем батнике
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
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 файла в режиме скрытого процесса (http://forum.oszone.net/showthread.php?t=144553)
P.S. на один IP может быть несколько соединений с разным состоянием
А в место ping -n 2 127.0.0.1 >nul паузу можно сделать через sleep?
И еще вопрос если соединение отсутствует будет воспроисводить звук
Просто я так поня в команде for /f "tokens=4" %%i in ('netstat -n^ ищится статус, а далее он подставляется к адресу и если нет совпадения то что тогда????
Ставлю за ведомо отсутствуещее соединение, а звук так и не проигрывается
и еще я так понял что определяет переменную %%i как статус для find /i "%addr%:" это так?
и еще вопрос что означает значек ^ здесь?
А в место ping -n 2 127.0.0.1 >nul паузу можно сделать через sleep? »при наличии утилиты sleep.exe, статья: Пауза в пакетном файле (http://www.oszone.net/6160)
Ставлю за ведомо отсутствуещее соединение, а звук так и не проигрывается »отсутствие соединения и изменение статуса существующего соединения - разные задачи: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
что означает значек ^ здесь »экранирует символ "|", чтобы тот отрабатывал только в скобках, а не раньше
Спасибо за второй и первый пример
но что-то все равно не так, запускаю второй пример, а он мне звук выдает в любом случае
ниже то что дожно было бы получиться
на один 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
Что-то лазию лазию по форуму, а подходящие более менее примеры найти не могу
Проверяем для каждого(!) 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, двухэтапный вариант:
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
Сейчас некогда проверить, позже отпишусь
В этой формуле
:start1
sleep 2
for /f "delims=" %%i in ('netstat -n^|find "%addr%:"') do goto :start2
goto start1
Если ставлю IP addres существующий идет на start1, если не существующий опять идет на start1
А дальше не проходит вообще ни как(
Что ж такое-то третью неделю не могу решить(
Вроде все просто
прочитать-найти-сравнить-выдать звук, но почему не работает как надо не понятно(
Что ж такое-то третью неделю не могу решить(
Вроде все просто »сложно точно воспроизвести условия для проверки, так что у вас один выход - разобраться как работает скрипт, отследить историю соединения (TCPView (http://technet.microsoft.com/ru-ru/sysinternals/bb897437.aspx)) и найти причину того или иного его поведения... кстати, для отладки вместо NetStat можно использовать его текстовые логи:netstat 1 >netstat.log
Я пробывал через логи и TCPView, вобщем-то я с них и начал, и вроде бы если в лог отправить одну строчку, то кое как работает, просто не успевает, скорее всего, при разрыве связи ввести в лог и вывести из него, связь рвется быстро и это соединение просто пропадает
но вот не задача оказалась, с определением 2-х соединений, если вводит в лог 2-ве строки, то читает последнию и придумать, как читать их поочереди головы не хватает, и тем более что с 2-мя и более строками замедляется их обработка (в теории), поэтому выше описанные варианты считаю важными. ЗА НИХ СПАСИБО ОГРОМНОЕ. покручу поверчу авось получится
Я еще сокращал колличество столбцов для поиска, но проблемка все же возникает в команде "ЕСЛИ", что тут не ладится)))
И еще вопрос:
Как вывести в переменную из файла именно только первую строку, а потом только вторую? Что - то на форуме не нашел
просто не успевает, скорее всего, при разрыве связи ввести в лог и вывести из него »имхо проще экспериментировать с 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
Во! Вот это выход из положения. Я уезжаю на 3 дня, поэтому нет возможности сечас протестить, как вернусь отпишу обязательно
А я и не знал, что только ESTABLISHED, спасибо еще раз
Я думаю, что на этом пока все!
Если возникнут вопросы - отпишу ОГРОМНОЕ СПАСИБО!!!)))
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.