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

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

darkAge 12-07-2013 17:17 2183757

Ping с выключением компа
 
Всех приветствую.
Задачу новую поставили мне, есть у нас скрипт который пингует нужную машину заданное количество времени

Код:

option explicit
' conHost -- адрес хоста для слежения
' conCheckInterval -- временной интервал
const conHost = " ip адрес", conCheckInterval = 1000

' создаём объект:
dim soWshShell : set soWshShell = CreateObject("WScript.Shell")
WScript.Quit Main()

function WriteLog(strText)
WScript.Stdout.WriteLine Now() & " " & strText
end function

function GetHostStatus(strHost)
dim oPing : set oPing = soWshShell.Exec("ping -n 1 " &

strHost)
dim strOut : strOut = ""
do
WScript.Sleep 100
if not oPing.Stdout.AtEndOfStream then
strOut = strOut & oPing.Stdout.ReadAll
end if
loop until oPing.Status = 1

dim oRegExp : set oRegExp = new RegExp
oRegExp.IgnoreCase = true
oRegExp.Pattern = "[^ ]+:.+TTL=[^\r\n]+"
dim oMatches : set oMatches = oRegExp.Execute(strOut)
if oMatches.Count > 0 then
GetHostStatus = oMatches(0).Value
else
GetHostStatus =

"Inaccessible!.."
end if
end function

function Main()
do
WriteLog(GetHostStatus(conHost))
WScript.Sleep(conCheckInterval)
' Опрос хоста, анализ, вывод результата и пауза заданной длительности ( если разница в часах между текущем временем и заданным (19) составляет 0 - прерывам цикл)
If DateDiff("h", Time(), TimeSerial(19, 0, 0)) = 0 Then
          Exit Do
    End If
loop
end function

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

Iska 12-07-2013 17:51 2183777

Скрипт явно унаследованный.

Объясните цель и смысл действа:
Цитата:

Цитата darkAge
он пинговал нужную машину раз в минуту на пример, длительностью к примеру 10 секунд, и если пинг отсутствует в течении допустим 5 минут, то компьютер выключался. »

и поясните, какой именно компьютер должен выключаться.

darkAge 12-07-2013 17:54 2183780

Iska, тот, который пингует.

В целях безопасности.

Iska 12-07-2013 18:36 2183813

darkAge, мне непонятен смысл «длительностью к примеру 10 секунд»: одного раза вполне достаточно.

Пробуйте (не проверялось):
читать дальше »
Код:

Option Explicit

Const lngInterval  = 300 ' (5 * 60) seconds
Const lngFrequency =  10 ' every 10 seconds


Dim strAddress

Dim objSWbemServicesEx
Dim objSWbemObjectEx

Dim lngCurrentInterval


strAddress = "MyServer" ' or IP address

Set objSWbemServicesEx = WScript.CreateObject("WbemScripting.SWbemLocator").ConnectServer(".", "root\cimv2")

lngCurrentInterval = 0

Do
        For Each objSWbemObject In objSWbemServicesEx.ExecQuery("SELECT * FROM Win32_PingStatus WHERE Address = '" & strAddress & "'")
                If Not IsNull(objSWbemObject.StatusCode) Then
                        If objSWbemObject.StatusCode = 0 Then
                                lngCurrentInterval = 0
                        End If
                End If
        Next
       
        If lngCurrentInterval >= lngInterval Then
                objSWbemServicesEx.Security_.Privileges.AddAsString "SeShutdownPrivilege", True
               
                For Each objSWbemObject In objSWbemServicesEx.ExecQuery("SELECT * FROM Win32_OperatingSystem")
                        objSWbemObject.Shutdown
                Next
               
                Exit Do
        End If
       
        WScript.Sleep lngFrequency
       
        lngCurrentInterval = lngCurrentInterval + lngFrequency
Loop

Set objSWbemServicesEx = Nothing

WScript.Quit 0


darkAge 15-07-2013 09:25 2184782

Вложений: 1
Вот что получается, что бы пока долго не ждать, сделал 60 секунд.
Код:

Option Explicit

Const lngInterval  =  60 ' (5 * 60) seconds
Const lngFrequency =  10 ' every 10 seconds


Dim strAddress

Dim objSWbemServicesEx
Dim objSWbemObjectEx

Dim lngCurrentInterval


strAddress = "192.168.4.1" ' or IP address

Set objSWbemServicesEx = WScript.CreateObject("WbemScripting.SWbemLocator").ConnectServer(".", "root\cimv2")

lngCurrentInterval = 0

Do
        For Each objSWbemObject In objSWbemServicesEx.ExecQuery("SELECT * FROM Win32_PingStatus WHERE Address = '" & strAddress & "'")
                If Not IsNull(objSWbemObject.StatusCode) Then
                        If objSWbemObject.StatusCode = 0 Then
                                lngCurrentInterval = 0
                        End If
                End If
        Next
       
        If lngCurrentInterval >= lngInterval Then
                objSWbemServicesEx.Security_.Privileges.AddAsString "SeShutdownPrivilege", True
               
                For Each objSWbemObject In objSWbemServicesEx.ExecQuery("SELECT * FROM Win32_OperatingSystem")
                        objSWbemObject.Shutdown
                Next
               
                Exit Do
        End If
       
        WScript.Sleep lngFrequency
       
        lngCurrentInterval = lngCurrentInterval + lngFrequency
Loop

Set objSWbemServicesEx = Nothing

WScript.Quit 0

В итоге выдает ошибку

Iska 15-07-2013 10:34 2184812

darkAge, увы мне, увы: надо-таки проверять. Хотя бы синтаксис.

Пробуйте:
читать дальше »
Код:

Option Explicit

Const lngInterval  = 60 ' seconds
Const lngFrequency = 10 ' every 10 seconds


Dim strAddress

Dim objSWbemServicesEx
Dim objSWbemObjectEx

Dim lngCurrentInterval


strAddress = "MyServer" ' or IP address

Set objSWbemServicesEx = WScript.CreateObject("WbemScripting.SWbemLocator").ConnectServer(".", "root\cimv2")

lngCurrentInterval = 0

Do
        For Each objSWbemObjectEx In objSWbemServicesEx.ExecQuery("SELECT * FROM Win32_PingStatus WHERE Address = '" & strAddress & "'")
                If Not IsNull(objSWbemObjectEx.StatusCode) Then
                        If objSWbemObjectEx.StatusCode = 0 Then
                                lngCurrentInterval = 0
                        End If
                End If
        Next
       
        If lngCurrentInterval >= lngInterval Then
                objSWbemServicesEx.Security_.Privileges.AddAsString "SeShutdownPrivilege", True
               
                For Each objSWbemObjectEx In objSWbemServicesEx.ExecQuery("SELECT * FROM Win32_OperatingSystem")
                        objSWbemObjectEx.Shutdown
                Next
               
                Exit Do
        End If
       
        WScript.Sleep lngFrequency * 1000
       
        lngCurrentInterval = lngCurrentInterval + lngFrequency
Loop

Set objSWbemServicesEx = Nothing

WScript.Quit 0


zavoruev 22-07-2013 17:10 2188709

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

1. данный скрипт запускается (допустим добавлением в автозагрузку) после чего осуществляется пинг удаленной машины на протяжении всего времени работы или только определенное время???

2. пинг работает каждые 10 секунд в минуту???

3. выключение будет осуществляться после 5 минут отсутствия связи с удаленной машиной??? т.е происходит анализ 50 неудачных попыток установить связь или последние 10 попыток????

4. Где поменять параметр не на выключение, а на перезагрузку??

5. Возможно дописать так, что бы был лог файл, с помощью которого можно было смотреть корректно ли отработал скрипт (перезагрузился после 50 неудачной попытки или 48!!!)

Iska 22-07-2013 17:22 2188714

Цитата:

Цитата zavoruev
осуществляется пинг удаленной машины на протяжении всего времени работы или только определенное время??? »

Постоянно.

Цитата:

Цитата zavoruev
2. пинг работает каждые 10 секунд в минуту??? »

Каждые десять секунд:
Код:

Const lngFrequency = 10 ' every 10 seconds
делается попытка получить ответ от удалённой машины. Если не было получено ни одного ответа от удалённой машины за указанный интервал времени:
Код:

Const lngInterval = 60 ' seconds
т.е., на шесть последовательных запросов не будет получено ни одного ответа — произойдёт попытка выключения текущей машины. Если же ответ будет получен — отсчёт интервала начнётся заново.

Цитата:

Цитата zavoruev
4. Где поменять параметр не на выключение, а на перезагрузку?? »

Здесь:
Код:

objSWbemObjectEx.Shutdown
на: Reboot method of the Win32_OperatingSystem class (Windows).

Цитата:

Цитата zavoruev
5. Возможно дописать так, что бы был лог файл, с помощью которого можно было смотреть корректно ли отработал скрипт (перезагрузился после 50 неудачной попытки или 48!!!) »

Можно. Пишите ;).

zavoruev 22-07-2013 18:24 2188736

Iska, т.е логика работы следующая

1. т.е каждые 10 секунд делается 1 запрос в виде icmp-пакета, за 60 секунд получается 6 запросов. Если будет стоять 300 секунд, соответственно в этом интервале будет 30 запросов. Я так понял????

2. и только если
Цитата:

Цитата Iska
на шесть (тридцать) последовательных запросов не будет получено ни одного ответа — произойдёт попытка выключения текущей машины. Если же ответ будет получен — отсчёт интервала начнётся заново. »

Так???

3.
Цитата:

Цитата Iska
5. Возможно дописать так, что бы был лог файл, с помощью которого можно было смотреть корректно ли отработал скрипт (перезагрузился после 50 неудачной попытки или 48!!!) »
Можно. Пишите . »

Если бы мог, до обязательно дописал, т.к нужен лог только в момент пинга (10 секунд из 60).
Жду Вашей помощи!!!))
За ранее огромное спасибо!

Iska 22-07-2013 18:34 2188744

1&2: Да.

Цитата:

Цитата zavoruev
Жду Вашей помощи!!!)) »

Зачем он Вам сдался? Ну, отключите сетевой кабель, отсчитайте минуту с небольшим, машина пошла на перезагрузку?

zavoruev 22-07-2013 18:54 2188753

Цитата:

Цитата Iska
Зачем он Вам сдался? Ну, отключите сетевой кабель, отсчитайте минуту с небольшим, машина пошла на перезагрузку? »

Согласен с Вами на 100%. Проверил, работает, и хорошо!!!

Но это еще необходимо для анализа среды передачи данных (радиоканал), т.к запускать второй скрипт приведенный в начале поста для анализ прохождения icmp пакетов не хочется. А так этот скрипт будет запускается по задаче в 8.00 утра, выключается в 23.30 и собирает логи. Сразу 2-х зайцев убиваю))))
Если это сложно, и займет время, то тогда не надо!

И еще один вопрос,
1. что это за параметр
Цитата:

"SeShutdownPrivilege"
вот в этой строке
Цитата:

objSWbemServicesEx.Security_.Privileges.AddAsString "SeShutdownPrivilege", True
2. И нужно его менять если я тут
Цитата:

Цитата Iska
Код:
objSWbemObjectEx.Shutdown »

поменяю на Reboot

Iska 23-07-2013 05:11 2188960

Цитата:

Цитата zavoruev
запускать второй скрипт приведенный в начале поста для анализ прохождения icmp пакетов не хочется. А так этот скрипт будет запускается по задаче в 8.00 утра, выключается в 23.30 и собирает логи. »

В начале поста? Может быть темы?! Тогда ткните мне пальцем где именно в нём осуществляется «анализ прохождения» и где «собираются логи».

Скажите, что Вы понимаете под «анализом среды передачи данных» и что для этого необходимо.
Цитата:

Цитата zavoruev
что это за параметр «SeShutdownPrivilege» вот в этой строке… И нужно его менять если…»

SWbemPrivilegeSet.AddAsString method (Windows)
Privilege Constants (Windows)
WMI: сеансы пользователя

zavoruev 23-07-2013 08:54 2188991

Доброе утро!!!!

Так сам скрипт который в начале поста, осуществляет запись результатов ping с прекращением работы в 19.00 (кстати этот скрипт дорабатывали именно Вы Iska, , за что Вам отдельное спасибо). Вот по этому, по умолчанию, я думал что будет переработан это скрипт с вариантом выключения/перезагрузки хоста.

Цитата:

Цитата Iska
Скажите, что Вы понимаете под «анализом среды передачи данных» и что для этого необходимо. »

Так как это радиоканал, то необходимо иногда смотреть логи на наличие/отсутствие пинга, время запроса-ответа ( качество радиоканала зависит от времени суток, погоды, и помех на определенной частоте, шумов). И иногда при отсутствии канала или его плохом качестве логирование спасет мир)))))

Я же говорил выше
Цитата:

Цитата zavoruev
Если это сложно, и займет время, то тогда не надо! »

Цитата:

Цитата Iska
Цитата zavoruev:
что это за параметр «SeShutdownPrivilege» вот в этой строке… И нужно его менять если…» »

Цитата:

Цитата Iska
WMI: сеансы пользователя »

Спасибо, все понятно!!!!

Iska 23-07-2013 09:06 2188996

Цитата:

Цитата zavoruev
который в начале поста »

Вы понимаете, что означает заимствованное слово «пост»?


Цитата:

Цитата zavoruev
логирование спасет мир))))) »

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

zavoruev 23-07-2013 09:15 2188998

Цитата:

Цитата Iska
Вы понимаете, что означает заимствованное слово «пост»? »

Хорошо, не поста, топика)))) признаю что не прав!!!

Цитата:

Цитата Iska
Вот я и прошу Вас рассказать мне подробно, в деталях, что и когда должно помещаться в лог-файл. »

Цитата:

Цитата zavoruev
А так этот скрипт будет запускается по задаче в 8.00 утра, выключается в 23.30 и собирает логи. »

Цитата:

Цитата zavoruev
нужен лог только в момент пинга.»

Получается что если это будет цикл будет 300 секунд и каждые 10 секунд будет выполняться запрос к удаленному хосту, то надо писать логи только 30 запросов.
Ну вот как бы и вся задача по сбору логов!!))

Iska 23-07-2013 10:28 2189031

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

zavoruev 23-07-2013 11:06 2189057

Цитата:

Цитата zavoruev
Так сам скрипт который в начале поста, осуществляет запись результатов ping с прекращением работы в 19.00 (кстати этот скрипт дорабатывали именно Вы Iska, , за что Вам отдельное спасибо). Вот по этому, по умолчанию, я думал что будет переработан это скрипт с вариантом выключения/перезагрузки хоста »

Надо там поправить не поста, а темы!!!

Вот тема, где Вы Iska, дописывали скрипт, т.к изначально в нем не было даты!!!
http://forum.oszone.net/thread-244258.html

и запускает этот vbs скрипт cmd файл с указанием куда писать
Цитата:

cscript d:\ping\pingtime.vbs > d:\ping\ping.txt
, а что писать обозначено в скрипте который в начале темы!!!!!!!

Вот точный вид лога, который создается скриптом в начале темы:
Код:

‘ҐаўҐа бжҐ**аЁҐў Windows (Microsoft R) ўҐабЁп 5.8
c Љ®аЇ®а*жЁп Њ*©Єа®б®дв (Microsoft Corp.), 1996-2001. ‚ᥠЇа*ў* §*йЁйҐ*л.

21.06.2013 14:14:21 192.168.1.21: зЁб«® Ў*©в=32 ўаҐ¬п=1¬б TTL=64
21.06.2013 14:14:22 192.168.1.21: зЁб«® Ў*©в=32 ўаҐ¬п=1¬б TTL=64
21.06.2013 14:14:23 192.168.1.21: зЁб«® Ў*©в=32 ўаҐ¬п=1¬б TTL=64
21.06.2013 14:14:24 192.168.1.21: зЁб«® Ў*©в=32 ўаҐ¬п=2¬б TTL=64
21.06.2013 14:14:25 192.168.1.21: зЁб«® Ў*©в=32 ўаҐ¬п=8¬б TTL=64
21.06.2013 14:14:26 192.168.1.21: зЁб«® Ў*©в=32 ўаҐ¬п=3¬б TTL=64
21.06.2013 14:14:27 192.168.1.21: зЁб«® Ў*©в=32 ўаҐ¬п=1¬б TTL=64
21.06.2013 14:14:28 192.168.1.21: зЁб«® Ў*©в=32 ўаҐ¬п=1¬б TTL=64
21.06.2013 14:14:30 192.168.1.21: зЁб«® Ў*©в=32 ўаҐ¬п=1¬б TTL=64

сейчас я надеюсь понятно объяснил??!!!:) Только в нашем варианте будет логироваться 1 пинг в 10 секунд ( по Вашему предложению)!! :mail1:

Iska 23-07-2013 13:40 2189146

Как-то так:
читать дальше »
Код:

Option Explicit

Const lngInterval  = 60 ' seconds
Const lngFrequency = 10 ' every 10 seconds


Dim objDictionary

Dim strAddress

Dim objSWbemServicesEx
Dim objSWbemObjectEx

Dim lngCurrentInterval


Set objDictionary = WScript.CreateObject("Scripting.Dictionary")

With objDictionary
        .Add 0,    "Success"
        .Add 11001, "Buffer Too Small"
        .Add 11002, "Destination Net Unreachable"
        .Add 11003, "Destination Host Unreachable"
        .Add 11004, "Destination Protocol Unreachable"
        .Add 11005, "Destination Port Unreachable"
        .Add 11006, "No Resources"
        .Add 11007, "Bad Option"
        .Add 11008, "Hardware Error"
        .Add 11009, "Packet Too Big"
        .Add 11010, "Request Timed Out"
        .Add 11011, "Bad Request"
        .Add 11012, "Bad Route"
        .Add 11013, "TimeToLive Expired Transit"
        .Add 11014, "TimeToLive Expired Reassembly"
        .Add 11015, "Parameter Problem"
        .Add 11016, "Source Quench"
        .Add 11017, "Option Too Big"
        .Add 11018, "Bad Destination"
        .Add 11032, "Negotiating IPSEC"
        .Add 11050, "General Failure"
End With

strAddress = "MyServer" ' or IP address

Set objSWbemServicesEx = WScript.CreateObject("WbemScripting.SWbemLocator").ConnectServer(".", "root\cimv2")

lngCurrentInterval = 0

Do
        For Each objSWbemObjectEx In objSWbemServicesEx.ExecQuery("SELECT * FROM Win32_PingStatus WHERE Address = '" & strAddress & "'")
                With objSWbemObjectEx
                        If Not IsNull(.StatusCode) Then
                                WScript.Echo Now(), .Address, .StatusCode, "[" & objDictionary.Item(.StatusCode) & "]", .ResponseTime
                               
                                If .StatusCode = 0 Then
                                        lngCurrentInterval = 0
                                End If
                        Else
                                WScript.Echo Now(), .Address, "Error!"
                        End If
                End With
        Next
       
        If lngCurrentInterval >= lngInterval Then
                objSWbemServicesEx.Security_.Privileges.AddAsString "SeShutdownPrivilege", True
               
                For Each objSWbemObjectEx In objSWbemServicesEx.ExecQuery("SELECT * FROM Win32_OperatingSystem")
                        'objSWbemObjectEx.Reboot
                Next
               
                Exit Do
        End If
       
        WScript.Sleep lngFrequency * 1000
       
        lngCurrentInterval = lngCurrentInterval + lngFrequency
Loop

Set objSWbemServicesEx = Nothing

objDictionary.RemoveAll()
Set objDictionary = Nothing

WScript.Quit 0


?!

zavoruev 23-07-2013 14:00 2189164

Цитата:

Цитата Iska
Как-то так: »

А куда в код скрипта добавить вот это
Код:

' Опрос хоста, анализ, вывод результата и пауза заданной длительности ( если разница в часах между текущем временем и заданным (19) составляет 0 - прерывам цикл)
If DateDiff("h", Time(), TimeSerial(19, 0, 0)) = 0 Then
          Exit Do
    End If

ограничение по времени работы скрипта!!!!

Остальное все работает!!!!! )))))) :up:

Iska 23-07-2013 14:51 2189201

Цитата:

Цитата zavoruev
А куда в код скрипта добавить вот это … ограничение по времени работы скрипта!!!! »

Сюда:

;).

Пардон, коль:
Цитата:

Цитата zavoruev
А так этот скрипт будет запускается по задаче в 8.00 утра, выключается в 23.30 »

то, не «11:00», а «15:30».

zavoruev 23-07-2013 15:10 2189218

Цитата:

Цитата Iska
Сюда: »

Очень полезная информация)))) :) :) :)

Но всегда должен быть альтернативный метод, при чем он на 90% уже есть!!!
Так ка на счет
Цитата:

Цитата zavoruev
А куда в код скрипта добавить вот это »

Код:

' Опрос хоста, анализ, вывод результата и пауза заданной длительности ( если разница в часах между текущем временем и заданным (19) составляет 0 - прерывам цикл)
If DateDiff("h", Time(), TimeSerial(19, 0, 0)) = 0 Then
          Exit Do
    End If

:mail1:

zavoruev 23-07-2013 23:22 2189474

:up: :up: :up:

Iska 24-07-2013 12:04 2189709

Пробуйте (не проверялось):
читать дальше »
Код:

Option Explicit

Const lngInterval  = 60 ' seconds
Const lngFrequency = 10 ' every 10 seconds


Dim objDictionary

Dim strAddress

Dim objSWbemServicesEx
Dim objSWbemObjectEx

Dim lngCurrentInterval


Set objDictionary = WScript.CreateObject("Scripting.Dictionary")

With objDictionary
        .Add 0,    "Success"
        .Add 11001, "Buffer Too Small"
        .Add 11002, "Destination Net Unreachable"
        .Add 11003, "Destination Host Unreachable"
        .Add 11004, "Destination Protocol Unreachable"
        .Add 11005, "Destination Port Unreachable"
        .Add 11006, "No Resources"
        .Add 11007, "Bad Option"
        .Add 11008, "Hardware Error"
        .Add 11009, "Packet Too Big"
        .Add 11010, "Request Timed Out"
        .Add 11011, "Bad Request"
        .Add 11012, "Bad Route"
        .Add 11013, "TimeToLive Expired Transit"
        .Add 11014, "TimeToLive Expired Reassembly"
        .Add 11015, "Parameter Problem"
        .Add 11016, "Source Quench"
        .Add 11017, "Option Too Big"
        .Add 11018, "Bad Destination"
        .Add 11032, "Negotiating IPSEC"
        .Add 11050, "General Failure"
End With

strAddress = "MyServer" ' or IP address

Set objSWbemServicesEx = WScript.CreateObject("WbemScripting.SWbemLocator").ConnectServer(".", "root\cimv2")

lngCurrentInterval = 0

Do
        For Each objSWbemObjectEx In objSWbemServicesEx.ExecQuery("SELECT * FROM Win32_PingStatus WHERE Address = '" & strAddress & "'")
                With objSWbemObjectEx
                        If Not IsNull(.StatusCode) Then
                                WScript.Echo Now(), .Address, .StatusCode, "[" & objDictionary.Item(.StatusCode) & "]", .ResponseTime
                               
                                If .StatusCode = 0 Then
                                        lngCurrentInterval = 0
                                End If
                        Else
                                WScript.Echo Now(), .Address, "Error!"
                        End If
                End With
        Next
       
        If lngCurrentInterval >= lngInterval Then
                objSWbemServicesEx.Security_.Privileges.AddAsString "SeShutdownPrivilege", True
               
                For Each objSWbemObjectEx In objSWbemServicesEx.ExecQuery("SELECT * FROM Win32_OperatingSystem")
                        objSWbemObjectEx.Reboot
                Next
               
                Exit Do
        End If
       
        WScript.Sleep lngFrequency * 1000
       
        lngCurrentInterval = lngCurrentInterval + lngFrequency
       
        If DateDiff("h", Time(), TimeSerial(23, 30, 0)) = 0 Then
                Exit Do
        End If
Loop

Set objSWbemServicesEx = Nothing

objDictionary.RemoveAll()
Set objDictionary = Nothing

WScript.Quit 0


zavoruev 24-07-2013 16:16 2189835

Цитата:

Цитата Iska
Пробуйте (не проверялось):
читать дальше » »

Не работает, скрипт перестает работать после первого цикла!!!

Iska 24-07-2013 16:52 2189864

Цитата:

Цитата zavoruev
Не работает, скрипт перестает работать после первого цикла!!! »

Не верю. В строке с «DateDiff(…)», конечно, есть ошибка с вычислением. Но и только:
читать дальше »
Код:

Option Explicit

Const lngInterval  = 60 ' seconds
Const lngFrequency = 10 ' every 10 seconds


Dim objDictionary

Dim strAddress

Dim objSWbemServicesEx
Dim objSWbemObjectEx

Dim lngCurrentInterval
Dim i


Set objDictionary = WScript.CreateObject("Scripting.Dictionary")

With objDictionary
        .Add 0,    "Success"
        .Add 11001, "Buffer Too Small"
        .Add 11002, "Destination Net Unreachable"
        .Add 11003, "Destination Host Unreachable"
        .Add 11004, "Destination Protocol Unreachable"
        .Add 11005, "Destination Port Unreachable"
        .Add 11006, "No Resources"
        .Add 11007, "Bad Option"
        .Add 11008, "Hardware Error"
        .Add 11009, "Packet Too Big"
        .Add 11010, "Request Timed Out"
        .Add 11011, "Bad Request"
        .Add 11012, "Bad Route"
        .Add 11013, "TimeToLive Expired Transit"
        .Add 11014, "TimeToLive Expired Reassembly"
        .Add 11015, "Parameter Problem"
        .Add 11016, "Source Quench"
        .Add 11017, "Option Too Big"
        .Add 11018, "Bad Destination"
        .Add 11032, "Negotiating IPSEC"
        .Add 11050, "General Failure"
End With

strAddress = "google.com" ' or IP address

Set objSWbemServicesEx = WScript.CreateObject("WbemScripting.SWbemLocator").ConnectServer(".", "root\cimv2")

lngCurrentInterval = 0
i = 0

Do
        For Each objSWbemObjectEx In objSWbemServicesEx.ExecQuery("SELECT * FROM Win32_PingStatus WHERE Address = '" & strAddress & "'")
                With objSWbemObjectEx
                        If Not IsNull(.StatusCode) Then
                                WScript.Echo Now(), .Address, .StatusCode, "[" & objDictionary.Item(.StatusCode) & "]", .ResponseTime
                               
                                If .StatusCode = 0 Then
                                        lngCurrentInterval = 0
                                End If
                        Else
                                WScript.Echo Now(), .Address, "Error!"
                        End If
                End With
        Next
       
        If lngCurrentInterval >= lngInterval Then
                objSWbemServicesEx.Security_.Privileges.AddAsString "SeShutdownPrivilege", True
               
                For Each objSWbemObjectEx In objSWbemServicesEx.ExecQuery("SELECT * FROM Win32_OperatingSystem")
                        'objSWbemObjectEx.Reboot
                Next
               
                Exit Do
        End If
       
        WScript.Sleep lngFrequency * 1000
       
        lngCurrentInterval = lngCurrentInterval + lngFrequency
       
        If DateDiff("h", Time(), TimeSerial(23, 30, 0)) = 0 Then
                Exit Do
        End If
       
        i = i + 1
        WScript.Echo i
Loop

Set objSWbemServicesEx = Nothing

objDictionary.RemoveAll()
Set objDictionary = Nothing

WScript.Quit 0

Результат
Код:

24.07.2013 16:52:22 google.com 0 [Success] 79
1
24.07.2013 16:52:32 google.com 0 [Success] 278
2
24.07.2013 16:52:43 google.com 11010 [Request Timed Out] null
3
24.07.2013 16:52:55 google.com 11010 [Request Timed Out] null
4
24.07.2013 16:53:06 google.com 0 [Success] 544
5
24.07.2013 16:53:16 google.com 0 [Success] 73


zavoruev 24-07-2013 17:26 2189885

Цитата:

Цитата Iska
Не верю. В строке с «DateDiff(…)», конечно, есть ошибка с вычислением. Но и только: »

А что за ошибка???
Т.к для тестирования я ставил текущее время +5 минут что бы проверить. И после этого скрипт прекращал свою работу, отработав только один цикл.
После Вашего последнего сообщения запустил скрипт с временем 23.30.0 и он работает нормально!!!))

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

Iska, Вам огромное человеческое спасибо!!!!! Теперь есть 2 способа завершить работу скрипта))))
Тему можно закрывать!!!)

Iska 24-07-2013 18:18 2189924

Цитата:

Цитата zavoruev
Цитата:

Цитата Iska
В строке с «DateDiff(…)», конечно, есть ошибка с вычислением. »

А что за ошибка??? »

Цитата:

Цитата zavoruev
Все дело в том, что сравниваются часы, а не минуты. »

Именно. Только часы. Надо править условие.

Цитата:

Цитата zavoruev
Вот по этому скрипт и перестает работать!!! »

Это как?

Цитата:

Цитата zavoruev
Тему можно закрывать!!!) »

Повторю: надо править условие.

zavoruev 24-07-2013 18:22 2189925

Цитата:

Цитата Iska
Цитата zavoruev:
Вот по этому скрипт и перестает работать!!! »
Это как? »

по тому что в
Код:

If DateDiff
стоит значение
Код:

H
т.е как я понимаю часы.

А условие такое
Цитата:

Опрос хоста, анализ, вывод результата и пауза заданной длительности ( если разница в часах между текущем временем и заданным (h) составляет 0 - прерывам цикл)
Отсюда и это
Цитата:

Цитата Iska
Вот по этому скрипт и перестает работать!!! » »


Iska 24-07-2013 18:27 2189930

zavoruev, так прерываться-то он должен в 23 часа. У Вас сколько на часах тогда было?

zavoruev 24-07-2013 18:44 2189941

Так я же Вам писал)))
Цитата:

Цитата zavoruev
Т.к для тестирования я ставил текущее время +5 минут что бы проверить. И после этого скрипт прекращал свою работу, отработав только один цикл.
После Вашего последнего сообщения запустил скрипт с временем 23.30.0 и он работает нормально!!!)) »

Надо править условие так, чтобы сравнивались еще и минуты!)))

Iska 24-07-2013 19:07 2189958

zavoruev, давайте так: от скольки и до скольки скрипт не должен работать ни в коем случае?

zavoruev 24-07-2013 20:07 2189991

Цитата:

Цитата Iska
zavoruev, давайте так: от скольки и до скольки скрипт не должен работать ни в коем случае? »

Уважаемы Iska, вот в этом сообщении http://forum.oszone.net/post-2189885-26.html я Вас поблагодарил за Ваши труды!!! и мучения со мной)))
Доработать условие попробую сам! Если не получится, то обязательно сообщу!)))

Еще раз огромное спасибо!! :good:


Время: 16:48.

Время: 16:48.
© OSzone.net 2001-