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

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

zavoruev 09-10-2012 15:50 2002095

Дописать скрипт для процедуры ping и записи в log.txt
 
Всем добрый день!
Существует скрипт на VBS
Код:

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

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

function WriteLog(strText)
WScript.Stdout.WriteLine FormatDateTime(Time(), vbLongTime) & " " & 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)
loop
end function

и bat, который запускает этот VBS и файл для записи логов
Код:

cscript d:\ping\pingtime.vbs > d:\ping\ping.txt
Необходимо что бы в лог. файле кроме врями пингов впереди была еще и дата, т.к запускается на несколько дней для выявлении колизии в сети.

За ранее спасибо!

Iska 09-10-2012 17:50 2002170

Заменить указанное:
Код:

WScript.Stdout.WriteLine FormatDateTime(Time(), vbLongTime) & " " & strText
на:
Код:

WScript.Stdout.WriteLine Now() & " " & strText

Iska 09-10-2012 18:16 2002185

Код:

Option Explicit

Dim strHost
Dim lngCheckInterval

Dim objSWbemLocator
Dim objSWbemServicesEx
Dim collSWbemObjectSet
Dim objSWbemObjectEx

Dim objDictionary


'strHost          = "google.com"
strHost          = "192.0.0.22"
lngCheckInterval = 1000

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

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

Do
        Set collSWbemObjectSet = objSWbemServicesEx.ExecQuery("SELECT * FROM Win32_PingStatus WHERE Address = '" & strHost & "'")
       
        For Each objSWbemObjectEx In collSWbemObjectSet
                With objSWbemObjectEx
                        If Not IsNull(.StatusCode) Then
                                WScript.Echo Now(), .Address, .StatusCode, "[" & objDictionary.Item(.StatusCode) & "]", .ResponseTime
                        Else
                                WScript.Echo Now(), "Error!"
                        End If
                End With
               
                Exit For
        Next
       
        Set collSWbemObjectSet = Nothing
       
        WScript.Sleep lngCheckInterval
Loop

Set objSWbemServicesEx = Nothing
Set objSWbemLocator    = Nothing
Set objDictionary      = Nothing

WScript.Quit 0


zavoruev 09-10-2012 19:22 2002226

Iska,
А подскажи пож-та, что делает второй скрипт и его принцип работы?
Если можно то закоментировать процессы в самом скрипте.
И еще раз большое спасибо))

Да, и еще один вопросик)
Как можно автоматически завершить выполнение приведенного мною скрипта каждый день в 19.00. А шедулер будет запускать батник на следующий день!

Iska 09-10-2012 19:46 2002247

zavoruev, примерно то же самое, только без «ping.exe». Принцип работы основан на Wbem, используется класс Win32_PingStatus.

Цитата:

Цитата zavoruev
Если можно то закоментировать процессы в самом скрипте. »

Ваш вопрос не понятен. Поясните.

Цитата:

Цитата zavoruev
Как можно автоматически завершить выполнение приведенного мною скрипта каждый день в 19.00. А шедулер будет запускать батник на следующий день!»

Во сколько будет запускать? Если с утра или просто после полуночи — например, так:
читать дальше »
Код:

Option Explicit

Dim strHost
Dim lngCheckInterval

Dim objSWbemLocator
Dim objSWbemServicesEx
Dim collSWbemObjectSet
Dim objSWbemObjectEx

Dim objDictionary


'strHost          = "google.com"
strHost          = "192.0.0.22"
lngCheckInterval = 1000

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

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

Do
        Set collSWbemObjectSet = objSWbemServicesEx.ExecQuery("SELECT * FROM Win32_PingStatus WHERE Address = '" & strHost & "'")
       
        For Each objSWbemObjectEx In collSWbemObjectSet
                With objSWbemObjectEx
                        If Not IsNull(.StatusCode) Then
                                WScript.Echo Now(), .Address, .StatusCode, "[" & objDictionary.Item(.StatusCode) & "]", .ResponseTime
                        Else
                                WScript.Echo Now(), "Error!"
                        End If
                End With
               
                Exit For
        Next
       
        Set collSWbemObjectSet = Nothing
       
        WScript.Sleep lngCheckInterval
       
        If DateDiff("h", Time(), TimeSerial(20, 0, 0)) = 0 Then
                Exit Do
        End If

Loop

Set objSWbemServicesEx = Nothing
Set objSWbemLocator    = Nothing
Set objDictionary      = Nothing

WScript.Quit 0


Но Вы ведь Выше упоминали, что:
Цитата:

Цитата zavoruev
запускается на несколько дней »

? Как теперешнее с этим соотносится?!

zavoruev 09-10-2012 21:09 2002305

Цитата:

Цитата Iska
Цитата zavoruev:
Если можно то закоментировать процессы в самом скрипте. »
Ваш вопрос не понятен. Поясните. »

Ну вот примерно так:
Цитата:

Цитата zavoruev
' conHost -- адрес хоста для слежения
' conCheckInterval -- временной интервал
const conHost = "192.0.0.22", conCheckInterval = 1000
' создаём объект:
dim soWshShell : set soWshShell = CreateObject("WScript.Shell") »

Цитата:

Цитата Iska
Во сколько будет запускать? Если с утра или просто после полуночи — например, так: »

Запускаться скрипт должен в 9.00 а в 19.00 завершаться. В примере
Код:

If DateDiff("h", Time(), TimeSerial(20, 0, 0)) = 0 Then
                Exit Do
        End If

я не понял что значит это условие (т.е завершение или наоборот запуск скрипта) и что означают цифры?

Как это условие применимо к моему скрипту???)))

Цитата:

Цитата Iska
Но Вы ведь Выше упоминали, что:
Цитата zavoruev:
запускается на несколько дней »
? Как теперешнее с этим соотносится?! »

Когда клиентски компьютеры выключены, то нет смысла их пиговать. А скрипт будет запускаться и завершаться в течениии 5 дней, завершение нужно что бы не переполнять текстовый лог. файл.
После 3-х дней работы текстовый файл весил около 20 Мб, что очень много для моей задачи)

Iska 09-10-2012 22:51 2002371

Цитата:

Цитата zavoruev
Ну вот примерно так: »

Спасибо, ясно. Давайте лучше наоборот: если Вам что-то непонятно — Вы спрашиваете. Как, например, Вы делаете это дальше:
Цитата:

Цитата zavoruev
В примере … я не понял что значит это условие (т.е завершение или наоборот запуск скрипта) и что означают цифры? »

Код:

Do
        ' … здесь происходит опрос хоста, анализ, вывод результата и пауза заданной длительности.
       
        If DateDiff("h", Time(), TimeSerial(20, 0, 0)) = 0 Then
                Exit Do
        End If
Loop

Если разница в часах между текущим временем и заданным (20 часов) составляет 0 — прерываем цикл.

Здесь я должен принести Вам свои извинения, поскольку ввёл Вас в заблуждение: когда я отлаживал скрипт, я менял значения времени, и, поменяв на 20, забыл вернуть потребные Вам 19; укажите там конечно же «TimeSerial(19, 0, 0)».

Цитата:

Цитата zavoruev
Как это условие применимо к моему скрипту???))) »

Аналогичным образом.

zavoruev 11-10-2012 00:56 2003116

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

Цитата:

Цитата Iska
Цитата zavoruev:
Как это условие применимо к моему скрипту???))) »
Аналогичным образом. »

Я хотел спросить, в каком месте моего скрипта должно быть это условие с прерыванием цикла?

Я не пишу скрипты, и очень сложно понять что за чем нужно, по этому и просил про пояснение )))

Цитата:

Цитата zavoruev
Цитата Iska:
Цитата zavoruev:
Если можно то закоментировать процессы в самом скрипте. » »


Iska 11-10-2012 06:07 2003162

Цитата:

Цитата zavoruev
Я хотел спросить, в каком месте моего скрипта должно быть это условие с прерыванием цикла? »

Для скрипта из первого поста темы:
Код:

Function Main()
    Do
        WriteLog(GetHostStatus(conHost))
        WScript.Sleep(conCheckInterval)
       
        ' …здесь:
        If DateDiff("h", Time(), TimeSerial(19, 0, 0)) = 0 Then
                Exit Do
        End If

    Loop
End Function


zavoruev 11-10-2012 11:07 2003282

Остался всего один вопросик)))

Что необходимо написать в конце скрипта, что бы после завершения цикла автоматически закрывалось окно cmd.exe?
В батнике это команда exit в окне cmd.exe, а вот что написать в скрипте что бы закрылось окно cmd.exe не знаю)

Iska 11-10-2012 12:14 2003329

zavoruev, каким образом Вы вызываете скрипт на исполнение?

zavoruev 11-10-2012 15:58 2003474

Цитата:

Цитата zavoruev
и bat, который запускает этот VBS и файл для записи логов
Код:
cscript d:\ping\pingtime.vbs > d:\ping\ping.txt »


Iska 12-10-2012 01:15 2003877

zavoruev, ищите проблему в Вашем командном файле.

zavoruev 12-10-2012 12:01 2004029

Добрый день!
Так у меня и возник вопрос, как закрыть командную строку после завершения цикла VBS скрипта? Явно надо дать команду из VBS скрипта на закрытие командной строки!

zavoruev 18-10-2012 17:18 2007950

Все, проблема решена. Тему закрываю!
Огромное спасибо пользователю Iska,


Время: 20:56.

Время: 20:56.
© OSzone.net 2001-