PDA

Показать полную графическую версию : [решено] Дописать скрипт для процедуры ping и записи в log.txt


zavoruev
09-10-2012, 15:50
Всем добрый день!
Существует скрипт на 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
Заменить указанное:
WScript.Stdout.WriteLine FormatDateTime(Time(), vbLongTime) & " " & strText

на:
WScript.Stdout.WriteLine Now() & " " & strText

Iska
09-10-2012, 18:16
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
Iska,
А подскажи пож-та, что делает второй скрипт и его принцип работы?
Если можно то закоментировать процессы в самом скрипте.
И еще раз большое спасибо))

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

Iska
09-10-2012, 19:46
zavoruev, примерно то же самое, только без «ping.exe». Принцип работы основан на Wbem, используется класс Win32_PingStatus (http://msdn.microsoft.com/en-us/library/windows/desktop/aa394350(v=vs.85).aspx).

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

Как можно автоматически завершить выполнение приведенного мною скрипта каждый день в 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
09-10-2012, 21:09
Цитата zavoruev:
Если можно то закоментировать процессы в самом скрипте. »
Ваш вопрос не понятен. Поясните. »

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

Во сколько будет запускать? Если с утра или просто после полуночи — например, так: »
Запускаться скрипт должен в 9.00 а в 19.00 завершаться. В примере
If DateDiff("h", Time(), TimeSerial(20, 0, 0)) = 0 Then
Exit Do
End If

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

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

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

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

Iska
09-10-2012, 22:51
Ну вот примерно так: »
Спасибо, ясно. Давайте лучше наоборот: если Вам что-то непонятно — Вы спрашиваете. Как, например, Вы делаете это дальше:
В примере … я не понял что значит это условие (т.е завершение или наоборот запуск скрипта) и что означают цифры? »
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
11-10-2012, 00:56
Огромное человеческое спасибо за ответ!!!!

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

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

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

Iska
11-10-2012, 06:07
Я хотел спросить, в каком месте моего скрипта должно быть это условие с прерыванием цикла? »
Для скрипта из первого поста (http://forum.oszone.net/post-2002095.html#post2002095) темы:
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
Остался всего один вопросик)))

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

Iska
11-10-2012, 12:14
zavoruev, каким образом Вы вызываете скрипт на исполнение?

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

Iska
12-10-2012, 01:15
zavoruev, ищите проблему в Вашем командном файле.

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

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




© OSzone.net 2001-2012