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

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

Инсульт 18-12-2011 13:34 1817339

Перезапуск программы при пропадании интернета.
 
Задача такая: Есть коннект менеджер для 4G интернета, но у него нет функции авто-переподключения при обрыве связи.

Есть такой скрипт:
читать дальше »
Код:

cmdow @ /HID

@echo off

cls

echo %date% - %time%: Connection checking... >>auto.log

set /a WaitTime=120*1
set Address=ya.ru
set /a conn_avail=-1

call :ping
exit

:ping

ping %Address% > Nul

if ERRORLEVEL 0 (
        if %conn_avail%==0 (
                set /a conn_avail=1
                echo %date% - %time%: Connection restored... >>auto.log
        )
)

if ERRORLEVEL 1 (
        if %conn_avail%==-1 (
                echo %date% - %time%: Disconnected! Reconnecting... >>auto.log
        )
        if %conn_avail%==0 (
                echo %date% - %time%: Unable to reconnect... >>auto.log
        )
        if %conn_avail%==1 (
                echo %date% - %time%: Disconnected! Reconnecting... >>auto.log
        )
        set /a conn_avail=0
        call :reboot
)

ping -n %WaitTime% 127.0.0.1 > Nul

call :ping

rem exit /b

:reboot

taskkill /f /im SW_WiMaxCM.exe > Nul

start /D "D:\4G\" SW_WiMaxCM.exe > Nul

exit /b



Работает, но если был дисконект во время таймаута 120с то срабатывает как и положено.
А если дисконект был во время комманды проверки (ping) то программа перезапускается моментально, т.е сначала скрипт пытается запустить еще 1 копию программы не завершая предыдущую. После ошибки программы "programm is running" скрипт останавливается.

Dragokas 18-12-2011 22:48 1817632

Попробуйте:

Код:


cmdow @ /HID

@echo off

echo %date% - %time%: Connection checking... >>auto.log

set /a WaitTime=120*1
set Address=ya.ru
set /a conn_avail=1

:ping

ping -n 1 %Address% > Nul

if ERRORLEVEL 0 (
        if %conn_avail%==0 (
                set /a conn_avail=1
                echo %date% - %time%: Connection restored... >>auto.log
        )
)

if ERRORLEVEL 1 (
        if %conn_avail%==0 (
                echo %date% - %time%: Unable to reconnect... >>auto.log
        )
        if %conn_avail%==1 (
                echo %date% - %time%: Disconnected! Reconnecting... >>auto.log
        )
        set /a conn_avail=0
        call :reboot
        goto :ping
)

ping -n %WaitTime% 127.0.0.1 > Nul

goto :ping

:reboot

taskkill /f /t /im SW_WiMaxCM.exe > Nul

ping -n 3 127.0.0.1 > Nul

start /D "D:\4G\" SW_WiMaxCM.exe > Nul

exit /b

и лучше поменяйте ya.ru на ближайший веб-узел Вашего провайдера, или посмотрев командой tracert ya.ru

YouHim 18-12-2011 22:54 1817638

Похоже у вас Freshtel? Попробуйте поставить галочку в инженерном меню. Не факт, но возможно поможет.

Dragokas 18-12-2011 23:05 1817648

Это у Freshtel-а автоподключение к интернету при запуске менеджера.

YouHim 18-12-2011 23:31 1817664

А можно мне к темке примазаться? Как раз пытаюсь сделать подобное, только у меня сложнее... У меня перезапуск утилиты не спасает, нужно передергивать модем (такое впечатление, что он зависает). В принципе мой батник работает, но иногда, когда соединение зависает, ping.exe сносит крышу. Вместо ошибок пинга она выдает
C:\Users\admin>ping 8.8.8.8
C:\Users\admin>ping 8.8.8.8
C:\Users\admin>ping 8.8.8.8
C:\Users\admin>ping 8.8.8.8
... и так до бесконечности. Как победить, пока не знаю.

Код:

ping -n 1 8.8.8.8
if not errorlevel 1 goto end
ping -n 1 8.8.4.4
if not errorlevel 1 goto end
ping -n 1 freshtel.ua
if not errorlevel 1 goto end
ping -n 1 ukr.net
if not errorlevel 1 goto end
d:\Portable\devcon\devcon.exe disable USB\VID_1076*
ping -n 1 localhost > nul
d:\Portable\devcon\devcon.exe enable USB\VID_1076*
ping -n 4 localhost > nul
d:\Portable\devcon\devcon.exe restart USB\VID_1076*
echo %date% %time% >> d:\Portable\devcon\log.txt
:end


Dragokas 19-12-2011 00:19 1817685

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

Я смотрю Вы подряд пингуете несколько адресов... бывает что freshtel.ua не пингуется, а ukr.net работает?

Могу посоветовать разве что найти какую-то другую методику проверки доступности инета или тот же пинг, но через другой интерфейс.
Например, amel27 писал про WMI http://forum.oszone.net/post-1065308-8.html
Попробуйте подставить туда Ваш код restart-а USB.

Dragokas 19-12-2011 00:47 1817692

Сохраните этот код в файл myping.vbs
Код:

iPing = Ping("www.google.com")

If iPing=0 Then
  WScript.Echo "0"
Else
  WScript.Echo "1"
End If

Function Ping (strTarget)
  Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
  Set colPings = objWMIService.ExecQuery ("Select * From Win32_PingStatus where Address = '" & strTarget & "'")

  For Each objPing in colPings
    Ping = objPing.StatusCode
  Next
End Function

А в этом батнике у Вас будет проверяться наличие инета каждые 120 сек:
Код:

@Echo Off
:ping
for /f %%a in ('cscript //nologo myping.vbs') do set inet=%%a
if %inet% == 1 (
d:\Portable\devcon\devcon.exe disable USB\VID_1076*
ping -n 1 localhost > nul
d:\Portable\devcon\devcon.exe enable USB\VID_1076*
ping -n 4 localhost > nul
d:\Portable\devcon\devcon.exe restart USB\VID_1076*
echo %date% %time% >> d:\Portable\devcon\log.txt
ping -n 5 localhost >nul
) else ping -n 120 localhost >nul
goto :ping


Инсульт 19-12-2011 01:54 1817708

Цитата:

Цитата YouHim
Похоже у вас Freshtel? Попробуйте поставить галочку в инженерном меню. Не факт, но возможно поможет. »

Да, FreshTel но российский, и коннект менеджер не такой как на скриншоте. Вообще кривой самописный местными деревенскими программистами :) А какой у вас он? Может и на наш подойдет?
Ближе чем ya.ru ничего не найти, IP провайдера странным образом ходит через германию..

Последние 2 скрипта я так понял перезапускает не менеджер, а драйвер модема?
Пробую все предложенные варианты, позже отпишу результат.

Вот как все печально, 1 хоп закрыт, 2 уже 178мс.

Трассировка маршрута к ya.ru [77.88.21.3]
с максимальным числом прыжков 30:

1 * * * Превышен интервал ожидания для запроса.
2 178 ms 119 ms 80 ms 10.0.0.5
3 65 ms 174 ms 111 ms msk-ix-m9.yandex.net [193.232.244.93]
4 80 ms 144 ms 139 ms 213.180.213.102
5 * * * Превышен интервал ожидания для запроса.
6 54 ms 109 ms 104 ms www.yandex.ru [77.88.21.3]

Трассировка завершена.

Dragokas 19-12-2011 02:48 1817722

У меня, кстати, тоже Wimax от Альтернет (фрештел-а), только на выносной стац.антенне и модем под 220 В и по LAN-у подключается :)
Цитата:

Цитата Инсульт
перезапускает не менеджер, а драйвер модема? »

Да, там консольным диспетчером устройств отключается, подключается, а потом еще и обновляется USB-порт, на котором висит модем.
Вам тоже подойдут эти 2 скрипта, если замените строки с "devcon" на свои "taskkill ..."

P.S. Ну можно еще пробовать пинговать до yandex.net или напрямую на адрес 77.88.21.11 (выдал ping yandex.net), чтобы исключить ошибки DNS-сервера и т.п. задержки при переадресациях.

Инсульт 19-12-2011 03:18 1817728

Что то не то... Сделал так:
При пропадании интернета устройство отключается и больше не включается.

Код:

@Echo Off
:ping
for /f %%a in ('cscript //nologo myping.vbs') do set inet=%%a
if %inet% == 1 (
"%SystemRoot%\system32\devcon.exe" disable USB\VID_1076*
ping -n 1 localhost > nul
"%SystemRoot%\system32\devcon.exe" enable USB\VID_1076*
ping -n 4 localhost > nul
"%SystemRoot%\system32\devcon.exe" restart USB\VID_1076*
echo %date% %time% >> С:\clog.txt
ping -n 5 localhost >nul
) else ping -n 120 localhost >nul
goto :ping


В окне пишет это:
USB\VID_1076&PID_7F00\72130202 : Disabled
1 device(s) disabled.

В "процес експлорере" видно что скрипт зациклен на команде device Disabled

Dragokas 19-12-2011 12:33 1817877

Дак, я же писал
Цитата:

Цитата Diskretor
замените строки с "devcon" на свои "taskkill ..." »

Этот код был для YouHim, так как у него
Цитата:

Цитата YouHim
перезапуск утилиты не спасает, нужно передергивать модем »

У Вас же должен быть такой код:
Код:

@Echo Off
:ping
for /f %%a in ('cscript //nologo myping.vbs') do set inet=%%a
if %inet% == 1 (

taskkill /f /t /im SW_WiMaxCM.exe > Nul
ping -n 3 127.0.0.1 > Nul
start /D "D:\4G\" SW_WiMaxCM.exe > Nul
ping -n 5 localhost >nul

) else ping -n 120 localhost >nul
goto :ping

Переменная inet получает из vbs-скрипта значение 1, когда нет интернета; или 0 - при успешном подключении.
Также я делаю паузы, чтобы процесс успел выгрузится. И после запуска менеджера, чтобы он успел подключится перед следующей проверкой пинга.
Если не успевает подключится в течении 4-5 сек., то значение "5" нужно увеличить здесь "ping -n 5 localhost >nul"

YouHim 19-12-2011 12:42 1817878

Diskretor, Спасибо. Буду пробовать.
Цитата:

Цитата Инсульт
Да, FreshTel но российский, и коннект менеджер не такой как на скриншоте. Вообще кривой самописный местными деревенскими программистами А какой у вас он? Может и на наш подойдет? »

Сам коннект менеджер вот такой.

А на скриншоте выше его инженерное меню.

Инсульт 19-12-2011 12:44 1817880

Так мне вариант с перезапуском устройства тоже подошел бы. Коннект менеджер так хитро написан что автоматически подключается только при первом запуске или при отключении модема от порта или в устройствах. Вот я и пытался прикрутить "чужой" скрипт под себя, но что то никак.. останавливает но не запускает устройство.


Цитата:

Цитата YouHim
А на скриншоте выше его инженерное меню. »

Хм.. у меня такой же. И как попасть в меню? :)

Dragokas 19-12-2011 12:50 1817882

Цитата:

Цитата Инсульт
останавливает но не запускает устройство. »

Возможно тоже проблема с паузами ?
Здесь слишком мало выставлено:
Код:

"%SystemRoot%\system32\devcon.exe" disable USB\VID_1076*
ping -n 1 localhost > nul
"%SystemRoot%\system32\devcon.exe" enable USB\VID_1076*

Попробуйте увеличить, хотябы с "1" до "4".

YouHim 19-12-2011 14:01 1817924

Цитата:

Цитата Инсульт
Хм.. у меня такой же. И как попасть в меню? »

Shift+Ctrl+F10 (именно в таком порядке)
login "admin2"
password "admin2"

YouHim 19-12-2011 15:35 1817983

Diskretor,
Спасибо! vbs cкрипт работает, даже в том случае, когда ping.exe зависал. Но были замечены ложные срабатывания. Возможно из-за потерь пакетов. Что нужно дописать, чтобы скрипт возвращал ошибку после того как пропингует, например, 3 сайта по 10 пингов? Если ни один пинг не прошел, только тогда выполнить переподключение. И желательно пингивать 1 байтом..
Такая многоуровневая перестраховка нужна, так как когда канал загружен под завязку, то пинги почти не прорываются :)

Инсульт 19-12-2011 15:37 1817984

Да, если играть с параметром ping то вроде работает, думаю лучшего варианта не придумать..
В инженерном меню тоже стоит галка на "авто реконнект" но эффекта не дает почему то..

YouHim 19-12-2011 15:48 1817993

Инсульт, а у вас просто обрывы связи или сам модем подвисает? Когда связь пропала, можно подключиться через коннект менеджер, или нужно обязательно перетыкать модем?

Dragokas 19-12-2011 16:13 1818007

Можно попробовать этим же скриптом с прописанными разными адресами в каждом из vbs файлов. Если при последовательном запуске переменная inet всегда будет == 1, то перезапустить менеджер.

YouHim 19-12-2011 17:49 1818060

Еще проблема образовалась... Когда канал загружен на 100% закачкой, то пинги не проходят. Совсем. Даже однобайтные.
В этом случае скрипт будет постоянно переподключать модем без толку. Может есть другой способ проверить наличие сети, кроме пинга?

Dragokas 19-12-2011 18:09 1818075

Теоретически "Сетевые виджеты" получают информацию о загруженности канала. Если бы можно было получать такую информацию посредством батника...

YouHim 19-12-2011 21:22 1818227

Может так-то можно по этим параметрам идентифицировать отсутствие сети?
Сеть есть и сети нет сооответственно:


Код:

Настройка протокола IP для Windows
Имя компьютера  . . . . . . . . . : admin-home
  Основной DNS-суффикс  . . . . . . :
  Тип узла. . . . . . . . . . . . . : Гибридный
  IP-маршрутизация включена . . . . : Нет
  WINS-прокси включен . . . . . . . : Нет
  Порядок просмотра суффиксов DNS . : freshtel.com.ua

Ethernet adapter Подключение по локальной сети 3:

  DNS-суффикс подключения . . . . . : freshtel.com.ua
  Описание. . . . . . . . . . . . . : GCT WiMAX USB Network Device
  Физический адрес. . . . . . . . . : 00-11-A4-80-0B-98
  DHCP включен. . . . . . . . . . . : Да
  Автонастройка включена. . . . . . : Да
  Локальный IPv6-адрес канала . . . : fe80::5da1:75ff:aef2:f6db%16(Основной)
  IPv4-адрес. . . . . . . . . . . . : 10.4.90.5(Основной)
  Маска подсети . . . . . . . . . . : 255.255.0.0
  Аренда получена. . . . . . . . . . : 19 грудня 2011 р. 18:50:23
  Срок аренды истекает. . . . . . . . . . : 20 грудня 2011 р. 18:50:23
  Основной шлюз. . . . . . . . . : 0.0.0.0
  DHCP-сервер. . . . . . . . . . . : 192.168.84.1
  IAID DHCPv6 . . . . . . . . . . . : 285221127
  DUID клиента DHCPv6 . . . . . . . : 00-01-00-01-16-22-3A-73-00-16-E6-86-7E-63

  DNS-серверы. . . . . . . . . . . : 193.19.247.114
                                      193.19.247.115
  NetBios через TCP/IP. . . . . . . . : Включен


Код:

Настройка протокола IP для Windows

  Имя компьютера  . . . . . . . . . : admin-home
  Основной DNS-суффикс  . . . . . . :
  Тип узла. . . . . . . . . . . . . : Гибридный
  IP-маршрутизация включена . . . . : Нет
  WINS-прокси включен . . . . . . . : Нет

Ethernet adapter Подключение по локальной сети 3:

  Состояние среды. . . . . . . . : Среда передачи недоступна.
  DNS-суффикс подключения . . . . . : freshtel.com.ua
  Описание. . . . . . . . . . . . . : GCT WiMAX USB Network Device
  Физический адрес. . . . . . . . . : 00-11-A4-80-0B-98
  DHCP включен. . . . . . . . . . . : Да
  Автонастройка включена. . . . . . : Да


Инсульт 19-12-2011 21:31 1818230

Цитата:

Цитата YouHim
Инсульт, а у вас просто обрывы связи или сам модем подвисает? Когда связь пропала, можно подключиться через коннект менеджер, или нужно обязательно перетыкать модем? »

Нет, не виснет модем. Просто отключается с ошибкой "неправильный логин\пароль" И сам не подключается пока не нажмешь "подключить". И так довольно часто, бывает 10 раз в час. Если что то качать например фильм надо сидеть контролировать что не очень удобно.

Не проще через WMI определять подключен адаптер к сети или нет?
Вот как бы в скрипте увеличить время пинга ya.ru а то 4 запроса мало. Если и правда интернет временно затупил изза торрента или еще чего что бы не перезагружался зря.
Как то все сложно выходит. Проще скрипт на autoit сделать что бы нажимал кнопку "подключиться" :)

YouHim 19-12-2011 21:35 1818237

Цитата:

Цитата Инсульт
Не проще через WMI определять подключен адаптер к сети или нет? »

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


UPD: вот скрипт, который, выдает статус адаптера. http://forum.oszone.net/post-1810790-86.html
Переделать бы его..

Dragokas 20-12-2011 00:23 1818353

Если Вам приемлимо использовать стороннее freeware ПО, то могу предложить еще способ с linux-утилитой wget, переписанной под Win:
Скачать Wget
Она лишена недостатков со сбоями, как в Ping и может принимать самые различные ключи.

Написал код, когда Wget делает 4 попытки по около ~5 сек. Если подключение удачно - идет таймаут 120 сек. и повторная проверка доступности узла Yandex.net (лучше указывать IP-адрес):
Код:

@Echo Off
:ping
echo testing inet...
"%programfiles(x86)%\GnuWin32\bin\wget.exe"  --spider 77.88.21.11 --tries=4 --timeout=20 2>nul
if %errorlevel% == 0 (ping -n 120 localhost>nul&goto :ping)
echo Restarting inet
::Код для рестарта модема (менеджера)
ping -n 10 localhost >nul&goto :ping

Если нужно, могу дописать и чтобы
Цитата:

Цитата YouHim
пропингует, например, 3 сайта по 10 пингов? Если ни один пинг не прошел, только тогда выполнить переподключение. »

Цитата:

Цитата YouHim
Переделать бы его.. »

Переделать - no problem, но
YouHim, вот там, где Вы подчеркнули connected - Вы уверены, что при обрыве связи указанный скрипт 100% без ошибок меняет это значение на disconnected?
Можно ввести дополнительную проверку:
Перезапускать модем только, если одновременно выполняются два условия:
1) Не проходит ни один пинг
2) Network adapter выдает статус Disabled.

Цитата:

Цитата Инсульт
как бы в скрипте увеличить время пинга ya.ru а то 4 запроса мало. »

Если это поможет: ping -f -n 10 -w 3000 -l 1 ya.ru (без фрагментации пакетов, ожидание ответа от сервера в 3 сек., размер пакета 1 байт, отправка 10 пакетов).

Цитата:

Цитата Инсульт
Проще скрипт на autoit сделать что бы нажимал кнопку "подключиться" »

Совсем не сложно. Берете прогу ScriptWriter повторяете действие (нажать кнопку "подключиться"), сохраняте скрипт, компилируете. Адрес Ехе-шника прописіваете в батник после строк с перезапуском менеджера: Start "" /min c:\button.exe

YouHim 20-12-2011 02:02 1818394

Цитата:

Цитата Diskretor
вот там, где Вы подчеркнули connected - Вы уверены, что при обрыве связи указанный скрипт 100% без ошибок меняет это значение на disconnected? »

Пока что 100% не уверен, так как нужно ждать реального разрыва. Эмуляция обрыва с помощью файрволла показала, что данное значение меняется. Пришлось засесть на несколько часов за изучение vbs. В результате сваял вот такой скрипт:

Код:

strComputer = "."
Set WshShell = WScript.CreateObject("WScript.Shell")
        Command ="d:\Portable\Script\restart_modem\devcon.exe disable USB\VID_1076*"
        Command1="d:\Portable\Script\restart_modem\devcon.exe enable USB\VID_1076*"
        Command2="d:\Portable\Script\restart_modem\devcon.exe restart USB\VID_1076*"
        Command3="d:\Portable\Script\restart_modem\SW_WiMaxCM.lnk"
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")
Set colItems = objWMIService.ExecQuery( _ 
 "SELECT * FROM Win32_NetworkAdapter WHERE Name = 'GCT WiMAX USB Network Device'",,48)
For Each objItem in colItems
rem      Wscript.Echo "NetConnectionStatus: " & objItem.NetConnectionStatus
status =  objItem.NetConnectionStatus

if status<>2 Then
        WshShell.Run "taskkill /IM SW_WiMaxCM.exe", 0
        WshShell.Run Command
        WScript.Sleep 2000
        WshShell.Run Command1
        WScript.Sleep 5000
        WshShell.Run Command2
        t = now()
        Set FSO = CreateObject("Scripting.FileSystemObject")
            Set f = FSO.OpenTextFile("log.txt", 8, True)
            f.WriteLine t
            WshShell.Run Command3
        Wscript.Echo  "GCT WiMAX USB Network Device restarted"
Else
End if
Next

Запускать буду через планировщик. С эмуляцией обрывов работает отлично, буду надеяться, что реальный обрыв он тоже отработает. За быдлокод прошу не пинать, это первый мой vbs скрипт :)
Diskretor, за wget, спасибо. Попробую и ее поковырять на досуге.

YouHim 20-12-2011 10:47 1818538

Цитата:

Цитата Diskretor
Вы уверены, что при обрыве связи указанный скрипт 100% без ошибок меняет это значение на disconnected? »

К сожалению, ваши предчувствия оправдались. При реальном обрыве ничего не меняется. Статус сети так и висит "подключено". Получается, что локально зафиксировать проблему никак нельзя. Только пинговать... Но пинги тоже не спасают. Я в тупике.

Dragokas 20-12-2011 12:22 1818607

Есть такая команда "netstat -s" если ее запустить дважды через секундный интервал, то имеем количество полученных за это небольшое время пакетов:
Алгоритм:
1) 5 последовательных Ping --> все fail AND Packets > 1000 - ничего не делаем (канал перегружен прогой Utorrent)
1) 5 последовательных Ping --> все fail AND Packets <= 50 - Restart Modem

Есть только один недостаток, если у Вас несколько LAN-ов, или работает локальная сеть этот метод будет работать неправильно (а фильтра устройств в этой команде я не нашел).

Anonymоus 20-12-2011 12:23 1818608

Цитата:

Цитата YouHim
Но пинги тоже не спасают »

Подозреваю, это связано с тем, что ping не всегда возвращает ненулевой errorlevel, если пинг не прошел. Сталкивался с этим во время написания одного скрипта, ping выдавал "Ответ от мой_внешний_ip: Заданная сеть недоступна.", но errorlevel равнялся нулю.
Предлагаю делать тщательный разбор того, что возвращает нам ping, а не слепо полагаться на %ErrorLevel% У меня это реализовано вот так:
Код:

Ping -n 1 -w 1000 8.8.8.8|Find "TTL=">nul&&Echo Connected
или
Код:

Ping -n 1 -w 1000 8.8.8.8|Find "TTL=">nul
If %ErrorLevel%==0 (
Echo Online
) Else (
Echo Offline
)

Второй вариант предпочтительнее, когда нужно в зависимости от того, прошел пинг или нет - совершить разные действия, ведь && и || одновременно в однострочник не вставишь. В ответе ping ищется именно "TTL=" по нескольким причинам: 1) Не зависит от локализации системы; 2) Появляется только при действительно прошедшем пинге.

Ещё, как вариант - можно использовать GnuWin32 wget и тянуть google.com/favicon.ico, а затем проверять на наличие файла (ключами указать несколько попыток и достаточный таймаут)

YouHim 20-12-2011 21:51 1819014

Цитата:

Цитата Diskretor
Есть такая команда "netstat -s" если ее запустить дважды через секундный интервал, »

Кажись понял идею. Попробую.
Anonymоus, Извиняюсь, но ничего не понял... Можно как для ламера разжевать? :)

Dragokas 22-12-2011 01:05 1819838

Т.е. он имел в виду, что иногда, даже если сайт не пингуется, команда пинг все равно выдаст успешный результат - и это приведет к перезапуску модема в написанных нами скриптах. Нужно все лишь добавить конец команды пинг это |Find "TTL="
Рассмотрим пример:
1) Ping выдает это:
"Сбой команды ......."
и передает, что завершено все без ошибок ---> скрипт перезагружает модем.

Мы дописываем |Find "TTL=", и теперь уже проверяется успешность выполнения именно этой команды.
Find ищет наличие строки "TTL=" в отчете, выданном предыдущей командой

Знак | как раз его и передает.

--> команда выполнится с ошибкой (строка "TTL="не найдена) ---> скрипт не будет пускать перезагрузку.
Код:

>ping 8.8.8.8
Обмен пакетами с 8.8.8.8 по с 32 байтами данных:
Ответ от 8.8.8.8: число байт=32 время=64мс TTL=46
Ответ от 8.8.8.8: число байт=32 время=63мс TTL=46
...

>ping 8.8.8.8 | Find "TTL="&&echo Privet!
...
Privet!

Символ && - следующая за ним команда выполняется, если предыдущая (перед &&) выполнена без ошибок (%errorlevel% = 0)
Символ || - следующая за ним команда выполняется, если предыдущая (перед &&) выполнена с ошибкой (%errorlevel% <> 0)

YouHim 23-12-2011 03:58 1820569

Опять прошу помощи!
Решил начать все сначала. Пишу скрипт, который пингует 3 хоста. Если все 3 не отвечают - перезагружает софт и модем.
Собственно код
Код:

iPing =  Ping("195.195.195.195")
        iPing1 = Ping1("195.195.195.195")
        iPing2 = Ping2("195.195.195.195")
        strComputer = "."


Set WshShell = WScript.CreateObject("WScript.Shell")
        Command ="d:\Portable\Script\restart_modem\devcon.exe disable USB\VID_1076*"
        Command1="d:\Portable\Script\restart_modem\devcon.exe enable USB\VID_1076*"
        Command2="d:\Portable\Script\restart_modem\devcon.exe restart USB\VID_1076*"
        strProcessKill = "'SW_WiMaxCM.exe'"
        strProcessStart="d:\Portable\Script\restart_modem\SW_WiMaxCM.lnk"


Function Ping (strTarget)
  Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
  Set colPings = objWMIService.ExecQuery ("Select * From Win32_PingStatus where Address = '" & strTarget & "'AND Timeout=10000 AND BufferSize=1")


  For Each objPing in colPings
    Ping = objPing.StatusCode
  Next
End Function

If iPing=0 Then
WScript.Quit
end if

Function Ping1 (strTarget)
  Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
  Set colPings = objWMIService.ExecQuery ("Select * From Win32_PingStatus where Address = '" & strTarget & "'AND Timeout=10000 AND BufferSize=1")

 For Each objPing in colPings
    Ping1 = objPing.StatusCode
  Next
End Function

If iPing1=0 Then
WScript.Quit
end if

Function Ping2 (strTarget)
  Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
  Set colPings = objWMIService.ExecQuery ("Select * From Win32_PingStatus where Address = '" & strTarget & "'AND Timeout=10000 AND BufferSize=1")

  For Each objPing in colPings
    Ping2 = objPing.StatusCode
  Next
End Function

If iPing2=0 Then
WScript.Quit
end if

Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" _
& strComputer & "\root\cimv2")

Set colProcess = objWMIService.ExecQuery _
("Select * from Win32_Process Where Name = " & strProcessKill )
For Each objProcess in colProcess
objProcess.Terminate()
Next

Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" _
    & ".\root\cimv2")
Set colListOfServices = objWMIService.ExecQuery _
 ("Select * from Win32_Service Where Name ='GCTWiMaxService'")
For Each objService In colListOfServices
    objService.StopService   
        WshShell.Run Command
        WScript.Sleep 2000
        WshShell.Run Command1
        WScript.Sleep 5000
        WshShell.Run Command2
        t = now()
        Set FSO = CreateObject("Scripting.FileSystemObject")
            Set f = FSO.OpenTextFile("log.txt", 8, True)
            f.WriteLine t
            objService.StartService
        WshShell.Run strProcessStart
        Wscript.Echo  "GCT WiMAX USB Network Device restarted"

Next



Столкнулся с одной проблемой. Если модем отсутствует, то скрипт выдает вот такую ошибку
Код:

C:\Users\admin\AppData\Roaming\WMICodeCreator\MyWMIQuery_Script.vbs(20, 3) (null): 0x80041001
вот в этом месте:
Код:

For Each objPing in colPings
    Ping = objPing.StatusCode

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

Инсульт 08-02-2012 06:49 1853965

Вот так вроде работает как надо:

Код:

cmdow @ /HID
@Echo Off

Set /A WaitTime=120*1
Set Address=ya.ru -n 15

:Loop
Ping %Address%
If ERRORLEVEL 1 call :RESTART
Ping -n %WaitTime% 127.0.0.1 > Nul
GoTo Loop

:RESTART
taskkill /f /im SW_WiMaxCM.exe > Nul
net stop GCTWiMAXService
devcon disable USB\Class_0a
devcon enable USB\Class_0a
REM devcon disable USB\VID_1076*
REM devcon enable USB\VID_1076*
net start GCTWiMAXService
start /D "C:\Program Files\FreshTel\" SW_WiMaxCM.exe > Nul
exit /b


mrjok 21-02-2012 13:11 1863455

2 Инсульт:

a) cmdow внешняя утилита, заметил позже
б) Ping %Address% в цикле приводит к ненужному постоянному окну (в XP)
в) нельзя ли вообще без :Loop - проверили и вышли, а повторный запуск через назначенные задания?

Инсульт 28-02-2012 02:56 1868085

Цитата:

Цитата mrjok
a) cmdow внешняя утилита, заметил позже
б) Ping %Address% в цикле приводит к ненужному постоянному окну (в XP)
в) нельзя ли вообще без :Loop - проверили и вышли, а повторный запуск через назначенные задания? »

a) Иначе никак, если это не устраивает можно воспользоваться BAT компилятором, получится exe файл который будет работать как сервис.
в) В этом случае нужно делать планировщик, либо стороннее ПО, или воспользоваться встроенным в систему.

Инсульт 28-02-2012 18:28 1868564

Не поленился написал простенькую программку.
Запускает этот скрипт один раз в 5 минут, а не постоянно пингует.
Скрипт будет работать в скрытом режиме (без окна) как и хотел mrjok

Скрипт теперь должен быть такой:

Код:

@Echo Off

Set Address=ya.ru -n 8

Ping %Address%
If ERRORLEVEL 1 call :RESTART
GoTo EXIT

:RESTART
taskkill /f /im SW_WiMaxCM.exe > Nul
net stop GCTWiMAXService
devcon disable USB\Class_0a
devcon enable USB\Class_0a
net start GCTWiMAXService
start /D "C:\Program Files\FreshTel\" SW_WiMaxCM.exe > Nul
exit /b

:EXIT
exit


mrjok 14-03-2012 11:43 1878942

2 Инсульт:

1) спасибо
2) для devcon как уточнить, что USB\Class_0a

Sergeev 10-05-2012 16:26 1913500

то Инсульт:

Как прописать запуск скрипта в шедулер,планируется поместить шедулер в автозагрузку

yrec 01-10-2013 01:11 2226489

Доброго времени суток! Помогите с скриптом! Задача пинговать определенный адрес допустим 192.168.1.100 нужно послать 10 запросов эсли же на 10 запросов нет ответа перезагрузить сервер, если запросы в норме повторить процедуру через 10 минут!

Если конечно возможно то чтобы в момент перезапуска выскакивало окно комп будет перезагружен через 1 минуту, для отмены нажмите допустим "1" не нажал знач перезагруз.

Очень прошу помогите!

art_record_video@vk 10-11-2013 11:52 2251139

Цитата:

Цитата Инсульт
Не поленился написал простенькую программку.
Запускает этот скрипт один раз в 5 минут, а не постоянно пингует.
Скрипт будет работать в скрытом режиме (без окна) как и хотел mrjok »

Цитата:

Цитата Инсульт
Не поленился написал простенькую программку.
Запускает этот скрипт один раз в 5 минут, а не постоянно пингует.
Скрипт будет работать в скрытом режиме (без окна) как и хотел mrjok »

Не совсем понял, для чего нужен файл Шедулер.ехе, на вин7 64х не запускаеться.
У меня вопрос другого плана, мне надо чтоб скрипт проверял как наличие интернета, так и работоспособность батника, который вызывает работу програмки, иногда эта програмка вылетает (или подвисает или просто вылетает, особенно когда нету интернета долгое время), и хотелось бы , чтоб скрипт перезапускал тот батник, котоырй вылетатет.

То есть два условия проверки, 1 - интернет, 2- работает ли батник.

Как убить процесс и как запустить, - это я логическим путем установил, а вот как сделать проверку программы ? Здесь мозгов не хватает. Работа программы заключаеться в том, что должен работать CMD , который связаный через интернет с сайтом. Если интернет пропадает, то CMD может "вылетить".

art_record_video@vk 13-11-2013 02:54 2253386

ребята, есть варианты по моему вопросу ?


Время: 23:46.

Время: 23:46.
© OSzone.net 2001-