templier
Goto Top

Zwei Zeilen aus txt-Datei auslesen und als Variablen in VBS-Script verwenden

Hallo an alle,

ich bin im VBS-Scripting kein Profi und habe folgendes Problem: Ein VBS Script soll aus Logdateien Schlüsselwörter auslesen. Hier als test "C (CANCELED)", und beim finden der Wörter einen Fehlereintrag ins Logevent schreiben oder bei nicht finden eine Erfolgreichmeldung. Und danach die Logdateien in ein Archiv verschieben. Ich habe nun folgendes Script erstellt welches auch alle Anforderungen soweit erfüllt. Nun kommt die neue Anforderung das ich aus dem Logfile zwei Zeilen (Zeile 39 + 62) als Variablen in den Logeventeinträgen einfliechten soll. Aber hier verlässt es mich, kann mir jemand helfen? Das wäre super face-sad Hier mein bisheriges Script:

Option Explicit

Const ForReading = 1
Dim objFSO,objFile,objTextFile,found,result,searchstring,WSHShell,directory,objShell
Dim txt(3) 
txt(0) = "C (CANCELED)"   
txt(1) = "C (CANCELED)"   
txt(2) = "C (CANCELED)"  
txt(3) = "C (CANCELED)"  

Dim dirarray(1)
dirarray(0) = "C:\Temp\Logs\"  
dirarray(1) = "C:\Temp\Archiv\"  

Function unixtimestamp(oldDate)
  unixtimestamp = DateDiff("s", "01/01/1970 00:00:00", oldDate)  
End Function 

For each directory in dirarray
  Set objFSO = CreateObject("Scripting.FileSystemObject")   
  For Each objFile In objFSO.GetFolder(directory).Files 
     If objFSO.GetExtensionName(objFile.Name) = "out" Then   
       If unixtimestamp(objFile.DateCreated)>(unixtimestamp(now)-(60*60*16)) Then
          Set objTextFile = objFile.OpenAsTextStream(ForReading) 
          found = false 
          result=objTextFile.ReadAll
            For each searchstring in txt 
              If Len(result) > 0 and not isNull(result) Then
           If InStr(result, searchstring) Then  
                  found = True
           End If 
              End If 
            Next
           If found=true Then
           Set objShell = WScript.CreateObject("WScript.Shell")  
           objShell.Run("%comspec% /C C:\Temp\Tools\logevent -m ""\\%Computername%"" -s W -r ""Filetransfer fehlgeschlagen!"" -e 4711 ""Testeintrag Ralph für das Parser-Script"""), 1, True  
           objTextFile.Close                   
           Else
           Set objShell = WScript.CreateObject("WScript.Shell")  
           objShell.Run("%comspec% /C C:\Temp\Tools\logevent -m ""\\%Computername%"" -r ""Filetransfer erfolgreich!"" -e 4711 ""Testeintrag Ralph für das Parser-Script"""), 1, True  
           objTextFile.Close 
'WScript.Sleep(20000)  
      End If
       End If
     End If 
 Next
Next
On Error Resume Next
Set objFSO = CreateObject("Scripting.FileSystemObject")  
objFSO.MoveFile "c:\Temp\Logs\XPR*.out" , "C:\Temp\Logs2"  


---
[Edit Biber] Codetags spendiert, falls es jemand bequemer lesen will. [/Edit]

Content-ID: 131089

Url: https://administrator.de/contentid/131089

Ausgedruckt am: 22.11.2024 um 04:11 Uhr

76109
76109 07.12.2009 um 14:19:52 Uhr
Goto Top
Hallo templier!

In etwa so:
Textzeilen = Split(Result, vbCrLf, 63)
    
If UBound(Textzeilen) >= 38 Then Var1 = Textzeilen(38) Else Var1 = ""  
If UBound(Textzeilen) >= 61 Then Var2 = Textzeilen(61) Else Var2 = ""  
Das Textzeilen-Array beginnt ja bei 0 daher Zeile -1

Gruß Dieter
templier
templier 07.12.2009 um 14:57:45 Uhr
Goto Top
Hallo Dieter,

merci für Deine Hilfe, aber nun bekomme ich die die Meldung: "Filetransfer %Var1% erfolgreich!" im Eventlog...was mache ich nun falsch, hast Du da eine Idee?

Option Explicit

Const ForReading = 1
Dim objFSO,objFile,objTextFile,found,result,searchstring,WSHShell,directory,objShell,Textzeilen,Var1,Var2
Dim txt(3)
txt(0) = "C (CANCELED)"
txt(1) = "C (CANCELED)"
txt(2) = "C (CANCELED)"
txt(3) = "C (CANCELED)"

Dim dirarray(1)
dirarray(0) = "C:\Temp\Logs\"
dirarray(1) = "C:\Temp\Archiv\"
Textzeilen = Split(Result, vbCrLf, 63)

Function unixtimestamp(oldDate)
unixtimestamp = DateDiff("s", "01/01/1970 00:00:00", oldDate)
End Function

For each directory in dirarray
Set objFSO = CreateObject("Scripting.FileSystemObject")
For Each objFile In objFSO.GetFolder(directory).Files
If objFSO.GetExtensionName(objFile.Name) = "out" Then
If unixtimestamp(objFile.DateCreated)>(unixtimestamp(now)-(60*60*16)) Then
Set objTextFile = objFile.OpenAsTextStream(ForReading)
found = false
result=objTextFile.ReadAll
For each searchstring in txt
If Len(result) > 0 and not isNull(result) Then
If InStr(result, searchstring) Then
found = True
End If
End If
Next
If found=true Then
If UBound(Textzeilen) >= 38 Then Var1 = Textzeilen(38) Else Var1 = ""
If UBound(Textzeilen) >= 61 Then Var2 = Textzeilen(61) Else Var2 = ""
Set objShell = WScript.CreateObject("WScript.Shell")
objShell.Run("%comspec% /C C:\Temp\Tools\logevent -m ""\\%Computername%"" -s W -r ""Filetransfer %Var1% fehlgeschlagen!"" -e 4711 ""Testeintrag Ralph für das Parser-Script"""), 1, True
objTextFile.Close
Else
Set objShell = WScript.CreateObject("WScript.Shell")
objShell.Run("%comspec% /C C:\Temp\Tools\logevent -m ""\\%Computername%"" -r ""Filetransfer %Var1% erfolgreich!"" -e 4711 ""Testeintrag Ralph für das Parser-Script"""), 1, True
objTextFile.Close
'WScript.Sleep(20000)
End If
End If
End If
Next
Next
On Error Resume Next
Set objFSO = CreateObject("Scripting.FileSystemObject")
objFSO.MoveFile "c:\Temp\Logs\XPR*.out" , "C:\Temp\Logs2"
76109
76109 07.12.2009 um 15:40:26 Uhr
Goto Top
Hallo templier!

eher so:
If UBound(Textzeilen) >= 38 Then Var1 =  " " & Textzeilen(38) Else Var1 = ""   
""Filetransfer" & Var1 & " fehlgeschlagen!""

Gruß Dieter
templier
templier 07.12.2009 um 17:00:04 Uhr
Goto Top
Hallo Dieter,

merci - Ganz so hat es nicht funktioniert aber wenn ich es so ins Script schreibe, wie unten, zeigt er mir zumindest etwas an, nur noch nicht das richtige face-sad Bei beiden Zeilen zeigt er mir jetzt nur
das erste Wort an - Er sollte nun aber von beiden Zeilen die Bereiche: Textzeichen 36 bis 42 anzeigen...könntest Du hier vielleicht nochmal helfen? Das wäre Klasse von DIr..

Grüsse
Ralph


Option Explicit

Const ForReading = 1
Dim objFSO,objFile,objTextFile,found,result,searchstring,WSHShell,directory,objShell,Textzeilen,Var1,Var2
Dim txt(3)
txt(0) = "C (CANCELED)"
txt(1) = "C (CANCELED)"
txt(2) = "C (CANCELED)"
txt(3) = "C (CANCELED)"

Dim dirarray(1)
dirarray(0) = "C:\Temp\Logs\"
dirarray(1) = "C:\Temp\Archiv\"

Function unixtimestamp(oldDate)
unixtimestamp = DateDiff("s", "01/01/1970 00:00:00", oldDate)
End Function

For each directory in dirarray
Set objFSO = CreateObject("Scripting.FileSystemObject")
For Each objFile In objFSO.GetFolder(directory).Files
If objFSO.GetExtensionName(objFile.Name) = "out" Then
If unixtimestamp(objFile.DateCreated)>(unixtimestamp(now)-(60*60*16)) Then
Set objTextFile = objFile.OpenAsTextStream(ForReading)
found = false
result=objTextFile.ReadAll
For each searchstring in txt
If Len(result) > 0 and not isNull(result) Then
If InStr(result, searchstring) Then
found = True
End If
End If
Next
If found=true Then
Textzeilen = Split(Result, vbCrLf, 63)
If UBound(Textzeilen) >= 38 Then Var1 = Textzeilen(38) Else Var1 = ""
If UBound(Textzeilen) >= 61 Then Var2 = Textzeilen(61) Else Var2 = ""
Set objShell = WScript.CreateObject("WScript.Shell")
objShell.Run("%comspec% /C C:\Temp\Tools\logevent -m ""\\%Computername%"" -s W -r ""Filetransfer " & Var1 & " fehlgeschlagen!"" -e 4711 ""Testeintrag Ralph für das Parser-Script"""), 1, True
objTextFile.Close
Else
Set objShell = WScript.CreateObject("WScript.Shell")
objShell.Run("%comspec% /C C:\Temp\Tools\logevent -m ""\\%Computername%"" -r ""Filetransfer " & Var2 & " erfolgreich!"" -e 4711 ""Testeintrag Ralph für das Parser-Script"""), 1, True
objTextFile.Close
'WScript.Sleep(5000)
End If
End If
End If
Next
Next
On Error Resume Next
Set objFSO = CreateObject("Scripting.FileSystemObject")
objFSO.MoveFile "c:\Temp\Logs\XPR*.out" , "C:\Temp\Logs2"
76109
76109 07.12.2009 um 17:20:06 Uhr
Goto Top
Hallo templier!

In etwa so:
Var1 = ""  
If UBound(Textzeilen) >= 38 Then
    If Len(Textzeilen(38)) >= 42 Then Var1 = " " & Mid(Textzeilen(38), 36, 6) 'Ab Position 36 Anzahl 6 Zeichen   
End If

Gruß Dieter

PS. Und setze Deinen Code in Code-Tags z.B.
<$code>
Dein Code
<$/code>
ohne Dollarzeichen
templier
templier 07.12.2009 um 17:49:18 Uhr
Goto Top
Hi Dieter,

scheint jetzt grundsätzlich zu funktionieren..nur schreibt er mir die Variable nicht für jeden Eventlogeintrag...von 10 Logevents hat er gerade mal drei die Variable korrekt genommen. Kann es sein das ich die Dateien zu schnell verschiebe und kann man es so machen das er eine nach der anderen abarbeitet?

Irgendwo ist noch ein Würmchen drinne face-sad

Option Explicit

Const ForReading = 1
Dim objFSO,objFile,objTextFile,found,result,searchstring,WSHShell,directory,objShell,Textzeilen,Var1,Var2
Dim txt(3) 
txt(0) = "C (CANCELED)"   
txt(1) = "C (CANCELED)"   
txt(2) = "C (CANCELED)"  
txt(3) = "C (CANCELED)"  

Dim dirarray(1)
dirarray(0) = "C:\Temp\Logs\"  
dirarray(1) = "C:\Temp\Archiv\"  

Function unixtimestamp(oldDate)
  unixtimestamp = DateDiff("s", "01/01/1970 00:00:00", oldDate)  
End Function 

For each directory in dirarray
  Set objFSO = CreateObject("Scripting.FileSystemObject")   
  For Each objFile In objFSO.GetFolder(directory).Files 
     If objFSO.GetExtensionName(objFile.Name) = "out" Then   
       If unixtimestamp(objFile.DateCreated)>(unixtimestamp(now)-(60*60*16)) Then
          Set objTextFile = objFile.OpenAsTextStream(ForReading) 
          found = false 
          result=objTextFile.ReadAll
            For each searchstring in txt 
              If Len(result) > 0 and not isNull(result) Then
           If InStr(result, searchstring) Then  
                  found = True
           End If 
              End If 
            Next
           If found=true Then
Textzeilen = Split(Result, vbCrLf, 63)
Var1 = ""   
If UBound(Textzeilen) >= 38 Then 
If Len(Textzeilen(38)) >= 42 Then Var1 = " " & Mid(Textzeilen(38), 36, 6) 'Ab Position 36 Anzahl 6 Zeichen    
End If
           Set objShell = WScript.CreateObject("WScript.Shell")  
           objShell.Run("%comspec% /C C:\Temp\Tools\logevent -m ""\\%Computername%"" -s W -r """Filetransfer " & Var1 & " fehlgeschlagen!""" -e 4711 ""Testeintrag Ralph für das Parser-Script"""), 1, True  
           objTextFile.Close                   
           Else
           Set objShell = WScript.CreateObject("WScript.Shell")  
           objShell.Run("%comspec% /C C:\Temp\Tools\logevent -m ""\\%Computername%"" -r """Filetransfer " & Var1 & " erfolgreich!""" -e 4711 ""Testeintrag Ralph für das Parser-Script"""), 1, True  
           objTextFile.Close 
'WScript.Sleep(5000)  
      End If
       End If
     End If 
 Next
Next
On Error Resume Next
Set objFSO = CreateObject("Scripting.FileSystemObject")  
objFSO.MoveFile "c:\Temp\Logs\XPR*.out" , "C:\Temp\Logs2"  
76109
76109 07.12.2009 um 18:05:03 Uhr
Goto Top
Hallo templier!

Definier doch mal testweise nicht Var1 = "" sondern Var1 = " nicht gefunden"

Dann müsste Deine Ausgabe eigentlich vollständig sein.

Gruß Dieter

PS. Boaaah, Sorry heute ist Montag die String-Quoten waren ursprünglich doch richtig, weils ja innherhalb eines anderen Strings ist.

Also, komplett doch so (ohne Klammer):
objShell.Run "%comspec% /C C:\Temp\Tools\logevent -m ""\\%Computername%"" -s W -r ""Filetransfer" & Var1 & " fehlgeschlagen!"" -e 4711 ""Testeintrag Ralph für das Parser-Script""", 1, True  
76109
76109 07.12.2009 um 22:51:34 Uhr
Goto Top
Zitat von @templier:
merci - Ganz so hat es nicht funktioniert aber wenn ich es so ins Script schreibe, wie unten, zeigt er mir zumindest etwas an,
nur noch nicht das richtige face-sad Bei beiden Zeilen zeigt er mir jetzt nur das erste Wort an - Er sollte nun aber von beiden Zeilen die Bereiche:
Textzeichen 36 bis 42 anzeigen...könntest Du hier vielleicht nochmal helfen? Das wäre Klasse von DIr..
Also, bei der Codezeile
If UBound(Textzeilen) >= 38 Then Var1 =  " " & Textzeilen(38) Else Var1 = ""   
dann ist Var1 = ganzer Zeileninhalt, wenn aber nur ein Wort in der Zeile drinnen steht, dann ist Var1 auch nur ein Wort.

Und wenn bei der Codezeile:
If Len(Textzeilen(38)) >= 42 Then Var1 = " " & Mid(Textzeilen(38), 36, 6)  
auch nur ein Wort drinnen steht das weniger als 42 Zeichen lang ist, dann ist Var1 = ""

Wenn die Codezeile 35:
Textzeile = Textzeilen = Split(result, vbCrLf, 63)
nur im Found = True-Teil steht, dann mach Var1 im Else objShell.Run-Teil auch keinen Sinn. Ob die Variablen auch zur Verfügung stehen, wenn found = False ist, entzieht sich meiner Kenntnis.

Ausserdem kannst Du die Codezeile 20 und Codezeile 40 vor die Codezeile 19 platzieren und die Codezeile 44 ganz entfernen. Diese Objecte müssen nur einmal am Codeanfang erstellt werden.

Gruß Dieter
templier
templier 08.12.2009 um 10:40:15 Uhr
Goto Top
Hallo Dieter,

hier mal ein Beispiel-logfile und die Variablen Werte welche ich davon ausgelesen bräuchte: Zeile 9 (202868) und Zeile 39 (NCAEMES) - Die Länge der Werte sind immer gleich also 6, respektive 7 Zeichen...Wenn ich das wie oben beschrieben mache geht es einfach nicht face-sad Any ideas? face-sad

Grüsse
Ralph

 "COMMAND LINE"  
 "------------"  
 c:\xfb.monitor\run_time\etc\xpr.bat 202868     
 " "  
 "-----------------------------"  
 "TRANSFER REQUEST INFORMATIONS"  
 "-----------------------------"  
 "// Transfer Identification "  
 "Transfer identification       :" 202868  
 "Direction                     :" I  
 "Connection mode               :" R  
 "// Transfer state "  
 "State of transfer             :" E (ENDED)  
 "Last end reason               :" 0  
 "Last end protocol diagnostic  :" 0  
 "Last end local error          :" 0  
 "transfer routed state         :"   
 "transfer user state           :" 0  
 "// File Identification "  
 "Local file name               :" \\storage2\interpel\data_exchange_NCA\NCAEMES\download\F0202868  
 "Local file Path               :" \\storage2\interpel\data_exchange_NCA\NCAEMES\download  
 "File originator               :" NCAPROD  
 "File destination              :" VISPROD  
 "// File Attributs "  
 "File organisation             :" S  
 "File size                     :" 1250  
 "File record count             :" 2  
 "File allocation unit          :" R  
 "File allocation size          :" 2  
 "File creation date            :" 091208 094502  
 "File extraction date          :" 091208 094502  
 "File Character set            :" B  
 "Record format                 :" S  
 "Record length                 :" 1024  
 "text file ?                   :" N  
 "// Protocol  Parameters"  
 "Protocol used                 :" PEL  
 "Protocol file type            :"   
 "Protocol file name            :" NCAEMES  
 "Protocol transfer id          :" 342000045NCAPROD  
 "// Transfer Statistic "  
 "Date of creation              :" 091208 094502  
 "Date to begin                 :"   
 "Date to end                   :"   
 "Transfer started on           :" 091208 094502  
 "Transfer ended on             :" 091208 094502  
 "Number of retries             :" 0  
 "Number of bytes transfered    :" 1258  
 "Number of file bytes transfer :" 1250  
 "Priority                      :" 0  
 "Julien day                    :" 342  
 "Sequence number               :" 45  
 "Compression                   :" U  
 "Remote agent                  :" NCAPROD  
 "Local agent                   :" VISPROD  
 "select_req                    :" 0  
 "maxi_requests                 :"   
 "maxi_files                    :"   
 "total_requests                :" 0  
 "total_files                   :" 0  
 "// User Parameters "  
 "User message 1                :" 000001NCA.3.eMES.20091208186005  
 "User message 2                :"   
 "User parameter 1              :"   
 "User parameter 2              :"   
 "User name                     :"   
 "PeSIT sender user name        :"   
 "PeSIT sender user appli       :"   
 "PeSIT sender user text        :"   
 "PeSIT receiver user name      :"   
 "PeSIT receiver user appli     :"   
 "PeSIT receiver user text      :"   
 " "  
 "x_master_ident                :"   
 "x_nb_ended                    :" 0  
 "x_nb_to_begin                 :" 0  
 "x_nb_canceled                 :" 0  
 "x_nb_suspended                :" 0  
 "x_nb_frozen                   :" 0  
 "x_nb_progressing              :"   
 "x_nb_total                    :" 0  
 "x_next_xfer                   :" 0  
 "x_end_xfer_script             :"   
 "x_scratch_file                :"   
 "x_user_processed              :" 0  
 "// ETEBAC5 Parameters "  
 "x_id_client_sign1             :"   
 "x_id_client_sign2             :"   
 "x_id_bank                     :"   
 "x_id_client_sec               :"   
 "x_id_bank_sec                 :"   
 "x_auth_type                   :"   
 "x_seal_type                   :"   
 "x_ciph_type                   :"   
 "x_sign_type                   :"   
 "x_paraf_used                  :"   
 "x_rsign1_used                 :"   
 "x_rsign2_used                 :"   
 "x_memo_type                   :"   
 "x_userarea                    :"   
 "File Label                    :"   
        1 file(s) copied.
        1 file(s) copied.
        1 file(s) copied.
76109
76109 08.12.2009 um 11:58:32 Uhr
Goto Top
Hallo templier!

Oben hast Du aber geschrieben Zeile 39 und Zeile 62 und jetzt ist es Zeile 9 und Zeile 39. Was denn jetzt?

Aber anhand des Aufbaus der Logfile kann man das auslesen der Variablen dann so machen:
textlines = Split(text, vbCrLf, 40)
Var1 = "":  Var2 = ""  
If UBound(textlines) >= 8 Then Var1 = Mid(textlines(8), 35) 'Ab Pos 35 mit Leerzeichen den Rest der Zeile einlesen  
If UBound(textlines) >= 38 Then Var2 = Mid(textlines(38), 35) 'Ab Pos 35 mit Leerzeichen den Rest der Zeile einlesen  

Der Code ist etwas chaotisch, daher hab ich noch ein paar Fragen:
1. Ist der Aufbau der Logfile immer der gleiche?
2. Sollen die Variablen unabhängig davon, ob das Such-Array gefunden wird oder nicht, ausgelesen werden?
3. Wenn die Suche im Such-Array zutrifft, wird dann die Meldung "File-Transfer fehlgeschlagen" ausgegeben?
4. Wenn die Logfile die Größe 0 hat bzw. die Variablen den Wert "" haben, was soll dann passieren?
5. Und die Zeitdifferenz soll 16 Stunden betragen?

Gruß Dieter
templier
templier 08.12.2009 um 12:34:03 Uhr
Goto Top
Hallo Dieter,

ich glaube ich habe Dich jetzt verwirrt face-wink ,wobei sich das mit der Zeile von der Anforderung der Abteilung heute geändert hat (anstatt Zeile 39 nun die Zeile 9).

Also:

Ja die Logfiles sind immer gleich aufgebaut und immer grösser 0 Byte. Es soll folgendes erreicht werden:

Wenn in dem Logfile in Zeile 13 das steht zum Beispiel: C (CANCELED) dann soll durch die logevent.exe aus dem Resourcekit im Eventlog als Source die Variable (Var1) aus Zeile 39 (hier Bsp: NCAEMES) erscheinen...also alles was quasi ab dem ersten Buchstaben da steht.

Als Description im Eventlog soll die logevent.exe dann die Variable (Var2) Zeile 9 (hier Bsp: 202868) reinschreiben auch alles was ab der ersten Zahl steht.

Wird der String C (CANCELED) nicht gefunden, dann soll das gleiche wie oben ins Eventlog geschrieben werden nur mit dem Unterschied das die Meldung dann eine erfolgreiche ist. Sobald dann das LogFile geparst wurde soll es direkt in ein Archiv verschoben werden, so das man die Meldungen nicht doppelt bekommt. Dann soll das nächste LogFile die gleiche "Behandlung" bekommen und so weiter und so fort...es sollen auch keine Logfiles angefasst werden die älter als 16 Stunden sind

Ich weiss - Ist nicht so ganz einfach zumal dieses doofe logevent.exe soviele Hochkommas in den zu schreibenden Texten hat face-sad

Grüsse
Ralph

Dein letzter Ansatz hat übrigens nicht funktioniert face-sad Du kannst mir auch eine Mail senden, dann könnte ich Dir mal Screenshots zusenden..ist vielleicht einfacher für das Verständnis?
76109
76109 08.12.2009 um 13:20:20 Uhr
Goto Top
Hallo Ralph!

Mein zuletzt peposteter Code funktioniert schon. Nur auf den ersten Blick, steht der Code in Deinem Code an der falschen Stelle.

Setze den Code mal vor die Codezeile 27 bzw. gleich nach Codezeile 26.

Ich muss jetzt leider weg und schau mir das Ganze später genauer anface-wink

Gruß Dieter
templier
templier 08.12.2009 um 13:35:14 Uhr
Goto Top
Hi Dieter

geht leider auch nicht face-sad Ich bekomme im Eventlog zwar die korrekten Meldungen (erfolgreich oder nicht) nur die Variablen setzt er mir einfach nicht in die Description und die Source im Eventlog ein face-sad

Hier nochmal der aktuelle Code, da siehst Du auch wo der jeweilige Text der Variablen stehen sollte....

Grüsse
Ralph

Option Explicit

Const ForReading = 1
Dim objFSO,objFile,objTextFile,found,result,searchstring,WSHShell,directory,objShell,textlines,text,Var1,Var2
Dim txt(3) 
txt(0) = "C (CANCELED)"   
txt(1) = "C (CANCELED)"   
txt(2) = "C (CANCELED)"  
txt(3) = "C (CANCELED)"  

Dim dirarray(1)
dirarray(0) = "C:\Temp\Logs\"  
dirarray(1) = "C:\Temp\Archiv\"  

Function unixtimestamp(oldDate)
  unixtimestamp = DateDiff("s", "01/01/1970 00:00:00", oldDate)  
End Function 

For each directory in dirarray
  Set objFSO = CreateObject("Scripting.FileSystemObject")   
  For Each objFile In objFSO.GetFolder(directory).Files 
     If objFSO.GetExtensionName(objFile.Name) = "out" Then   
       If unixtimestamp(objFile.DateCreated)>(unixtimestamp(now)-(60*60*16)) Then
          Set objTextFile = objFile.OpenAsTextStream(ForReading) 
          found = false 
          result=objTextFile.ReadAll
textlines = Split(text, vbCrLf, 40) 
Var1 = "":  Var2 = ""   
If UBound(textlines) >= 8 Then Var1 = Mid(textlines(8), 35) 'Ab Pos 35 mit Leerzeichen den Rest der Zeile einlesen   
If UBound(textlines) >= 38 Then Var2 = Mid(textlines(38), 35) 'Ab Pos 35 mit Leerzeichen den Rest der Zeile einlesen  
            For each searchstring in txt 
              If Len(result) > 0 and not isNull(result) Then
           If InStr(result, searchstring) Then  
                  found = True
           End If 
              End If 
            Next
           If found=true Then
           Set objShell = WScript.CreateObject("WScript.Shell")  
           objShell.Run "%comspec% /C C:\Temp\Tools\logevent -m ""\\%Computername%"" -s W -r ""Filetransfer" & Var1 & " fehlgeschlagen!"" -e 4711 ""Filetransfer für das File " & Var2 & " ist fehlgeschlagen""", 0, True  
           objTextFile.Close                   
           Else
           Set objShell = WScript.CreateObject("WScript.Shell")  
           objShell.Run "%comspec% /C C:\Temp\Tools\logevent -m ""\\%Computername%"" -r ""Filetransfer" & Var1 & " erfolgreich!"" -e 4711 ""Filetransfer für das File " & Var2 & " wurde erfolgreich abgeschlossen""", 0, True  
           objTextFile.Close 
'WScript.Sleep(5000)  
      End If
       End If
     End If 
Next
Next
On Error Resume Next
Set objFSO = CreateObject("Scripting.FileSystemObject")  
objFSO.MoveFile "c:\Temp\Logs\XPR*.out" , "C:\Temp\Logs2"  
76109
76109 08.12.2009 um 13:57:40 Uhr
Goto Top
Hallo Ralph!

Da haben wir jetzt aber beide geschlafenface-smile

ändere die Codezeile 27 in:
textlines = Split(result, vbCrLf, 40)  

Aber jetzt muss ich endgültig wegface-wink

Gruß Dieter
TsukiSan
TsukiSan 08.12.2009 um 14:50:52 Uhr
Goto Top
Hallo ihr lieben,

nur kurzer Hinweis:
templier möchte Var2 aus Zeile 9 und Var1 aus Zeile 39 zugewiesen haben.
Im Moment habt ihr das umgekehrt.

Gruss
Tsuki
templier
templier 08.12.2009 um 14:51:22 Uhr
Goto Top
Hallo Dieter,

ich habe es endlich hinbekommen durch "herumprobieren" - OK, ist wohl nicht die beste Art aber das Script erfüllt jetzt seinen Zweck und ich bekomme die
ganzen Informationen, welche ich brauche, aus den Logfiles face-smile face-smile face-smile

Ich danke Dir für Deine Hilfe und ich hoffe ich kann das mal wieder gutmachen face-wink Hier noch das funktionierende Script:

Grüsse und nochmal Danke
Ralph

Option Explicit

Const ForReading = 1
Dim objFSO,objFile,objTextFile,found,result,searchstring,WSHShell,directory,objShell,textzeilen,text,Var1,Var2
Dim txt(0) 
txt(0) = "C (CANCELED)"   
'txt(1) = "E (ENDED)"   
'txt(2) = "C (CANCELED)"  
'txt(3) = "C (CANCELED)"  

Dim dirarray(1)
dirarray(0) = "C:\Temp\Logs\"  
dirarray(1) = "C:\Temp\Archiv\"  

Function unixtimestamp(oldDate)
Unixtimestamp = DateDiff("s", "01/01/1970 00:00:00", oldDate)  
End Function 

For each directory in dirarray
  Set objFSO = CreateObject("Scripting.FileSystemObject")   
    For Each objFile In objFSO.GetFolder(directory).Files 
     If objFSO.GetExtensionName(objFile.Name) = "out" Then   
        If  unixtimestamp(objFile.DateCreated)>(unixtimestamp(now)-(60*60*24)) Then
          Set objTextFile = objFile.OpenAsTextStream(ForReading) 
           found = false 
           result=objTextFile.ReadAll
           Textzeilen = Split(Result, vbCrLf, 63) 
           Var1 = "": Var2 = ""    
           If UBound(Textzeilen) >= 38 Then  
           If Len(Textzeilen(38)) >= 8 Then Var1 = "" & Mid(Textzeilen(38), 36) 'Ab Position 36 den Rest der Zeile auslesen      
           If Len(Textzeilen(8)) >= 8 Then Var2 = "" & Mid(Textzeilen(8), 36) 'Ab Position 36 den Rest der Zeile auslesen  
           For each searchstring in txt 
           If Len(result) > 0 and not isNull(result) Then
           If InStr(result, searchstring) Then  
           found = True
           Set objShell = WScript.CreateObject("WScript.Shell")  
           objShell.Run "%comspec% /C C:\Temp\Tools\logevent -m ""\\%Computername%"" -s W -r ""Filetransfer " & Var1 & " fehlgeschlagen!"" -e 4711 ""Der Filetransfer " & Var2 & " ist fehlgeschlagen - Bitte pruefen!""", 0, True  
           objTextFile.Close                   
           Else
           Set objShell = WScript.CreateObject("WScript.Shell")  
           objShell.Run "%comspec% /C C:\Temp\Tools\logevent -m ""\\%Computername%"" -r ""Filetransfer " & Var1 & " erfolgreich!"" -e 4711 ""Der Filetransfer " & Var2 & " wurde erfolgreich abgeschlossen""", 0, True  
           objTextFile.Close 
           End If 
           End If 
           Next
           If found=true Then
           End If 
         End If
       End If
   End If 
Next
Next
On Error Resume Next
Set objFSO = CreateObject("Scripting.FileSystemObject")  
objFSO.MoveFile "c:\Temp\Logs\XPR*.out" , "C:\Temp\Logs2"  
76109
76109 08.12.2009 um 15:52:25 Uhr
Goto Top
Hallo Tsuki

Zitat von @TsukiSan:
nur kurzer Hinweis:
templier möchte Var2 aus Zeile 9 und Var1 aus Zeile 39 zugewiesen haben.
Im Moment habt ihr das umgekehrt.
Danke für den Hinweis. Wenigstens einer, der mitdenktface-smile

Gruß Dieter
templier
templier 08.12.2009 um 16:02:29 Uhr
Goto Top
Jupp,

merci Tsuki . Das habe aber korrigiert und mittlerweile sogar schon 5 Variablen im Einsatz *grins* - Macht ja richtig Spass wenns mal geht face-smile

Danke an alle
Ralph
76109
76109 08.12.2009 um 16:13:46 Uhr
Goto Top
Hallo Ralph!

Oh oh, was ist das denn für ein willenloses Durcheinander. Und da soll was funktionieren????????????face-sad

Deine E-Mail-Adresse solltest Du vielleicht noch entfernen.

Gruß Dieter
templier
templier 08.12.2009 um 18:11:28 Uhr
Goto Top
Ja, Du wirst lachen es funktioniert perfekt (habe es auf über 5000 Logfiles losgelassen und Stichproben gemacht) face-smile

Ich werde es morgen noch etwas aufräumen und dann poste ich Dir das endgültige Script (sogar mit 5 Variablen) und den Output den ich nun endlich im Windows Eventlog habe face-smile Nun kann der MOM-Server hier in der Firma was vernünftiges damit anfangen face-wink

Merci für den Hinweis mit der E-Mailadresse - Ist gelöscht
Biber
Biber 08.12.2009 um 19:19:30 Uhr
Goto Top
A propos "Löschen", templier,

Wenn du doch in Zeile 19 dein "For each directory in dirarray" lostrittst und in der Zeile 20 das "Set objFSO = CreateObject("Scripting.FileSystemObject") " machst und dasselbe Zeile 54 nochmal...
-> da würde ich ein wenig feintunen.
Vielleicht mal Zeile 19/20 tauschen und Zeile 54 löschen...

Ich mein ja nur.... so fett mit den Ressourcen rumaasen gilt in diesen Zeiten ja nicht mal mehr in ganz USA als so richtig hip.

Und wenn du meinst, dann würde das Skriptchen eventuell zu kurz... spendier doch ein paar Kommentarzeilen in der endgültigen Fassung. face-wink

Denn ich versprech dir - irgendwann ist der Schnipsel fertig und du musst ihn 7 Monate auch nicht ändern...
Und dann plötzlich sollst du "mal eben schnell eine Kleinigkeit anpassen".
Du wirst nicht glauben, dass du diesen Schnipsel schon mal gesehen, geschweige denn geschrieben hast.


Grüße
Biber
76109
76109 08.12.2009 um 19:49:15 Uhr
Goto Top
Hallo Ralph, hallo Biber!

Jetzt sogar mit Fotoface-smile

Wenn das Such-Array mit "C (CANCELED)" etc wieder mehr als einen String enthält, dann läufts nicht mehr so rundface-wink

@Biber
Da hab ich weiter oben auch schon drauf hingewiesen, jedoch ohne Erfolgface-smile

Hier mal nen Code, wie ich es machen würde:
Option Explicit

Dim objShell, objFso, objFile, objTextFile, objDir, Text, TextLines
Dim DirArray(1), SearchArray, SearchText, Found, Var1, Var2

DirArray(0) = "C:\Temp\Logs"  
DirArray(1) = "C:\Temp\Archiv"  

SearchArray = Array("C (CANCELED)", "E (ENDED)", ".......")  

Set objShell = CreateObject("WScript.Shell")  
Set objFso = CreateObject("Scripting.FileSystemObject")  

For Each objDir In DirArray
    For Each objFile In objFso.GetFolder(objDir).Files
        If LCase(objFso.GetExtensionName(objFile.Name)) = "out" Then  
            If objFile.DateCreated > DateAdd("h", -16, Now) Then  
                Set objTextFile = objFso.OpenTextFile(objFile)
                Text = objTextFile.ReadAll:  objTextFile.Close
                TextLines = Split(Text, vbCrLf, 40)
                Var1 = "":  Var2 = ""  
                If UBound(TextLines) >= 38 Then
                    Var1 = Mid(TextLines(38), 36):  Var2 = Mid(TextLines(8), 36)
                End If
                Found = False
                For Each SearchText In SearchArray
                    If InStr(1, Text, SearchText, vbTextCompare) > 0 Then Found = True:  Exit For
                Next
                If Found = True Then
                    objShell.Run "%comspec% /C C:\Temp\Tools\logevent -m ""\\%Computername%"" -s W -r ""Filetransfer " & Var1 &  " fehlgeschlagen!"" - 4711 ""Der Filetransfer " & Var2 & " ist fehlgeschlagen - Bitte pruefen!""", 0, True  
                Else
                    objShell.Run "%comspec% /C C:\Temp\Tools\logevent -m ""\\%Computername%"" -r ""Filetransfer " & Var1 & " erfolgreich!"" -e 4711 ""Der Filetransfer " & Var2 & " wurde erfolgreich abgeschlossen""", 0, True  
                End If
            End If
         End If
    Next
Next

On Error Resume Next
objFso.MoveFile "c:\Temp\Logs\XPR*.out", "C:\Temp\Logs2"  
Nur so als Anregungface-smile

Gruß Dieter
templier
templier 08.12.2009 um 20:05:57 Uhr
Goto Top
Hallo Dieter und Biber,

ich werde das morgen mal testen - Wie ich schon darauf hingewiesen habe im Eingangsthread bin ich kein Profi in der Geschichte und da bin ich natürlich sehr dankbar für jeden Tip denn: "nur was man sich erschwitzt - Das sitzt" habe ich zumindest mal so gelernt. Mein VBS-Scripting-Wissen ist nicht total überragend und die letzten "anspruchsvollen" Scripte sind auch schon ein paar Jahre her, da vergisst man viel oder sieht die 0 vor lauter 1en eben nicht gleich face-wink

Ich werde euch auf jedem Fall auf dem laufenden hier halten, denn andere sollen ja auch eventuell davon profitieren können.. Dafür ist so eine Gemeinschaft, wie dieses Forum, ja da.

Wobei, da das Script jetzt (schon) sehr gut läuft ist schon ne weitere, sagen wir mal "Anforderung" an mich gekommen (war zu erwarten, da Kunden ja immer die "Eierlegende Wollmichsau" suchen), was es denn viiiiieleicht auch gleich noch mitmachen könnte. Ok, hier habe ich schon ideen. Aber erstmal werde ich euren Ratschlägen folgen und das Script entschlacken und übersichtlicher gestalten. Mir gefällt es ja momentan genausowenig aber die Leutz wollten halt Ergebnisse sehen, wie das eben so ist - Aber das kennt ihr ja bestimmt auch face-wink

@Dieter
Ja, jetzt mit Foto - Man muss sich ja nicht verstecken, nur weil man Hilfe benötigt. Ich glaube kaum das jemand aus dem Forum nun, sollte er mich im realen Leben erkennen, mit dem Finger auf mich zeigen wird *lach*

Und das Sucharray: "C (CANCELED)"; "E (ENDED)"; etc ändert sich nie, die Anwendung schreibt das Logfile immer gleich. Gott sei Dank *lach*. Die anderen beiden Zustände habe ich auch schon hinzugefügt.

@Biber
Da haste vollkommen recht und in der "Endfassung" des Scriptes wird das auch berücksichtigt werden face-smile Wobei, ein bissel verschwenderisch dürfen wir aus der IT ja schon sein - Das merkt ggf. ja sowieso keiner der überhaupt keinen Plan von der Materie hat *lach*..oder? face-wink

@all
Sollte es hier mal ein Unterforum mit dem Thema CITRIX geben, dann kann ich euch sogar sehr gut ebenso helfen - Geben und Nehmen eben face-wink

Grüsse an alle aus (derzeit) der Schweiz
Ralph
76109
76109 08.12.2009 um 20:37:29 Uhr
Goto Top
Hallo Ralph!

Zitat von @templier:
ich werde das morgen mal testen - Wie ich schon darauf hingewiesen habe im Eingangsthread bin ich kein Profi in der Geschichte
und da bin ich natürlich sehr dankbar für jeden Tip denn: "nur was man sich erschwitzt - Das sitzt" habe ich
zumindest mal so gelernt face-wink
Da ist was Wahres dran, zumindest habe auch ich diese Erfahrung gemachtface-wink

Ich werde euch auf jedem Fall auf dem laufenden hier halten, denn andere sollen ja auch eventuell davon profitieren können..
Dafür ist so eine Gemeinschaft, wie dieses Forum, ja da.
Sehe ich auch so...
Wobei, da das Script jetzt (schon) sehr gut läuft ist schon ne weitere, sagen wir mal "Anforderung" an mich
gekommen, was es denn viiiiieleicht auch gleich noch mitmachen könnte. Ok, hier habe ich schon ideen. Aber erstmal werde ich
euren Ratschlägen folgen und das Script entschlacken und übersichtlicher gestalten. Mir gefällt es ja momentan
genausowenig aber die Leutz wollten halt Ergebnisse sehen, wie das eben so ist - Aber das kennt ihr ja bestimmt auch face-wink
Yepp, desdewegen versuchen wir ja auch so gut es geht zu helfenface-wink
@Dieter
Ja, jetzt mit Foto - Man muss sich ja nicht verstecken, nur weil man Hilfe benötigt. Ich glaube kaum das jemand aus dem
Forum nun, sollte er mich im realen Leben erkennen, mit dem Finger auf mich zeigen wird *lach*
War auch nicht ironisch gemeint, falls Du es so verstanden hastface-wink
@all
Sollte es hier mal ein Unterforum mit dem Thema CITRIX geben, dann kann ich euch sogar sehr gut helfen - Geben und Nehmen eben face-wink
Siehste, davon habe ich Null Ahnung, aber schon des öfteren Beiträge dazu gesehenface-wink

Grüße aus Mannheim

Dieter
templier
templier 10.12.2009 um 09:49:36 Uhr
Goto Top
Hallo an alle,

sodele das ist nun die endgültige Fassung welche mir die folgenden Informationen aus den Logfiles herausholt und demenstprechend
einstuft (Warnung oder Information wie oben das Beispiellogfile). Als Text schreibt er mir dann (Bsp.) folgendes ins Windowseventlog:

Als Information:
"Der Filetransfer 204065 von NCAPROD nach VISPROD mit dem File 000002NCA.3.eMES.20091210015507 wurde erfolgreich abgeschlossen." oder

als Warnung
"Der Filetransfer 204065 von NCAPROD nach VISPROD mit dem File 000002NCA.3.eMES.20091210015507 ist fehlgeschlagen - Bitte pruefen!."

Diese Daten werden hier nun mit dem MOM-Server ausgelesen und somit kann reagiert werden wenn etwas fehlschlägt. Die Informations-Meldungen sind hierfür
gedacht um Statistiken über die einzelnen Filetransfers zu erstellen (nur zur Info: Wir haben hier täglich etwa so um die 1500 Filetransfers, welcher je ein einzelnes
LogFile generiert) face-wink

Merci nochmal an alle face-smile

Und hier das Script:

Option Explicit

Const ForReading = 1
Dim objFSO,objFile,objTextFile,found,result,searchstring,WSHShell,directory,objShell,textzeilen,Var1,Var2,Var3,Var4,Var5
Dim txt(0) 
txt(0) = "C (CANCELED)"   
'txt(1) = "E (ENDED)"   
'txt(2) = "A (ACKNOWLEDGED)"  
'txt(3) = "U (UNKNOWN)"  

Dim dirarray(1)
dirarray(0) = "C:\Temp\Logs\"  
dirarray(1) = "C:\Temp\Archiv\"  

Function unixtimestamp(oldDate)
Unixtimestamp = DateDiff("s", "01/01/1970 00:00:00", oldDate)  
End Function 

Set objFSO = CreateObject("Scripting.FileSystemObject")  
Set objShell = WScript.CreateObject("WScript.Shell")  

For each directory in dirarray 
   For Each objFile In objFSO.GetFolder(directory).Files 
     If objFSO.GetExtensionName(objFile.Name) = "out" Then   
        If  unixtimestamp(objFile.DateCreated)>(unixtimestamp(now)-(60*60*24)) Then
          Set objTextFile = objFile.OpenAsTextStream(ForReading) 
            found = false 
             result=objTextFile.ReadAll
              Textzeilen = Split(Result, vbCrLf, 63) 
              If UBound(Textzeilen) >= 38 Then  
              If Len(Textzeilen(8)) >= 8 Then Var2 = "" & Mid(Textzeilen(8), 36) 'Ab Position 36 Zeile auslesen  
              If Len(Textzeilen(21)) >= 8 Then Var4 = "" & Mid(Textzeilen(21), 36) 'Ab Position 36 Zeile auslesen  
              If Len(Textzeilen(22)) >= 8 Then Var5 = "" & Mid(Textzeilen(22), 36) 'Ab Position 36 Zeile auslesen  
              If Len(Textzeilen(38)) >= 8 Then Var1 = "" & Mid(Textzeilen(38), 36) 'Ab Position 36 Zeile auslesen      
              If Len(Textzeilen(61)) >= 8 Then Var3 = "" & Mid(Textzeilen(61), 36) 'Ab Position 36 Zeile auslesen  
              For each searchstring in txt 
              If Len(result) > 0 and not isNull(result) Then
              If InStr(result, searchstring) Then  
              found = True
              objShell.Run "%comspec% /C C:\Temp\Tools\logevent -m ""\\%Computername%"" -s W -r ""Filetransfer " & Var1 & " fehlgeschlagen!"" -e 4711 ""Der Filetransfer " & Var2 & " von " & Var4 & " nach " & Var5 & " mit dem File " & Var3 & " ist fehlgeschlagen - Bitte pruefen!""", 0, True                 
              Else
              objShell.Run "%comspec% /C C:\Temp\Tools\logevent -m ""\\%Computername%"" -r ""Filetransfer " & Var1 & " erfolgreich!"" -e 4711 ""Der Filetransfer " & Var2 & " von " & Var4 & " nach " & Var5 & " mit dem File " & Var3 &" wurde erfolgreich abgeschlossen""", 0, True  
            End If 
           End If 
         Next
        End If
       End If
     End If 
   Next
Next
On Error Resume Next
objFSO.MoveFile "c:\Temp\Logs\XPR*.out" , "C:\Temp\Logs2"