In einer Fehler Log Datei die Dateinamen auslesen und diese auf Existenz prüfen
Ich möchte mein bestehendes Script erweitern und will aus einer Log Datei, die Fehlermeldungen von Winrar enthält, den Dateinamen auslesen lassen und mir als msgbox anzeigen lassen.
Das Problem ist,daß die Logdatei noch anderen Text enthält und der Dateiname nicht immer in der gleichen Stelle steht.
Lässt sich der Dateiname irgendwie auslesen ?
Wäre es möglich die ganze Logdatei auszulesen und irgendwie mit dem real existierenden Dateinamen zu vergleichen,z.B auf Existenz prüfen ?
Hier der Inhalt der Log Datei:
15.10.2007 12:41:44, Archiv D:\exceltemp\Excel Dateien von Herrn Mustermann.tar
15.10.2007 12:41:44 Lesefehler in der Datei .
15.10.2007 12:41:45 Das Archiv ist zerstört.
Es kann auch vorkommen ,daß die Logdatei mehrere Einträge enthält(siehe oben - diese stehen dann untereinander).
Für ein bißchen Hilfe wäre ich sehr dankbar.
mfg
Claus
Das Problem ist,daß die Logdatei noch anderen Text enthält und der Dateiname nicht immer in der gleichen Stelle steht.
Lässt sich der Dateiname irgendwie auslesen ?
Wäre es möglich die ganze Logdatei auszulesen und irgendwie mit dem real existierenden Dateinamen zu vergleichen,z.B auf Existenz prüfen ?
Hier der Inhalt der Log Datei:
15.10.2007 12:41:44, Archiv D:\exceltemp\Excel Dateien von Herrn Mustermann.tar
15.10.2007 12:41:44 Lesefehler in der Datei .
15.10.2007 12:41:45 Das Archiv ist zerstört.
Es kann auch vorkommen ,daß die Logdatei mehrere Einträge enthält(siehe oben - diese stehen dann untereinander).
Für ein bißchen Hilfe wäre ich sehr dankbar.
mfg
Claus
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 70961
Url: https://administrator.de/forum/in-einer-fehler-log-datei-die-dateinamen-auslesen-und-diese-auf-existenz-pruefen-70961.html
Ausgedruckt am: 04.01.2025 um 23:01 Uhr
18 Kommentare
Neuester Kommentar
Hallo cbli!
Bitte etwas mehr Info zum Format der einzelnen Zeilen - vor allem:
Gibt es ein Kriterium (etwa, wie in Deinem Beispiel dargestellt, "-------- " am Anfang der Zeile), an dem zu erkennen ist, dass eine Zeile einen Dateinamen enthält, oder:
Steht der Dateiname immer nach ", Archiv " als letzter Eintrag in der Zeile?
Grüße
bastla
Bitte etwas mehr Info zum Format der einzelnen Zeilen - vor allem:
Gibt es ein Kriterium (etwa, wie in Deinem Beispiel dargestellt, "-------- " am Anfang der Zeile), an dem zu erkennen ist, dass eine Zeile einen Dateinamen enthält, oder:
Steht der Dateiname immer nach ", Archiv " als letzter Eintrag in der Zeile?
Grüße
bastla
Hallo cbli!
Da ich nicht weiß, wie eine ev Weiterverarbeitung aussehen soll, zunächst nur die Grundfunktonalität:
Grüße
bastla
Da ich nicht weiß, wie eine ev Weiterverarbeitung aussehen soll, zunächst nur die Grundfunktonalität:
Set fso = CreateObject("Scripting.FileSystemObject")
sLogFile = "D:\Log.txt"
Const sCrit1 = "--------"
Const sCrit2 = ", Archiv "
'Um die Länge der Suchkriterien nicht bei jedem Schleifendurchlauf
'erneut ermitteln zu müssen, diese gleich hier speichern:
iLenCrit1 = Len(sCrit1)
iLenCrit2 = Len(sCrit2)
sResult = ""
Set oLogFile = fso.OpenTextFile(sLogFile, 1)
Do Until oLogFile.AtEndOfStream
sLine = oLogFile.ReadLine
If Left(sLine, iLenCrit1) = sCrit1 Then 'Kennung am Zeilenanfang prüfen
iPos = InStr(1, sLine, sCrit2, vbTextCompare) ' Position der 2. Kennung feststellen
If iPos Then 'Wenn 2. Kennung gefunden, ...
sFilePath = Mid(sLine, iPos + iLenCrit2) ' ... den dahinter befindlichen Dateipfad auslesen ...
If fso.FileExists(sFilePath) Then '... und auf Existenz der Datei prüfen.
sFileFound = "Datei gefunden:"
Else
sFileFound = "Nicht gefunden:"
End If
If sResult <> "" Then
sResult = sResult & vbCrLF & sFileFound & vbTab & sFilePath
Else
sResult = sFileFound & vbTab & sFilePath
End If
End If
End If
Loop
oLogFile.Close
WScript.Echo sResult
Grüße
bastla
Hallo cbli!
Um einfacher vergleichen zu können, böte es sich an (und setze ich in meinem unten stehenden Entwurf voraus), auch bei der Erstellung des Gesamtprotokolls den vollen Dateipfad zu verwenden - in Deinem Scriptfragment oben wäre demnach die Zeile
auf
zu ändern.
Die mit
eingefügten Leerzeilen finde ich für die weitere Verarbeitung entbehrlich und würde sie daher weglassen.
Der für Deine zusammengefasste Liste erforderliche Code (aus Zeitgründen nur oberflächlich getestet) könnte etwa so aussehen:
Um die beiden Dateien abzugleichen, wird eine temporäre Datenbank mit den Dateinamen (bzw -pfaden) aus "d:\entpackt.txt" befüllt und für die auch in "d:\tarfehler.log" enthaltenen Dateien um einen Fehlerhinweis ergänzt. Dabei erleichtert die "Filter"-Methode das Suchen. Zusätzlich lässt sich am Ende sehr leicht eine Sortierung vornehmen.
Falls Du auch die Existenzprüfung noch durchführen willst, lässt sich diese nach der Zeile
integrieren.
Am Ende wird dann der gesamte Datenbankinhalt in eine neue Datei ausgegeben.
Grüße
bastla
Um einfacher vergleichen zu können, böte es sich an (und setze ich in meinem unten stehenden Entwurf voraus), auch bei der Erstellung des Gesamtprotokolls den vollen Dateipfad zu verwenden - in Deinem Scriptfragment oben wäre demnach die Zeile
strWriteString = objDatei.name
strWriteString = objDatei.Path
Die mit
objTextStream.WriteBlankLines(1)
Der für Deine zusammengefasste Liste erforderliche Code (aus Zeitgründen nur oberflächlich getestet) könnte etwa so aussehen:
Set fso = CreateObject("Scripting.FileSystemObject")
sLog = "d:\entpackt.txt"
sErrorLog = "d:\tarfehler.log"
sList = "d:\entpackt_komplett.txt"
Const sCrit1 = "--------"
Const sCrit2 = ", Archiv "
'Um die Länge der Suchkriterien nicht bei jedem Schleifendurchlauf
'erneut ermitteln zu müssen, diese gleich hier speichern:
iLenCrit1 = Len(sCrit1)
iLenCrit2 = Len(sCrit2)
Const adVarChar = 200
Const MaxCharacters = 255
Const adFldIsNullable = 32
'Datenbank für Dateien und Fehlerhinweise erstellen ...
Set FileList = CreateObject("ADOR.Recordset")
FileList.Fields.Append "Path", adVarChar, MaxCharacters, adFldIsNullable
FileList.Fields.Append "Error", adVarChar, MaxCharacters, adFldIsNullable
FileList.Open
' ... und mit dem Inhalt der Logdatei befüllen
Set oLog = fso.OpenTextFile(sLog, 1)
Do Until oLog.AtEndOfStream
FileList.AddNew
FileList("Path") = oLog.ReadLine
FileList.Update
Loop
oLog.Close
'Errorlog auslesen und Datenbank um Fehlerhinweise ergänzen
Set oErrorLog = fso.OpenTextFile(sErrorLog, 1)
Do Until oErrorLog.AtEndOfStream
sLine = oErrorLog.ReadLine
If Left(sLine, iLenCrit1) = sCrit1 Then 'Kennung am Zeilenanfang prüfen
iPos = InStr(1, sLine, sCrit2, vbTextCompare) ' Position der 2. Kennung feststellen
If iPos Then 'Wenn 2. Kennung gefunden, ...
sFilePath = Mid(sLine, iPos + iLenCrit2) ' ... den dahinter befindlichen Dateipfad auslesen ...
FileList.Filter = "Path = '" & sFilePath & "'" '... und danach in der Gesamtliste suchen.
FileList.MoveFirst
Do Until FileList.EOF 'Wenn die Datei gefunden wird, ...
FileList("Error") = " ## Fehlerhaft entpackt! ##" '... einen Fehlertext hinzufügen.
FileList.Update
FileList.MoveNext
Loop
FileList.Filter = ""
End If
End If
Loop
oErrorLog.Close
'Gesamtliste inkl Fehlerhinweisen in neue Datei ausgeben
Set oList = fso.OpenTextFile(sList, 2, True)
FileList.Sort = "Path" 'Sortierung nach Dateipfad
'oder nach fehlerhaften Dateien (werden am Ende der Liste zusammengefasst):
'FileList.Sort = "Error"
FileList.MoveFirst
Do Until FileList.EOF
oList.WriteLine FileList.Fields.Item("Path") & FileList.Fields.Item("Error")
FileList.MoveNext
Loop
oList.Close
Falls Du auch die Existenzprüfung noch durchführen willst, lässt sich diese nach der Zeile
sFilePath = Mid(sLine, iPos + iLenCrit2)
Am Ende wird dann der gesamte Datenbankinhalt in eine neue Datei ausgegeben.
Grüße
bastla
Hallo cbli!
verwenden. (Anmerkung: Dieses und das nächste Codebeispiel beruht auf dem letzten von Dir geposteten Scriptansatz.)
schreiben.
Voraussetzung für das Umbenennen ist, dass die Zieldatei noch nicht existiert. Um dies sicher zu stellen, wird eine ev bereits vorhandene Datei vorweg gelöscht.
Hier noch die (ungetestete) "Leerzeilen"-Version des Scripts:
Grüße
bastla
1. In der entpackt_komplett.txt sind ,nach der Verarbeitung, am Anfang 2 Leerzeilen bevor der eigentliche Inhalt anfängt. Wie kann ich diese automatisch entfernen lassen ?
Sollte sich mit der unten stehenden Version des Scripts erledigt haben.2. Hätte ich gerne zwischen den einzelnen Einträgen in entpackt.txt + entpackt_komplett.txt eine Leerzeile stehen, zwecks besserer Übersicht.
Für "entpackt_komplett.txt" bereits unten enthalten, für "entpackt.txt" die ZeileobjTextStream.WriteLine strWriteString & vbCrLF
3. Hätte ich gerne ,daß vor den einzelnen Einträgen in entpackt.txt + entpackt_komplett.txt die Pfadangabe entfernt ist, also der Inhalt dieser beiden Dateien immer mit dem Dateinamen ohne Pfad anfängt. Die Pfadangabe brauche ich nicht und sie kann deshalb weggelassen werden.
Dazu einfach wiederstrWriteString = objDatei.Name
4. Wie kann ich Dateien mit verschiedenen Dateinamen aber gleichen Dateiendungen in einem Verzeichnis so umbenennen,daß nur die Dateiendung geändert wird,aber der Dateiname beibehalten wird
Für die einzelnen "File"-Objekte mit der ".Name"-Eigenschaft ändern, etwa:Set fso = CreateObject("Scripting.FileSystemObject") 'falls nicht ohnehin schon vorher erstellt
sOrdner = "D:\Temp"
sOldExt = ".txt" 'in Kleinbuchstaben angeben
sNewExt = ".doc"
For Each oFile In fso.GetFolder(sOrdner).Files
sOldFile = oFile.Name 'Alter Name inkl Extension
If LCase(Mid(sOldFile, InStrRev(sOldFile, "."))) = sOldExt Then 'Extension isolieren und überprüfen
sNewFile = Left(sOldFile, InStrRev(sOldFile, ".") - 1) & sNewExt 'neuen Namen erstellen
If fso.FileExists(sOrdner & "\" & sNewFile) Then fso.DeleteFile(sOrdner & "\" & sNewFile) 'vorhandene Zieldatei löschen
oFile.Name = sNewFile 'neuen Namen zuweisen (= umbenennen)
End If
Next
Hier noch die (ungetestete) "Leerzeilen"-Version des Scripts:
Set fso = CreateObject("Scripting.FileSystemObject")
sLog = "d:\entpackt.txt"
sErrorLog = "d:\tarfehler.log"
sList = "d:\entpackt_komplett.txt"
Const sCrit1 = "--------"
Const sCrit2 = ", Archiv "
'Um die Länge der Suchkriterien nicht bei jedem Schleifendurchlauf
'erneut ermitteln zu müssen, diese gleich hier speichern:
iLenCrit1 = Len(sCrit1)
iLenCrit2 = Len(sCrit2)
Const adVarChar = 200
Const MaxCharacters = 255
Const adFldIsNullable = 32
'Datenbank für Dateien und Fehlerhinweise erstellen ...
Set FileList = CreateObject("ADOR.Recordset")
FileList.Fields.Append "Path", adVarChar, MaxCharacters, adFldIsNullable
FileList.Fields.Append "Error", adVarChar, MaxCharacters, adFldIsNullable
FileList.Open
' ... und mit dem Inhalt der Logdatei befüllen
Set oLog = fso.OpenTextFile(sLog, 1)
Do Until oLog.AtEndOfStream
sLogLine = oLog.ReadLine
If Trim(sLogLine) <> "" Then
FileList.AddNew
FileList("Path") = sLogLine
FileList.Update
End If
Loop
oLog.Close
'Errorlog auslesen und Datenbank um Fehlerhinweise ergänzen
Set oErrorLog = fso.OpenTextFile(sErrorLog, 1)
Do Until oErrorLog.AtEndOfStream
sLine = oErrorLog.ReadLine
If Left(sLine, iLenCrit1) = sCrit1 Then 'Kennung am Zeilenanfang prüfen
iPos = InStr(1, sLine, sCrit2, vbTextCompare) ' Position der 2. Kennung feststellen
If iPos Then 'Wenn 2. Kennung gefunden, ...
sFilePath = Mid(sLine, iPos + iLenCrit2) ' ... den dahinter befindlichen Dateipfad auslesen ...
sFileName = Mid(sFilePath, InStrRev(sFilePath, "\") + 1) '... auf den Dateinamen reduzieren ...
FileList.Filter = "Path = '" & sFileName & "'" '... und danach in der Gesamtliste suchen.
FileList.MoveFirst
Do Until FileList.EOF 'Wenn die Datei gefunden wird, ...
FileList("Error") = " ## Fehlerhaft entpackt! ##" '... einen Fehlertext hinzufügen.
FileList.Update
FileList.MoveNext
Loop
FileList.Filter = ""
End If
End If
Loop
oErrorLog.Close
'Gesamtliste inkl Fehlerhinweisen in neue Datei ausgeben
Set oList = fso.OpenTextFile(sList, 2, True)
FileList.Sort = "Path" 'Sortierung nach Dateipfad
'oder nach fehlerhaften Dateien (werden am Ende der Liste zusammengefasst):
'FileList.Sort = "Error"
FileList.MoveFirst
Do Until FileList.EOF
oList.WriteLine FileList.Fields.Item("Path") & FileList.Fields.Item("Error") & vbCrLF
FileList.MoveNext
Loop
oList.Close
Grüße
bastla
Hallo cbli!
Füge als 5. Zeile
ein und ersetze den Teil am Ende (nach "oErrorLog.Close" ) durch
Die Spaltenbreiten 450 und 70 wirst Du vermutlich noch anpassen müssen, und die eher minimalistischen Formatierungen der HTML-Version kannst Du ja hoffentlich bald selbst aufpeppen ...
Grüße
bastla
P.S.: Auch diese Version ist nur sehr oberflächlich getestet.
Füge als 5. Zeile
sHTMLList = "d:\entpackt_komplett.html"
'Gesamtliste inkl Fehlerhinweisen in Text- und HTML-Datei ausgeben
Set oList = fso.OpenTextFile(sList, 2, True)
Set oHTMLList = fso.OpenTextFile(sHTMLList, 2, True)
oHTMLList.WriteLine "<HTML><HEAD><TITLE>Dateiübersicht entpackte Dateien</TITLE></HEAD><BODY>"
oHTMLList.WriteLine "<TABLE BORDER=1 CELLSPACING=0 CELLPADDING=0>"
oHTMLList.WriteLine "<TR><TD WIDTH=450><b>Dateiname</b></TD><TD WIDTH=70><b>Fehler</b></TD></TR>"
FileList.Sort = "Path" 'Sortierung nach Dateipfad
'oder nach fehlerhaften Dateien (werden am Ende der Liste zusammengefasst):
'FileList.Sort = "Error"
FileList.MoveFirst
Do Until FileList.EOF
sDateiName = FileList.Fields.Item("Path")
sFehler = FileList.Fields.Item("Error")
oList.WriteLine sDateiName & sFehler & vbCrLF
If sFehler = "" Then
sFehler = " "
Else
sFehler = "Fehler"
End If
oHTMLList.WriteLine "<TR><TD>" & sDateiName & "</TD><TD>" & sFehler & "</TD></TR>"
FileList.MoveNext
Loop
oHTMLList.WriteLine "</TABLE></BODY></HTML>"
oList.Close
oHTMLList.Close
Grüße
bastla
P.S.: Auch diese Version ist nur sehr oberflächlich getestet.
Hallo cbli!
Grüße
bastla
... Leerzeile ... zwischen den Dateinamen zur besseren Übersicht ...
Dafür waren eigentlich die Gitternetzlinien gedacht ...'Gesamtliste inkl Fehlerhinweisen in Text- und HTML-Datei ausgeben
Set oList = fso.OpenTextFile(sList, 2, True)
Set oHTMLList = fso.OpenTextFile(sHTMLList, 2, True)
oHTMLList.WriteLine "<HTML><HEAD><TITLE>Dateiübersicht entpackte Dateien</TITLE></HEAD><BODY>"
oHTMLList.WriteLine "<BR><TABLE BORDER=1 CELLSPACING=0 CELLPADDING=0>"
oHTMLList.WriteLine "<TR><TD WIDTH=450><b>Dateiname</b></TD><TD WIDTH=70><b>Fehler</b></TD></TR>"
FileList.Sort = "Path" 'Sortierung nach Dateipfad
'oder nach fehlerhaften Dateien (werden am Ende der Liste zusammengefasst):
'FileList.Sort = "Error"
FileList.MoveFirst
Do Until FileList.EOF
sDateiName = FileList.Fields.Item("Path")
sFehler = FileList.Fields.Item("Error")
oList.WriteLine sDateiName & sFehler & vbCrLF
If Trim(sFehler) <> "## Fehlerhaft entpackt! ##" Then
sFehler = " "
Else
sFehler = "Fehler"
End If
oHTMLList.WriteLine "<TR><TD>" & sDateiName & "<BR> </TD><TD>" & sFehler & "<BR> </TD></TR>"
FileList.MoveNext
Loop
oHTMLList.WriteLine "</TABLE></BODY></HTML>"
oList.Close
oHTMLList.Close
Grüße
bastla
Hallo cbli!
Tut mir leid, dass sich das so hinzieht ...
Grüße
bastla
Tut mir leid, dass sich das so hinzieht ...
'Gesamtliste inkl Fehlerhinweisen in Text- und HTML-Datei ausgeben
Set oList = fso.OpenTextFile(sList, 2, True)
Set oHTMLList = fso.OpenTextFile(sHTMLList, 2, True)
oHTMLList.WriteLine "<HTML><HEAD><TITLE>Dateiübersicht entpackte Dateien</TITLE></HEAD><BODY>"
oHTMLList.WriteLine "<BR><TABLE BORDER=1 CELLSPACING=0 CELLPADDING=0>"
oHTMLList.WriteLine "<TR><TD WIDTH=450><b>Dateiname</b></TD><TD WIDTH=70><b>Fehler</b></TD></TR>"
FileList.Sort = "Path" 'Sortierung nach Dateipfad
'oder nach fehlerhaften Dateien (werden am Ende der Liste zusammengefasst):
'FileList.Sort = "Error"
FileList.MoveFirst
Do Until FileList.EOF
sDateiName = FileList.Fields.Item("Path")
sFehler = FileList.Fields.Item("Error")
oList.WriteLine Left(sDateiName & Space(50), 50) & sFehler & vbCrLF
If Trim(sFehler) = "## Fehlerhaft entpackt! ##" Then
sFehler = " "
Else
sFehler = "Fehler"
End If
oHTMLList.WriteLine "<TR><TD>" & sDateiName & "<BR> </TD><TD>" & sFehler & "<BR> </TD></TR>"
FileList.MoveNext
Loop
oHTMLList.WriteLine "</TABLE></BODY></HTML>"
oList.Close
oHTMLList.Close
Grüße
bastla
Hallo cbli!
Letzter Versuch:
Grüße
bastla
Letzter Versuch:
'Gesamtliste inkl Fehlerhinweisen in Text- und HTML-Datei ausgeben
Set oList = fso.OpenTextFile(sList, 2, True)
Set oHTMLList = fso.OpenTextFile(sHTMLList, 2, True)
oHTMLList.WriteLine "<HTML><HEAD><TITLE>Dateiübersicht entpackte Dateien</TITLE></HEAD><BODY>"
oHTMLList.WriteLine "<BR><TABLE BORDER=1 CELLSPACING=0 CELLPADDING=0>"
oHTMLList.WriteLine "<TR><TD WIDTH=450><b>Dateiname</b></TD><TD WIDTH=70><b>Fehler</b></TD></TR>"
FileList.Sort = "Path" 'Sortierung nach Dateipfad
'oder nach fehlerhaften Dateien (werden am Ende der Liste zusammengefasst):
'FileList.Sort = "Error"
FileList.MoveFirst
Do Until FileList.EOF
sDateiName = FileList.Fields.Item("Path")
sFehler = FileList.Fields.Item("Error")
oList.WriteLine Left(sDateiName & Space(50), 50) & sFehler & vbCrLF
If IsNull(FileList.Fields.Item("Error")) Then
sFehler = " "
Else
sFehler = "Fehler"
End If
oHTMLList.WriteLine "<TR><TD>" & sDateiName & "<BR> </TD><TD>" & sFehler & "<BR> </TD></TR>"
FileList.MoveNext
Loop
oHTMLList.WriteLine "</TABLE></BODY></HTML>"
oList.Close
oHTMLList.Close
Grüße
bastla
Hallo cbli!
Etwa so:
Grüße
bastla
Etwa so:
Set fso = CreateObject("Scripting.FileSystemObject")
strOrdner = "D:\Temp"
dTypen = Array("xls", "doc")
iAnz = 0
lGr = 0
For Each sTyp In dTypen
For Each bFile In fso.GetFolder(strOrdner).Files
If LCase(fso.GetExtensionName(bFile.Path)) = sTyp Then
iAnz = iAnz + 1
lGr = lGr + bFile.Size
End If
Next
Next
WScript.Echo CStr(iAnz) & " Dateien mit einer Gesamtgröße von " & CStr(lGr) & " Bytes."
Grüße
bastla