【问题标题】:VB Script help in writing event logs to excelVB 脚本帮助将事件日志写入 excel
【发布时间】:2014-02-20 19:41:56
【问题描述】:

我有以下脚本可以从系统中获取事件日志并写入 Excel。它在“Windows 7”上运行良好,但在“Windows Server 2003”上,写入系统日志需要 7-8 分钟,并在几秒钟内写入应用程序日志。但是系统日志中的错误很少。

另一个问题是我在脚本中使用了 MyDate = DateAdd("h", -8, Now()) 但它获取了超过 12 小时前的日志。此时间计算功能不正确。

我们将非常感谢您的帮助。

这是脚本:

Option Explicit

Dim objFSO, objFolder, objFile, objWMI, objItem, objItem1, objItem2 ' Objects
Dim strComputer, strFileName, strFileOpen, strFolder, strPath, oExcel, oWB, oSheet, oSheet1, oSheet2  
Dim intEvent, intNumberID, intRecordNum, colLoggedEvents, colLoggedEvents2, colLoggedEvents3, MyDate, dtm, row,      row1, row2, Query, ServerTime
MyDate = DateAdd("h", -8, Now())

'---------------------------------------------------------

On Error Resume Next

Set oExcel=CreateObject("Excel.Application")
oExcel.Visible=true
Set oWB=oExcel.Workbooks.Open ("D:\EventLogs2.xls")
Set oSheet=oWB.Worksheets.Add ( , oWB.WorkSheets(oWB.WorkSheets.Count))
Set oSheet1=oWB.Worksheets.Add ( , oWB.WorkSheets(oWB.WorkSheets.Count))
Set oSheet2=oWB.Worksheets.Add ( , oWB.WorkSheets(oWB.WorkSheets.Count))
oSheet.Name="Application"
oSheet1.Name="Security"
oSheet2.Name="System"

strComputer = "." 
ServerTime = Now              

intRecordNum = 0
row = 0
row1 = 0
row2 = 0

' ----------------------------------------------------------
' WMI Core Section 
Set objWMI = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate,(Security)}!\\" _ 
& strComputer & "\root\cimv2")

Set colLoggedEvents = objWMI.ExecQuery _ 
       ("SELECT * FROM Win32_NTLogEvent where Logfile = 'Application' and " _ 
        & "EventType = '1' and TimeWritten > '" & MyDate & "'")
Set colLoggedEvents2 = objWMI.ExecQuery _ 
       ("SELECT * FROM Win32_NTLogEvent where Logfile = 'Security' and " _         
        & "EventType = '1' and TimeWritten > '" & MyDate & "'")
Set colLoggedEvents3 = objWMI.ExecQuery _ 
       ("SELECT * FROM Win32_NTLogEvent where Logfile = 'System' and " _ 
        & "EventType = '1' and TimeWritten > '" & MyDate & "'")

' ----------------------------------------------------------
' Next section loops through ID properties

For Each objItem in colLoggedEvents                                    
If objItem.EventType=1 then                                                        
row = row+1
osheet.Cells(row,1).Value = ("Logfile: " & objItem.Logfile _ 
& " source " & objItem.SourceName) 
osheet.Cells(row,2).Value = ("Message: " & objItem.Message)
osheet.Cells(row,3).Value = ("TimeGenerated: " & WMIDateStringToDate(objItem.TimeGenerated))
osheet.Cells(row,4).Value = ServerTime

End If
Next


For Each objItem1 in colLoggedEvents2
If objItem1.EventType=1 then
row1 = row1+1
osheet1.Cells(row1,1).Value = ("Logfile: " & objItem1.Logfile _ 
& " source " & objItem1.SourceName) 
osheet1.Cells(row1,2).Value = ("Message: " & objItem1.Message)
osheet1.Cells(row1,3).Value = ("TimeGenerated: " & WMIDateStringToDate(objItem1.TimeGenerated))
osheet1.Cells(row1,4).Value = ServerTime

End If
Next                                                               


For Each objItem2 in colLoggedEvents3        
If objItem2.EventType=1 then
row2 = row2+1
osheet2.Cells(row2,1).Value = ("Logfile: " & objItem2.Logfile _ 
& " source " & objItem2.SourceName) 
osheet2.Cells(row2,2).Value = ("Message: " & objItem2.Message)
osheet2.Cells(row2,3).Value = ("TimeGenerated: " & WMIDateStringToDate(objItem2.TimeGenerated))
osheet2.Cells(row2,4).Value = ServerTime

intRecordNum = intRecordNum +1
End If
Next

Function WMIDateStringToDate(dtmDate) 
 WMIDateStringToDate = CDate(Mid(dtmDate, 5, 2) & "/" & _ 
 Mid(dtmDate, 7, 2) & "/" & Left(dtmDate, 4) _ 
 & " " & Mid (dtmDate, 9, 2) & ":" & Mid(dtmDate, 11, 2) & ":" & Mid(dtmDate,13, 2)) 
End Function

oWB.save
oWB.Application.Quit
WScript.Quit

【问题讨论】:

  • 7-8 什么?分钟?小时?加仑?您是否确定脚本中的哪个步骤消耗了太多时间(例如,通过在每个步骤之前/之后记录时间戳)?
  • 抱歉,忘了说,7-8分钟。
  • 再一次,您确定脚本中的哪个步骤耗费了太多时间吗?
  • Ansgar Wiechers,其实我要去度假,我会在 3 月 10 日回到我的办公室,然后我会检查它,一定会让你知道。非常感谢您跟进此事。

标签: vbscript


【解决方案1】:

你不能只写一个 CSV 文件吗?

类似这样的:

Option Explicit

Dim objFSO, objFolder, objFile, objWMI, objItem, objItem1, objItem2 ' Objects
Dim strComputer, strFileName, strFileOpen, strFolder, strPath, oExcel, oWB, oSheet, oSheet1, oSheet2  
Dim intEvent, intNumberID, intRecordNum, colLoggedEvents, colLoggedEvents2, colLoggedEvents3, MyDate, dtm, row,      row1, row2, Query, ServerTime
MyDate = DateAdd("h", -8, Now())

'---------------------------------------------------------

On Error Resume Next

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.CreateTextFile("D:\EventLogs2.csv", True)

strComputer = "." 
ServerTime = Now              

intRecordNum = 0
row = 0
row1 = 0
row2 = 0

' ----------------------------------------------------------
' WMI Core Section 
Set objWMI = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate,(Security)}!\\" _ 
& strComputer & "\root\cimv2")

Set colLoggedEvents = objWMI.ExecQuery _ 
       ("SELECT * FROM Win32_NTLogEvent where Logfile = 'Application' and " _ 
        & "EventType = '1' and TimeWritten > '" & MyDate & "'")
Set colLoggedEvents2 = objWMI.ExecQuery _ 
       ("SELECT * FROM Win32_NTLogEvent where Logfile = 'Security' and " _         
        & "EventType = '1' and TimeWritten > '" & MyDate & "'")
Set colLoggedEvents3 = objWMI.ExecQuery _ 
       ("SELECT * FROM Win32_NTLogEvent where Logfile = 'System' and " _ 
        & "EventType = '1' and TimeWritten > '" & MyDate & "'")

' ----------------------------------------------------------
' Next section loops through ID properties

For Each objItem in colLoggedEvents                                    
If objItem.EventType=1 then                                                        
    objFile.WriteLine("Logfile: " & objItem.Logfile & "," & " source " & objItem.SourceName & "," & _
        "Message: " & objItem.Message & "," & _
        "TimeGenerated: " & WMIDateStringToDate(objItem.TimeGenerated) & "," & _
        ServerTime)
End If
Next


For Each objItem1 in colLoggedEvents2
If objItem1.EventType=1 then
    objFile.WriteLine("Logfile: " & objItem1.Logfile & "," & " source " & objItem1.SourceName & "," & _
        "Message: " & objItem1.Message & "," & _
        "TimeGenerated: " & WMIDateStringToDate(objItem1.TimeGenerated) & "," & _
        ServerTime)
End If
Next                                                               


For Each objItem2 in colLoggedEvents3        
If objItem2.EventType=1 then
    objFile.WriteLine("Logfile: " & objItem2.Logfile & "," & " source " & objItem2.SourceName & "," & _
        "Message: " & objItem2.Message & "," & _
        "TimeGenerated: " & WMIDateStringToDate(objItem2.TimeGenerated) & "," & _
        ServerTime)
End If
Next

Function WMIDateStringToDate(dtmDate) 
 WMIDateStringToDate = CDate(Mid(dtmDate, 5, 2) & "/" & _ 
 Mid(dtmDate, 7, 2) & "/" & Left(dtmDate, 4) _ 
 & " " & Mid (dtmDate, 9, 2) & ":" & Mid(dtmDate, 11, 2) & ":" & Mid(dtmDate,13, 2)) 
End Function

objFile.Close
Set objFile = Nothing
Set objFSO = Nothing

【讨论】:

  • 我会试试这个并告诉你,非常感谢你的回复。
  • 您的脚本在第 44、54 和 64 行抛出错误。原因是缺少“&”。我添加了“&”,但之后运行脚本没有任何反应,即使它没有抛出任何错误。
  • @IftakharAhmad 我刚刚编辑了答案并更正了您所说的内容。它会创建 CSV 文件吗?
  • 即使写入 CSV 也需要相同的时间。
  • 我们已经迁移到 Windows Server 2012 并且相同的脚本运行正常。它会在几秒钟内将事件日志写入 excel。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多