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 Hier mein bisheriges Script:
---
[Edit Biber] Codetags spendiert, falls es jemand bequemer lesen will. [/Edit]
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 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]
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 131089
Url: https://administrator.de/contentid/131089
Ausgedruckt am: 22.11.2024 um 04:11 Uhr
25 Kommentare
Neuester Kommentar
Hallo templier!
In etwa so:
Das Textzeilen-Array beginnt ja bei 0 daher Zeile -1
Gruß Dieter
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 = ""
Gruß Dieter
Hallo templier!
eher so:
Gruß Dieter
eher so:
If UBound(Textzeilen) >= 38 Then Var1 = " " & Textzeilen(38) Else Var1 = ""
""Filetransfer" & Var1 & " fehlgeschlagen!"" |
Gruß Dieter
Hallo templier!
In etwa so:
Gruß Dieter
PS. Und setze Deinen Code in Code-Tags z.B.
<$code>
Dein Code
<$/code>
ohne Dollarzeichen
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
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):
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
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 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 Codezeilemerci - 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 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..
If UBound(Textzeilen) >= 38 Then Var1 = " " & Textzeilen(38) Else Var1 = ""
Und wenn bei der Codezeile:
If Len(Textzeilen(38)) >= 42 Then Var1 = " " & Mid(Textzeilen(38), 36, 6)
Wenn die Codezeile 35:
Textzeile = Textzeilen = Split(result, vbCrLf, 63)
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
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:
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
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
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 an
Gruß Dieter
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 an
Gruß Dieter
Hallo Ralph!
Da haben wir jetzt aber beide geschlafen
ändere die Codezeile 27 in:
Aber jetzt muss ich endgültig weg
Gruß Dieter
Da haben wir jetzt aber beide geschlafen
ändere die Codezeile 27 in:
textlines = Split(result, vbCrLf, 40)
Aber jetzt muss ich endgültig weg
Gruß Dieter
Hallo Tsuki
Gruß Dieter
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 mitdenktnur kurzer Hinweis:
templier möchte Var2 aus Zeile 9 und Var1 aus Zeile 39 zugewiesen haben.
Im Moment habt ihr das umgekehrt.
Gruß Dieter
Hallo Ralph!
Oh oh, was ist das denn für ein willenloses Durcheinander. Und da soll was funktionieren????????????
Deine E-Mail-Adresse solltest Du vielleicht noch entfernen.
Gruß Dieter
Oh oh, was ist das denn für ein willenloses Durcheinander. Und da soll was funktionieren????????????
Deine E-Mail-Adresse solltest Du vielleicht noch entfernen.
Gruß Dieter
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.
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
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.
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
Hallo Ralph, hallo Biber!
Jetzt sogar mit Foto
Wenn das Such-Array mit "C (CANCELED)" etc wieder mehr als einen String enthält, dann läufts nicht mehr so rund
@Biber
Da hab ich weiter oben auch schon drauf hingewiesen, jedoch ohne Erfolg
Hier mal nen Code, wie ich es machen würde:
Nur so als Anregung
Gruß Dieter
Jetzt sogar mit Foto
Wenn das Such-Array mit "C (CANCELED)" etc wieder mehr als einen String enthält, dann läufts nicht mehr so rund
@Biber
Da hab ich weiter oben auch schon drauf hingewiesen, jedoch ohne Erfolg
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"
Gruß Dieter
Hallo Ralph!
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...
Grüße aus Mannheim
Dieter
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
Da ist was Wahres dran, zumindest habe auch ich diese Erfahrung gemachtich 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
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, 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
Yepp, desdewegen versuchen wir ja auch so gut es geht zu helfengekommen, 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
@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 hastJa, 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*
@all
Sollte es hier mal ein Unterforum mit dem Thema CITRIX geben, dann kann ich euch sogar sehr gut helfen - Geben und Nehmen eben
Siehste, davon habe ich Null Ahnung, aber schon des öfteren Beiträge dazu gesehenSollte es hier mal ein Unterforum mit dem Thema CITRIX geben, dann kann ich euch sogar sehr gut helfen - Geben und Nehmen eben
Grüße aus Mannheim
Dieter