1

Тема: Обработка команды в CMD через VBS

Доброго времени суток.
Вопрос:
есть eventquery.vbs(Windows 2003), которая работает с логами системы. У меня есть запрос, который корректно срабатывает через CMD:

cscript EVENTQUERY.vbs /FI "Type eq warning and datetime eq 12/01/11,00:00:01AM-12/01/11,11:59:59PM" /v> c:/warning.txt

Необходимо ее запустить через VBS.

Использую вот так:

Set objShell = CreateObject("WScript.Shell")
Set OBJ1 = objShell.Exec("cscript EVENTQUERY.vbs /FI " & chr(34) & "Type eq error and datetime eq " & Month(date) & "/" & day(date) & "/" & year(date) & "00:00:01AM-" & Month(date) & "/" & day(date) & "/" & year(date) & ",11:59:59PM" & chr(34) & " /v> c:/error.txt")
WScript.Sleep 1000
set obj1 = nothing

Не подскажете, в чем ошибка?:|
PS.
Пробовал кавычки двойные убрать.
Пробовал написать полный адрес
  ....cscript c:\windows\system32\EVENTQUERY.vbs /FI ...."

2

Re: Обработка команды в CMD через VBS

У меня есть запрос, который корректно срабатывает через CMD:

Да ну? Не верю.

По вызову:

1. Перенаправление организует командный процессор, так что вызывать придётся именно его.
2. Кавычки в строковых константах достаточно удваивать.
3. Лучше использовать .Run с параметром ожидания.
4. Путь к скрипту надо указывать полностью.
5. Чтобы меньше путаться, лучше разделить формирование самой команды и её вызов в отдельные переменные.

По формату:
1. Разобраться, как правильно задавать фильтры.
2. Надо либо разобраться, как формируются значения времени в двенадцатичасовом (12-hour clock) формате:

Option Explicit

Dim arrDateTimes
Dim elem


arrDateTimes = Array( _
    CDate("31.12.2011 00:00:00"), _
    CDate("31.12.2011 00:00:01"), _
    CDate("31.12.2011 00:59:59"), _
    CDate("31.12.2011 01:00:00"), _
    CDate("31.12.2011 01:00:01"), _
    CDate("31.12.2011 11:59:59"), _
    CDate("31.12.2011 12:00:00"), _
    CDate("31.12.2011 12:00:01"), _
    CDate("31.12.2011 23:59:59") _
)

For Each elem In arrDateTimes
    WScript.Echo elem, vbTab, ShowEnUsDateTime(elem)
Next

WScript.Quit 0

Function ShowEnUsDateTime(dtDateTime)
    SetLocale("en-us")
    ShowEnUsDateTime = FormatDateTime(dtDateTime, vbShortDate) & " " & FormatDateTime(dtDateTime, vbLongTime)
    SetLocale("ru")
End Function
31.12.2011      12/31/2011 12:00:00 AM
31.12.2011 00:00:01      12/31/2011 12:00:01 AM
31.12.2011 00:59:59      12/31/2011 12:59:59 AM
31.12.2011 01:00:00      12/31/2011 1:00:00 AM
31.12.2011 01:00:01      12/31/2011 1:00:01 AM
31.12.2011 11:59:59      12/31/2011 11:59:59 AM
31.12.2011 12:00:00      12/31/2011 12:00:00 PM
31.12.2011 12:00:01      12/31/2011 12:00:01 PM
31.12.2011 23:59:59      12/31/2011 11:59:59 PM

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

Итог всех выкладок:

Option Explicit

Dim strCommand

With WScript.CreateObject("WScript.Shell")
    strCommand = "cscript.exe """ & .ExpandEnvironmentStrings("%SystemRoot%\system32\eventquery.vbs") & _
    """ /fi ""Type eq Error"" /fi ""Datetime eq " & _
    GetDateTimeForEventQuery(CDate(CStr(Date()) & " 00:00:00")) & "-" & _
    GetDateTimeForEventQuery(CDate(CStr(Date()) & " 23:59:59")) & """ /v"
    
    .Run "cmd.exe /c """ & strCommand & " >""c:\error.txt""", 1, True
End With

WScript.Quit 0

Function GetDateTimeForEventQuery(dtDateTime)
    SetLocale("en-us")
    GetDateTimeForEventQuery = FormatDateTime(dtDateTime, vbShortDate) & "," & Replace(FormatDateTime(dtDateTime, vbLongTime), " ", "")
    SetLocale("ru")
End Function

Ну, и, напоследок: на мой взгляд, проще самому выполнить запрос к журналам посредством «Win32_NTLogEvent».