Win32_NTLogEvent свойство сообщения FilSystemObject.Write проблема вызова процедуры

Я пишу сценарий для записи информации журнала событий в CSV. Мой сценарий работал раньше. Но я изменил некоторые вещи, которые не должны влиять на запись в CSV. Я пытался писать в Unicode и ASCII, основываясь на некоторых исследованиях, которые я провел в Интернете по этому вопросу. Ни один не имеет значения. Странно то, что позже я использую тот же код в своем сценарии для записи других журналов (сначала я пишу системные журналы, затем пишу журналы приложений и т. Д.), И он прекрасно работает там. Код, который я использую, является временным, так как я не нашел способа удалить возврат каретки из сообщений (что вызывает проблемы с импортом CSV в Excel). Так что это может исправить себя, как только я это сделаю. Но похоже, что это более серьезная проблема, чем эта. Вот сценарий, пока он не перейдет к другим журналам:

Set wshShell = WScript.CreateObject( "WScript.Shell" )
strComputerName = wshShell.ExpandEnvironmentStrings( "%COMPUTERNAME%" )

strComputer = "."
strType = "Error"
strPath = "T:\IT resources\Event Logs\ErrorLog" & strComputerName & ".csv"

'Script to convert UTC to human readable. From Script Repository.

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

'ForWriting is to write to file from start. ForAppending is to write to file from end of file.

constForWriting = 2
constForAppending = 8
constTristate = 0
boolUnicode = False
chrCarriageReturn = chr(13)
chrNewLine = chr(10)

Set objFSO = CreateObject("Scripting.FileSystemObject")


'This is so that cscript won't encounter a runtime error if the file already exists. Also so that it will write to the already existing file.

If objFSO.FileExists(strPath)=False Then

 Set objErrLog = objFSO.CreateTextFile(strPath,constForWriting,boolUnicode)
  objErrLog.Write "Type,"
  objErrLog.Write "Time Generated,"
  objErrLog.Write "Source Name,"
  objErrLog.Write "Event Code,"
  objErrLog.Write "Category,"
  objErrLog.Write "Message"
  objErrLog.Writeline
 strTimeMin = "01/01/1970/0:00:00"
'19700101000000.000000-480

 Else Set objErrLog = objFSO.OpenTextFile(strPath,constForAppending,constTristate)

'Only need this if it writes from the line the file ends on, as opposed to starting on a new line (which I expect it will).

  objErrLog.WriteLine

End If

Set objWMIService = GetObject("winmgmts:" _
 & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

'Querying Event Logs

Set colLoggedEvents = objWMIService.ExecQuery _
 ("SELECT * FROM Win32_NTLogEvent WHERE Logfile = 'system' AND "_
 & "Type = 'Error'")

'Type='Error' instead of "1" because it is a WQL query, I think. I believe that it is searching the entries in a database that reference the Win32_NTLogEvent objects. So I am searching the values in the database as opposed to the properties of the objects they reference. Or perhaps not. WHen I echo the type property of every object in colLoggedEvents, cscript outputs "Error". So maybe the I'm reading the SDK wrong? At least it seems to be working.

'This is a comparison function which tells where string 2 occurs in string 1. Starts at 1.

constStart = 1
constCompareType = 0

'This loop writes the information to a .csv.

For Each objEvent In colLoggedEvents

 If objEvent.Timegenerated > strTimeMin Then
  strTimeMin = objEvent.TimeGenerated
 Else
 End If
 objErrLog.Write objEvent.Type & ","
 objErrLog.Write WMIDateStringToDate(objEvent.TimeGenerated) & ","
 objErrLog.Write objEvent.SourceName & ","
 objErrLog.Write objEvent.EventCode & ","

 constExist=InStr(constStart,objEvent.Message,chrCarriageReturn,constCompareType)+InStr(constStart,objEvent.Message,chrNewLine,constCompareType)

  If constExist = 0 Then
   objErrLog.Write objEvent.Category & ","
   objErrLog.Write objEvent.Message

  Else
   objErrLog.Write objEvent.Category

  End If

 objErrLog.WriteLine

Next

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

1 ответ

Решение
  1. Освободите заблуждение, что код "может исправить себя"
  2. Укажите полную информацию об ошибке (номер, описание, указанная строка) при задании вопроса
  3. Предполагая, что вы получили ошибку "5 - Недопустимый вызов процедуры или аргумент" в строке, начинающейся с "objErrLog.Write", смотрите объяснение здесь.
  4. Вы утверждаете, что протестировали вариант своего кода с использованием Unicode; Вы не сделали, потому что:

Прототип.CreateTextFile является

object.CreateTextFile(filename:string[, overwrite:bool[, unicode:bool]])

Это конфликтует с вашим

objFSO.CreateTextFile(strPath,constForWriting,boolUnicode)

Прототип.OpenTextFile является

object.OpenTextFile(filename:string[, iomode:enum[, create:bool[, format:enum]]])

Это конфликтует с вашим

objFSO.OpenTextFile(strPath,constForAppending,constTristate)

Так что исправьте эти ошибки (сами!), Протестируйте файл, действительно открытый для Unicode, и надейтесь, что предположение (3) выполнено.

Обновление по комментариям:

Пожалуйста, подумайте над " Дайте полную информацию об ошибке (номер, описание, указанная строка) при задании вопроса " в контексте:

Я получаю ошибку недопустимой процедуры после 68 членов colLoggedEvents, когда у меня есть файл в ASCII.

против

Я получаю сообщение об ошибке при вызове метода OpenTextFile

Первое утверждение подразумевает, что 68-й член содержит символы, которые нельзя записать в режиме ASCII/ANSI. Действительно / Правильное использование выходного формата Unicode решит проблему, при условии, что журнал ошибок не содержит недопустимых данных.

Второе утверждение указывает, что параметры методов.Open/CreateTextfile по-прежнему не верны. Вы изменили оба вызова на Unicode?

Обновление II:

Документы определяют

TristateTrue -1 Открывает файл как Unicode.

Ваш код неправильно использует:

constTristate = 1 
Set objErrLog = objFSO.OpenTextFile(strPath,constForAppending,boolCreate,constTristate) 

Доказательства:

>> Set ts = goFS.OpenTextFile("error5.txt", 8, False, 1)
>>
Error Number:       5
Error Description:  Invalid procedure call or argument
>> Set ts = goFS.OpenTextFile("error5.txt", 8, False, -1)
>>
>> <-- no news are good news

Обновление с комментариями относительно TriStateTrue:

Документ VBScript говорит:

TristateUseDefault -2 Opens the file using the system default.
TristateTrue       -1 Opens the file as Unicode.
TristateFalse       0 Opens the file as ASCII.

Док @Adam ссылается на проблемы VBA; но я бы не стал доверять без чека.

Другие вопросы по тегам