1

Тема: VBScript: В случае успешного пинга выполнить действие

Добрый день, вот научил скрипт выполнять действие в случае пинга.

Option Explicit
Dim Shell, strCommand, strHost, ReturnCode
'Host or IP to ping
strHost = "192.168.1.1"
'Create shell object
Set Shell = wscript.createObject("wscript.shell")
'What to run in command line
strCommand = "ping -n 10 " & strHost
'Run command and get return code
ReturnCode = Shell.Run(strCommand, 0, True)
'0 = pingable, 1 = no response
If ReturnCode = 0 Then
wscript.echo strHost & " Миссия успешна"
Else
wscript.echo strHost & "Ты провалил задачу"
End If

Но проблема в том, что действие выполняется только после того, как пройдет весь пинг, а как сделать скажем так, постояно пингуется машина которая офф в сети...как только машина стартует и пинг до нее доходит, то выполняется некое действие.

Всем спасибо.

2

Re: VBScript: В случае успешного пинга выполнить действие

А не проще было бы... Запустить пинг c "-n 1000" а потом используя стандартные потоки вывода смотреть результат... Или через WMI в бесконечном цикле, и делать Sleep между запросами...

3

Re: VBScript: В случае успешного пинга выполнить действие

Кому проще? мне, нет))
А если серьезно, то Sleep между запросами не подходит, фишка задачи, как раз таки в том, чтобы выполнить действие, как только сетевая карта+сетевые службы машины стартует. Иначе я просто через WScript.Sleep  задал бы некое время.

Нужна мгновенная реакция на появление пинга.
Сейчас объясню причину, а то понабегут и начнут предъявы писать, мол вирус пишу.
Действие должно рестартовать машину, которая по DHCP через Wi-Fi получает IP, зачем мне это нужно не важно.
Я естественно пинговать буду через LAN, который вообще по определению в статус готов входит раньше, чем Wi-Fi.

4

Re: VBScript: В случае успешного пинга выполнить действие

cbh, лучше попробуйте использовать WMI — «Win32_PingStatus».

5 (изменено: cbh, 2010-01-14 09:31:31)

Re: VBScript: В случае успешного пинга выполнить действие

Написал,что я делаю не так? Дает ошибку line 1 / 15 что то с именем хоста, не знаю.

Function Ping( 192.168.1.1 )
    Dim colPingResults, objPingResult, strQuery
    strQuery = "SELECT * FROM Win32_PingStatus WHERE Address = '" & 192.168.1.1 & "'"
    Set colPingResults = GetObject("winmgmts://./root/cimv2").ExecQuery( strQuery )
    For Each objPingResult In colPingResults
        If Not IsObject( objPingResult ) Then
            Ping = False
        ElseIf objPingResult.StatusCode = 0 Then
            Ping = True
        Else
            Ping = False
        End If
    Next
    Set colPingResults = Nothing
End Function

Вот нашел другой вариант, вот здесь http://www.visualbasicscript.com/m42535.aspx
Проверить также не смог.
Напоминаю мою задачу, постоянно следить за компом через пинг, как только пинг появляется рестартовать его.

6

Re: VBScript: В случае успешного пинга выполнить действие

cbh, Вы делаете неправильно:
* приводить нужно весь скрипт, а не одну функцию, что написано в Правилах.
* как приводить сообщение об ошибке, тоже написано в Правилах форума.

Вот Вам, по изложенному коллегой VSVLAD в посте #2, примерный код (не проверялось):

Option Explicit

Dim objSWbemServicesEx, collSWbemObjectSet, objSWbemObjectEx
Dim strAddress


strAddress = "192.168.1.1"

Set objSWbemServicesEx = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")

Do
    Set collSWbemObjectSet = objSWbemServicesEx.ExecQuery("SELECT * FROM Win32_PingStatus WHERE Address = '" & strAddress & "'")
    
    For Each objSWbemObjectEx In collSWbemObjectSet
        If IsNull(objWbemObject.StatusCode) Or objWbemObject.StatusCode <> 0 Then
            ' Nothing to do
        Else
            ' Reboot commands here
            
            Exit Do
        End If
    Next
    
    WScript.Sleep 1000
Loop

Set collSWbemObjectSet = Nothing
Set objSWbemServicesEx = Nothing

WScript.Quit 0

«WScript.Sleep 1000», если не устраивает, можете либо закомментировать, либо поменять на «WScript.Sleep 100». Отправить удалённую машину на перезагрузку можно так же посредством WMI.

7

Re: VBScript: В случае успешного пинга выполнить действие

Спасибо, обязательно попробую и отпишусь.
Касательно, правил,я тут новенький, прошу прощения. Обязательно ознакомлюсь с правилами. Я здесь судя по всему надолго))

8

Re: VBScript: В случае успешного пинга выполнить действие

alexii, проверить скрипт до вечера не смогу, поэтому чтобы не терять время спрошу сразу.
1.При закомментированном «WScript.Sleep 1000» скрипт будет автоматически постоянно повторяться n-раз, пока не выполнит перезагрузку устройства?

2.При незакомментированном «WScript.Sleep 1000» скрипт будет автоматически повторяться каждую секунду n-раз, пока не выполнит перезагрузку устройства?

9

Re: VBScript: В случае успешного пинга выполнить действие

cbh пишет:

1.При закомментированном «WScript.Sleep 1000» скрипт будет автоматически постоянно повторяться n-раз, пока не выполнит перезагрузку устройства?
2.При незакомментированном «WScript.Sleep 1000» скрипт будет автоматически повторяться каждую секунду n-раз,…

Безотносительно комментирования «WScript.Sleep 1000»: скрипт будет повторяться до тех пор, пока не «допингуется» до указанного адреса с тайм-аутом 1000 мс (значение по умолчанию; при желании можно и поменять, но обычно достаточно и умолчального значения). После этого произойдёт выход из цикла опроса (см. также ниже).

«WScript.Sleep 1000» просто добавляет внутрь этого цикла паузу в одну секунду (прежде всего, чтобы дать время остальным выполняемым задачам).

cbh пишет:

…пока не выполнит перезагрузку устройства?

В скрипте нет команд, организующих перезагрузку. Вы должны добавить их сами вместо комментария «' Reboot commands here». Поскольку в примере их нет — по следующей команде «Exit Do» произойдёт просто выход из цикла опроса.

10

Re: VBScript: В случае успешного пинга выполнить действие

Спасибо,насчет перезагрузки ясно конечно же, команду для перезагрузки я почти написал, через телнет кстати, машина на Юниксе.
В любом случае спасибо, вечером протестирую.

11

Re: VBScript: В случае успешного пинга выполнить действие

Ошибка:

Line: 15
Char:9
Error:Object required: ''
Code:800A01A8

Немного сам поэкспериментировал, не получилось.

12

Re: VBScript: В случае успешного пинга выполнить действие

Option Explicit

Dim objSWbemServicesEx, collSWbemObjectSet, objSWbemObjectEx
Dim strAddress


strAddress = "192.168.1.1"

Set objSWbemServicesEx = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")

Do
    Set collSWbemObjectSet = objSWbemServicesEx.ExecQuery("SELECT * FROM Win32_PingStatus WHERE Address = '" & strAddress & "'")
    
    For Each objSWbemObjectEx In collSWbemObjectSet
        If IsNull(objSWbemObjectEx.StatusCode) Or objSWbemObjectEx.StatusCode <> 0 Then
            ' Nothing to do
        Else
            ' Reboot commands here
            
            Exit Do
        End If
    Next
    
    WScript.Sleep 1000
Loop

Set collSWbemObjectSet = Nothing
Set objSWbemServicesEx = Nothing

WScript.Quit 0

13

Re: VBScript: В случае успешного пинга выполнить действие

Наконец-то проверил. Все работает супер, спасибо большое. Вас интересует, как я телнетился на машину, используя только VBS?
Я просто, поискал по форуму, вроде никто не делал этого через чистый VBS, без WinSock и сторонних программ.
Я могу выложить его сюда, если понадобится.
Отличный форум, так держать.

14

Re: VBScript: В случае успешного пинга выполнить действие

Конечно выкладывайте.

15 (изменено: cbh, 2010-01-16 15:17:09)

Re: VBScript: В случае успешного пинга выполнить действие

Set oShell = CreateObject("WScript.Shell")
   'Стартуем командную строку
   oShell.Run "Telnet"
   oShell.AppActivate "Telnet"
    WScript.Sleep 1000
     ' Пишем нужный адрес.
    oShell.SendKeys"open 192.168.1.1"
    oShell.SendKeys("{Enter}")
    WScript.Sleep 1000
    oShell.SendKeys"admin"
    oShell.SendKeys("{Enter}")
    WScript.Sleep 1000
    oShell.SendKeys"admin"
    oShell.SendKeys("{Enter}")
      WScript.Sleep 1000
  oShell.SendKeys("{Enter}") 
 ' Здесь пишем нужную команду. Можно и с ключами.
 oShell.SendKeys"reboot"
    oShell.SendKeys("{Enter}")

16

Re: VBScript: В случае успешного пинга выполнить действие

Для частного случая сойдет... А задержка в 1 секунду не всегда этого достаточно. Также фокус может уйти из окна, тогда уж проблем не оберешься.

17

Re: VBScript: В случае успешного пинга выполнить действие

Если пинги в локальной сети по ethernet больше, чем 1 секунда, то значит с сеткой что-то не так)).

18

Re: VBScript: В случае успешного пинга выполнить действие

Ребята, а как закрыть это телнетовское окно (cmd)? Именно закрыть окно,а не логаут из сессии.

19

Re: VBScript: В случае успешного пинга выполнить действие

OFF: cbh, не путайте: «telnet.exe» и «cmd.exe» — два совершенно разных приложения. Ничего общего у них, кроме того, что обе они консольные, нет.

Вы считаете, что закрыв окно консоли, Вы не закроете telnet-сессию? Я не уверен в этом.

20

Re: VBScript: В случае успешного пинга выполнить действие

Я уверен. Я просто неправильно выразился, мне нужно закрыть именно cmd окно.

21

Re: VBScript: В случае успешного пинга выполнить действие

Ткните мне пальцем, я не вижу нигде окна «cmd.exe».

22

Re: VBScript: В случае успешного пинга выполнить действие

В смысле? После того как я запускаю телнет, окно(cmd.exe) остается открытым, даже если я делаю logout из сессии. Вот мне и требуется закрыть это окно(cmd.exe). Я поискал в сети, нашел 2-3 варианта, но ни один из них не работает. Поэтому я и написал сюда.
http://www.geekinterview.com/talk/8530- … cript.html

23

Re: VBScript: В случае успешного пинга выполнить действие

Знаете, почему ни один из них не работает? Потому что это не окно командного процессора «cmd.exe», а окно «telnet.exe».

24

Re: VBScript: В случае успешного пинга выполнить действие

Вообще-то вы правы. Я просто тестировал прямо из cmd и совершенно забыл, что мой скрипт вызывает telnet.exe.
Ок перефразирую тогда как закрыть telnet.exe?
Я попробовал через

Dim objShell
objShell.SendKeys"%{F4}"
 
 Set objShell = Nothing
 WScript.Quit 0

Не получилось.

25

Re: VBScript: В случае успешного пинга выполнить действие

Ещё раз повторю: закрытие окна «telnet.exe» закроет и сессию. Так что Вам будет без разницы. А конкретная консольная команда выхода из сессии зависит от сервера telnet, к которому Вы стыкуетесь. Например, сервер telnet Microsoft запускает обычный интерпретатор команд, стало быть, команда будет «exit», затем обычный «quit». Либо переключитесь в командный режим (для microsoft'овского клиента telnet это «Ctrl-]», и пошлите команду «quit».

Только вот задачи эти никак не для «.SendKeys()», о чём Вам выше говорил коллега VSVLAD. Как Вы думаете, почему все используют либо WinSock, либо внешние утилиты, наподобие Telnet Script Executor, а не «.SendKeys()»?

26

Re: VBScript: В случае успешного пинга выполнить действие

Сделал. Спасибо за подсказку alexii

27 (изменено: tracerfisher, 2010-02-28 16:05:31)

Re: VBScript: В случае успешного пинга выполнить действие

Извините не могли бы вы мне помочь? Я новичок и писать скрипты не умею..((

Суть идеи:
Скрипт лежит в автозагрузке компьютера. При включении он запускается и начинает пинговать какой либо сервер в сети который постоянно онлайн. как только пользователь подключает интернет выполняется вот эта программа:

 WScript.Sleep (5000)
Set S = CreateObject("Wscript.Shell")
set FSO=createobject("scripting.filesystemobject")
On Error Resume Next
Call SendPost("smtp.mail.ru", "е-мейл получателя", "е-мейл отправителя", "тема", "текст")
Function SendPost(strSMTP_Server, strTo, strFrom, strSubject, strBody)
    Set iMsg = CreateObject("CDO.Message")
    Set iConf = CreateObject("CDO.Configuration")
    Set Flds = iConf.Fields
   
    Flds.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
    Flds.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
    Flds.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = "мыло отправителя без @mail.ru"
    Flds.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "пароль отправителя"
    Flds.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp.mail.ru" 
    Flds.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25 
    
    Flds.Update
    iMsg.Configuration = iConf
    iMsg.To = strTo
    iMsg.From = strFrom
    iMsg.Subject = strSubject
    iMsg.TextBody = strBody
    iMsg.AddAttachment "C:\ip.txt"
    iMsg.Send
End Function

    Set iMsg = Nothing
    Set iConf = Nothing
    Set Flds = Nothing

(НО при выполнении этой команды пинг продолжается)
Как только пинг пропал и снова появился - (при отключении и подключении интернета, не выключая компьютера(просто у пользователя динамический ip)) - снова выполняется команда выше. И так продолжается пока компьютер включен.

Я очень надеюсь на вашу помощь..

28

Re: VBScript: В случае успешного пинга выполнить действие

Хех, сам написал, ненадо уже))

29

Re: VBScript: В случае успешного пинга выполнить действие

Здравствуйте! Подскажите пожалуйста, как сделать так, чтоб скрипт постоянно пинговал определенный IP и в случае успешно пинга запускалась определенная служба на этом же компьютере, а в случае не успешного пинга - служба останавливалась.
Зараннее огромное спасибо!

30

Re: VBScript: В случае успешного пинга выполнить действие

nyevgen, видите ли в чём дело… Вот это:

а в случае не успешного пинга - служба останавливалась.

не выполнимо в принципе. Ибо, если удалённая машина не пингуется, то, соответственно, с ней нет связи, и нет возможности произвести с ней какие-либо действия.

Или я неправильно понял, и под «определенная служба на этом же компьютере» — здесь подразумевается всё ж не удалённая, локальная машина?

31 (изменено: nyevgen, 2010-06-01 18:05:17)

Re: VBScript: В случае успешного пинга выполнить действие

nyevgen, видите ли в чём дело… Вот это:

Служба должна запускать и останавливаться на локальном компьютере. В общем, есть интрнет через модем на две машины, скорость общая 2мб. Программой (эта программа имеет свою службу, которую предполагается запускать-останавливать), которая стоит на обоих машинах траффик ограничевается пополам (так как модем не настраивается на такое). Нужно чтоб служба запускалась когда вторая машина включается и наоборот.

32

Re: VBScript: В случае успешного пинга выполнить действие

Ага, теперь ясно, что я понял Вас неправильно.

Но как понимать это — в последнем посте:

nyevgen пишет:

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

в предыдущем посте:

nyevgen пишет:

в случае успешно пинга запускалась определенная служба на этом же компьютере

Судя по всему, правильным всё же следует считать первое техзадание .

Попробуйте примерно так:

Option Explicit

Dim objSWbemServicesEx, collSWbemObjectSet, objSWbemObjectEx

Dim strAddress
Dim strServiceName


strAddress     = "localhost"
strServiceName = "Messenger"

Set objSWbemServicesEx = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")

Do
    Set collSWbemObjectSet = objSWbemServicesEx.ExecQuery("SELECT * FROM Win32_PingStatus WHERE Address = '" & strAddress & "'")
    
    For Each objSWbemObjectEx In collSWbemObjectSet
        If IsNull(objSWbemObjectEx.StatusCode) Or objSWbemObjectEx.StatusCode <> 0 Then
            With objSWbemServicesEx.Get("Win32_Service.Name='" & strServiceName & "'")
                If .State <> "Stopped" Then
                    .StopService
                End If
            End With
        Else
            With objSWbemServicesEx.Get("Win32_Service.Name='" & strServiceName & "'")
                If .State <> "Running" Then
                    .StartService
                End If
            End With
        End If
        
        Exit For
    Next
    
    WScript.Sleep 30 * 1000
Loop

Set collSWbemObjectSet = Nothing
Set objSWbemServicesEx = Nothing

WScript.Quit 0

«strAddress», «strServiceName» — используйте свои данные. Опрос производится каждые 30 секунд. Прервать работу скрипта можно только извне.

33

Re: VBScript: В случае успешного пинга выполнить действие

Я потом немного поправил на

"Нужно чтоб служба запускалась когда вторая машина включается и наоборот."

- извените, пожалуйста за невнимательность.

Я так понял что Вы сделали наоборот, т.е. вторая машина запускается и служба останавливается?! Значит, если я поменяю местами Running и Stopped, а также StartService и StopService соответственно - получится то, что мне нужно? Я правильно понял? И еще, название службы выглядит так "xxx 10.0.553" - для скрипта "пробел" не страшен?

Помогите мне пожалуйста, я уже замучался искать что-то подобное, а в скриптах я не силен.
Огромное спасибо за скрипт и помощь!

34

Re: VBScript: В случае успешного пинга выполнить действие

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

Нет.

…
strServiceName = "xxx 10.0.553"
…
' Если не удалось найти имя/адрес или статус пинга отличен от нуля, то…
If IsNull(objSWbemObjectEx.StatusCode) Or objSWbemObjectEx.StatusCode <> 0 Then
    ' Получаем объект указанной службы…
    With objSWbemServicesEx.Get("Win32_Service.Name='" & strServiceName & "'")
        ' Если указанная служба уже не остановлена, то…
        If .State <> "Stopped" Then
            ' …останавливаем её.
            .StopService
        End If
    End With
…

35 (изменено: nyevgen, 2010-06-02 10:34:25)

Re: VBScript: В случае успешного пинга выполнить действие

alexii пишет:

strServiceName = "xxx 10.0.553"

Спасибо Вам огромное! Все работает!

36

Re: VBScript: В случае успешного пинга выполнить действие

Друзья,  здраствуйте)  у меня  пару вопросов...
Нужно сделать такую штуку.
у меня  локалка и  инет...+ стоит  прокси, который раздаёт инет в локалку определённым  клиентам
я   качаю   постоянно  торрентом...так как не всегда  клиенты  в сети.  и вот когда  они приходят, то  у них инет  лагает,  так  как  я  забираю себе  всю  скорость...
так  вот  мне б  такую  тему  замутить, чтоб   при   положительном  пинге до них  скорость  у торрента ограничивалась.
помогите пжл.

37

Re: VBScript: В случае успешного пинга выполнить действие

И в чём проблема? Для меня неясно одно — как сделать «скорость  у торрента ограничивалась». Вы знаете как?

38

Re: VBScript: В случае успешного пинга выполнить действие

В чём?)  да вот я  сам не  вкурсе.
давайте  ещё появне  напишу, может непонятно.
Стоит комп ( серв )   у него есть доступ  в инет  через   модем и доступ   в сеть локальную. посредством инета  серв  постоянно качает  из торрента utorrent клиентом.  на  серваке  стоит   прокси, который  раздаёт интернет. в то время как  серв  качает  торрентом,  то  у других  , да и  у него самого,  виснут  страницы в браузерах, потому что  торрент  на  себя  всё  забирает...
так вот  мне бы  такой  скриптик,  который  автоматом  снижает активность торрента   при  активности  другого   софта  на серваке или  на   клиентах.

39 (изменено: nyevgen, 2010-09-28 14:07:48)

Re: VBScript: В случае успешного пинга выполнить действие

Скажите пожалуйста, как этот скрипт реализовать в Windows 7? Запускаю, ничего не происходит, скорее всего дело в правах? Запускал от имени администратора - то же самое.

40

Re: VBScript: В случае успешного пинга выполнить действие

nyevgen пишет:

…как этот скрипт…

Хотя бы для приличия стоит указывать явно — какой именно; их в этой теме несколько. Если Вы про #32, то, для начала, проверьте «ручками», существует ли вообще служба «Messenger»: если мне не изменяет память, то ли в Vista, то ли в Windows 7 её убрали в принципе.

41 (изменено: nyevgen, 2010-09-29 14:06:40)

Re: VBScript: В случае успешного пинга выполнить действие

Служба должна запускать и останавливаться на локальном компьютере. В общем, есть интрнет через модем на две машины, скорость общая 2мб. Программой (эта программа имеет свою службу, которую предполагается запускать-останавливать), которая стоит на обоих машинах траффик ограничевается пополам (так как модем не настраивается на такое). Нужно чтоб служба запускалась когда вторая машина включается и наоборот.

Вот это нуно организовать в windows 7. Запускал от имени администратора - ничего не происходит. Я думаю может все дело в правах??? Служба программы Tmeter.

42

Re: VBScript: В случае успешного пинга выполнить действие

Не в курсе. Нет ни «windows 7», ни «Tmeter».

43 (изменено: as_lan, 2010-10-17 16:09:21)

Re: VBScript: В случае успешного пинга выполнить действие

Добрый день. кто бы смог написать скрип который при удачном пинге выполнял бы определенную команду, как только комп перестает быть доступен(выключается) выполняется другая программа. В сети два комп, главный и ноут. На главном периодически запускается торрент который отъедает весь канал. В наличии есть скрипт который следит за определенный процессом( в данном случае это опера) и как только этот процесс найдет выполняется команда для снижения скорости. Как только выключается опера выполняется другая команда для восстановления. Можно ли в этот скрипт дописать строки чтоб кроме как слежения за процессом было слежением и за доступностью сетевого комп. Вот содержимое скрипта.
 

'Версия 1.5  (Final)
'Настройки'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Public Const InstallPath = "C:\Program Files\uTorrent\"         ' - путь к папке, где лежит "utspeed.exe" [Str]
Public Const MonitorProcess = "opera.exe"                       ' - название отслеживаемого процесса [Str]
Public Const Mode = 0                                           ' - режимы: 0 - лимиты, 1 - расписание, 2 - ipfilter [0/1/2]
Public Const FileNameOn = "UT Limiter [on].vbs"                 ' - имя файла при включенном скрипте [Str]
Public Const FileNameOff = "UT Limiter [off].vbs"               ' - имя файла при выключенном скрипте [Str]
Public Const DownloadDefault = 60                               ' - нормальная скорость скачки [кб/c]
Public Const UploadDefault = 60                                 ' - нормальная скорость отдачи [кб/c]
Public Const DownloadLimit = 5                                  ' - ограничение скорости скачки при обнаруж. процесса [кб/c]
Public Const UploadLimit = 20                                   ' - ограничение скорости отдачи при обнаруж. процесса [кб/c]
Public Const IdleTime = 15                                      ' - время простоя до частичного восстановл. скорости [сек.]
Public Const IdleDownSpeed = 50                                 ' - скорость скачки во время простоя [кб/c]
Public Const IdleUpSpeed = 50                                   ' - скорость отдачи во время простоя [кб/c]
Public Const AwayTime = 50                                      ' - время отсутствия до полного восстановл. скорости [сек.]
Public Const AwayDownSpeed = 50                                 ' - скорость скачки во время отсутствия [кб/c]
Public Const AwayUpSpeed = 50                                   ' - скорость отдачи во время отсутствия [кб/c]

'Инициализация'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

IsLimited = 2

Set objShell = CreateObject("Shell.Application")
Set Fso = CreateObject("Scripting.FileSystemObject")
Set f = Fso.GetFile(Wscript.ScriptFullName)
Set oAutoIt = WScript.CreateObject("AutoItX3.Control")

If Fso.FileExists(InstallPath & "utspeed.exe") = false then
Msgbox "Сначала укажите путь к папке!   ", vbInformation + vbOKOnly, "UT Limiter"
ExitScript
End if

If f.Name = FileNameOn then
ExitScript
else
f.Name = FileNameOn
End if

'Мониторинг''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Do

 If oAutoIt.ProcessExists(MonitorProcess) then
 IsLimited = SetLimitsTrue(IsLimited)
 else
 IsLimited = SetLimitsFalse(IsLimited)
 End if

 If Fso.FileExists(FileNameOn) = false then
 IsLimited = SetLimitsFalse(IsLimited)
 ExitScript
 End if

  PrevMpos = 0
  
  Do while oAutoIt.ProcessExists(MonitorProcess) and oAutoIt.ProcessExists("utorrent.exe")
  
   If Fso.FileExists(FileNameOn) = false then
   IsLimited = SetLimitsFalse(IsLimited)
   ExitScript
   End if
   
   CurMpos = oAutoIt.MouseGetPosX
   StartTime = Timer
    Do while CurMpos = PrevMpos
     If Timer - StartTime > IdleTime then
     IsLimited = SetIdleLimits(IsLimited)
     End if
     If Timer - StartTime > AwayTime then
     IsLimited = SetAwayLimits(IsLimited)
     End if
     Wscript.Sleep 200
     CurMpos = oAutoIt.MouseGetPosX
    Loop
    If IsLimited = 3 or IsLimited = 4 then
    IsLimited = SetLimitsTrue(IsLimited)
    End if
   PrevMpos = CurMpos
   Wscript.Sleep 500
  Loop
 
Wscript.Sleep 500
Loop

'Функции'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Function SetLimitsTrue (IsLimited)
 If IsLimited <> 1 and Mode = 0 and oAutoIt.ProcessExists("utorrent.exe") then
  objShell.ShellExecute "utspeed.exe", "/max_dl_rate " & DownloadLimit & " /max_ul_rate " & UploadLimit, InstallPath
  oAutoIt.ProcessWaitClose "utspeed.exe"
  IsLimited = 1
 End if
 If IsLimited <> 1 and Mode = 1 and oAutoIt.ProcessExists("utorrent.exe") then
  objShell.ShellExecute "utspeed.exe", "/sched_enable 1", InstallPath
  oAutoIt.ProcessWaitClose "utspeed.exe"
  IsLimited = 1
 End if
 If IsLimited <> 1 and Mode = 2 and oAutoIt.ProcessExists("utorrent.exe") then
  objShell.ShellExecute "utspeed.exe", "/ipfilter.enable 1", InstallPath
  oAutoIt.ProcessWaitClose "utspeed.exe"
  IsLimited = 1
 End if 
 SetLimitsTrue = IsLimited
End Function

Function SetLimitsFalse (IsLimited)
 If IsLimited <> 0 and Mode = 0 and oAutoIt.ProcessExists("utorrent.exe") then
  objShell.ShellExecute "utspeed.exe", "/max_dl_rate " & DownloadDefault & " /max_ul_rate " & UploadDefault, InstallPath
  oAutoIt.ProcessWaitClose "utspeed.exe"
  IsLimited = 0
 End if
 If IsLimited <> 0 and Mode = 1 and oAutoIt.ProcessExists("utorrent.exe") then
  objShell.ShellExecute "utspeed.exe", "/sched_enable 0", InstallPath
  oAutoIt.ProcessWaitClose "utspeed.exe"
  IsLimited = 0
 End if
 If IsLimited <> 0 and Mode = 2 and oAutoIt.ProcessExists("utorrent.exe") then
  objShell.ShellExecute "utspeed.exe", "/ipfilter.enable 0", InstallPath
  oAutoIt.ProcessWaitClose "utspeed.exe"
  IsLimited = 0
 End if
 SetLimitsFalse = IsLimited
End Function

Function SetIdleLimits (IsLimited)
 If IsLimited <> 3 and IsLimited <> 4  and Mode = 0 and oAutoIt.ProcessExists("utorrent.exe") then   
  objShell.ShellExecute "utspeed.exe", "/max_dl_rate " & IdleDownSpeed & " /max_ul_rate " & IdleUpSpeed, InstallPath
  oAutoIt.ProcessWaitClose "utspeed.exe"
  IsLimited = 3
 End if
 SetIdleLimits = IsLimited
End Function

Function SetAwayLimits (IsLimited)
 If IsLimited <> 4  and Mode = 0 and oAutoIt.ProcessExists("utorrent.exe") then   
  objShell.ShellExecute "utspeed.exe", "/max_dl_rate " & AwayDownSpeed & " /max_ul_rate " & AwayUpSpeed, InstallPath
  oAutoIt.ProcessWaitClose "utspeed.exe"
  IsLimited = 4
 End if
 If IsLimited <> 4  and Mode = 1 and oAutoIt.ProcessExists("utorrent.exe") then   
  objShell.ShellExecute "utspeed.exe", "/sched_enable 0", InstallPath
  IsLimited = 4
 End if
 If IsLimited <> 4  and Mode = 2 and oAutoIt.ProcessExists("utorrent.exe") then   
  objShell.ShellExecute "utspeed.exe", "/ipfilter.enable 0", InstallPath
  IsLimited = 4
 End if
 SetAwayLimits = IsLimited
End Function

Function ExitScript
on error resume next
f.Name = FileNameOff
Wscript.Quit
End Function

44

Re: VBScript: В случае успешного пинга выполнить действие

И еще такой вопрос. Немного нубское построение будет, но попытаюсь объяснить как могу. 
Допустим скрипт при выполнении должен сравнить два случая. (в итоге даст "правда" или "ложь"). Только могут быть случаи когда одно сравнение даст нам "правда" а другое "ложь" и наоборот. Так вот, как сделать так чтоб было следующим образом правда*правда=правда, ложь*правда=правда, правда*ложь=правда, ложь*ложь=ложь. Просто решил переделать скрипт и столкнулся с такой проблемой

45

Re: VBScript: В случае успешного пинга выполнить действие

правда*ложь=правда

Булева алгебра не поддерживает такую логику . К тому же, «Правдой» не оперируют; правильно — «Истина» и «Ложь».

Вопрос какой-то бессмысленный.

46 (изменено: as_lan, 2010-10-18 19:19:37)

Re: VBScript: В случае успешного пинга выполнить действие

Я второй день как ковыряюсь в скриптах. Поэтому мог не правильно сформулировать вопрос. Уже сам нашел решение. не спорю могут быть и другие решения, но я додумался только до этого. Главное работает остальное не  так важно
Что бы было понятно что я хотел приведу часть кода

 Do

        Set collSWbemObjectSet = objSWbemServicesEx.ExecQuery("SELECT * FROM Win32_PingStatus WHERE Address = '" & strAddress & "'")
        For Each objSWbemObjectEx In collSWbemObjectSet
        If IsNull(objSWbemObjectEx.StatusCode) Or objSWbemObjectEx.StatusCode  <> 0 Then
            X = false
        else
            X = true
              
        End If
    Next
    Wscript.Sleep 15000


        If oAutoIt.ProcessExists(MonitorProcess) then
           Y = True
        Else 
           Y = False 
        End If
    Wscript.Sleep 1000
    

        If X Or Y Then
        IsLimited = SetLimitsTrue(IsLimited)    
        Else 
        IsLimited = SetLimitsFalse(IsLimited)