Bestimmte Zeilen aus einer Datei lesen
Hallo,
ich habe ein Logfile ("default.log"), hier ein kleiner Ausschnitt:
Jetzt möchte ich gerne eine Batch-Datei schreiben, die dieses Logfile durchgeht und nur Zeilen raussucht, wo "Datei kopiert" oder "Ordner erstellt" drin steht. Wenn diese Zeilen rausgefiltert wurden, bräuchte ich den Pfad des jeweiligen Ordners bzw Datei. Ich bin ein Anfänger was Batch angeht und hangel mich schon seit 3 Stunden mit Google durch. Hab auch schon ein wenig was geschrieben, aber es funktioniert noch nicht so, wie ich will:
Das Problem ist, dass er auch Zeilen ausgibt wo "Lese Datei" drin steht. Irgendwie kriegt er das mit dem Leerzeichen nicht auf die Reihe. Kann mir jemand ein paar Tips geben, oder weiterhelfen? Wenn ich die richtigen Zeilen dann habe, wie komme ich an den Pfad ran?
Vielen Dank für eure Hilfe! Liebe Grüße!
ich habe ein Logfile ("default.log"), hier ein kleiner Ausschnitt:
[05.05.2010 10:13] Analysiere beendet, Projekt: "New Job 1"
[05.05.2010 10:13] Datei kopiert: "C:\a\hallo\test.txt" to "C:\b\hallo\test.txt"
[05.05.2010 10:13] Synchronisiere beendet, Projekt: "New Job 1"
[05.05.2010 10:13] Zusammenfassung: Projekt "New Job 1"; Dateien verarbeitet: 8; Dateien kopiert: 1; Bytes verarbeitet: 12; Bytes kopiert: 6.
[05.05.2010 10:14] Analysiere gestartet, Projekt: "New Job 1"
[05.05.2010 10:14] Synchronisiere gestartet, Projekt: "New Job 1"
[05.05.2010 10:14] Analysiere beendet, Projekt: "New Job 1"
[05.05.2010 10:14] Ordner erstellt: "C:\b\test"
[05.05.2010 10:14] Datei kopiert: "C:\a\test\asds.txt" to "C:\b\test\asds.txt"
[05.05.2010 10:14] Synchronisiere beendet, Projekt: "New Job 1"
[05.05.2010 10:14] Zusammenfassung: Projekt "New Job 1"; Dateien verarbeitet: 12; Dateien kopiert: 1; Bytes verarbeitet: 12; Bytes kopiert: 0.
[05.05.2010 11:00] Programm beendet, Profil: "default profile"
Jetzt möchte ich gerne eine Batch-Datei schreiben, die dieses Logfile durchgeht und nur Zeilen raussucht, wo "Datei kopiert" oder "Ordner erstellt" drin steht. Wenn diese Zeilen rausgefiltert wurden, bräuchte ich den Pfad des jeweiligen Ordners bzw Datei. Ich bin ein Anfänger was Batch angeht und hangel mich schon seit 3 Stunden mit Google durch. Hab auch schon ein wenig was geschrieben, aber es funktioniert noch nicht so, wie ich will:
@echo off
for /f "delims=" %%i in ('findstr "Datei kopiert" default.log') do echo %%i
Das Problem ist, dass er auch Zeilen ausgibt wo "Lese Datei" drin steht. Irgendwie kriegt er das mit dem Leerzeichen nicht auf die Reihe. Kann mir jemand ein paar Tips geben, oder weiterhelfen? Wenn ich die richtigen Zeilen dann habe, wie komme ich an den Pfad ran?
Vielen Dank für eure Hilfe! Liebe Grüße!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 142201
Url: https://administrator.de/contentid/142201
Ausgedruckt am: 17.11.2024 um 07:11 Uhr
12 Kommentare
Neuester Kommentar
Hallo,
findstr arbeitet by default mit RegEx und mehrere Begriffe, mit Leerzeichen getrennt, werden als oder-Suche betrachtet. Von daher ist das Ergebnis zu erwarten.
Um den richtigen Wert den du brauchst herauszufinden probier mal dies.
Wenn du den jeweils richtigen Wert hast, kannst du den Inhalt ohne Anführungszeichen mit
Gruß
LotPings
findstr arbeitet by default mit RegEx und mehrere Begriffe, mit Leerzeichen getrennt, werden als oder-Suche betrachtet. Von daher ist das Ergebnis zu erwarten.
Um den richtigen Wert den du brauchst herauszufinden probier mal dies.
@echo off
for /f "Tokens=2 delims=]" %%A in ('findstr "Datei.kopiert Ordner.erstellt" default.log') do Call :Check %%A
goto :Eof
:Check
Echo --- %*
Echo %%1 = %1
Echo %%2 = %2
Echo %%3 = %3
Echo %%4 = %4
Echo %%5 = %5
Echo %%6 = %6
Echo %%7 = %7
goto :Eof
Wenn du den jeweils richtigen Wert hast, kannst du den Inhalt ohne Anführungszeichen mit
%~1
erhalten.Gruß
LotPings
Zitat von @gurkensalat89:
Hey wow! Das ging aber schnell! VIelen Dank, das funktioniert ja richtig gut!
Nee, ehrlich - ist ja schön.Hey wow! Das ging aber schnell! VIelen Dank, das funktioniert ja richtig gut!
Jetzt habe ich noch eine andere Frage: Ich möchte gerne den Code, den du mir gegeben hast, in eine Dauerschleife verpacken
und jedesmal am Ende ein "wait 1000" einfügen, damit er 1000 Sekunden wartet.
Die Logfile ändert sich ja, und darum soll die Batch alle 1000 Sekunden neu abfragen.
Set /A Sekunden=1000
Ping -n %Sekunden% localhost >NUL
Wie ginge das? Hab was gelesen, man kann keine 2 Schleifen ineinander verschachteln oder so... ??
Das ist Lötzinn Außerdem gar niht nötig, setz einen Label an den :Anfang - hinten einen Goto :Anfang und es läuft ewig/bis zum Abbruch.Gruß
LotPings
Was wann genau in deiner default.log drin steht wissen wir nicht, du offensichtlich auch nicht
Pack mal vor den svn Befehl ein Echo und dahinter eine Pause, damit du sehen kannst was tatsächlich im Parameter %3 drinsteht, ggfs auch nochmal dir anderen ausgeben %1-%n ausgeben.
Ich weiß auch nicht ob svn die mit der ~ entfernten Anführungszeichen braucht, in dem Fall einfach %3 nehmen.
Gruß
LotPings
Pack mal vor den svn Befehl ein Echo und dahinter eine Pause, damit du sehen kannst was tatsächlich im Parameter %3 drinsteht, ggfs auch nochmal dir anderen ausgeben %1-%n ausgeben.
Ich weiß auch nicht ob svn die mit der ~ entfernten Anführungszeichen braucht, in dem Fall einfach %3 nehmen.
Gruß
LotPings
Moin,
:Eof ist ein Standard Label für "End of file", er bewirkt das aus der subroutine zurückgesprungen wird.
Ein Befehl der hinter dem Goto :Eof steht, kann niemals ausgeführt werden.
Wenn du aber aus einer Batch heraus eine andere aufrufst, musst du Call davorsetzen damit nach Beendigung der anderen Batch die Erste fortgesetzt werden kann.
Gruß
LotPings
:Eof ist ein Standard Label für "End of file", er bewirkt das aus der subroutine zurückgesprungen wird.
Ein Befehl der hinter dem Goto :Eof steht, kann niemals ausgeführt werden.
Wenn du aber aus einer Batch heraus eine andere aufrufst, musst du Call davorsetzen damit nach Beendigung der anderen Batch die Erste fortgesetzt werden kann.
Gruß
LotPings
Ob und wie deine syncappw mit dem Killen im Rhytmus von 5 Sekunden klar kommt weiß ich nicht.
Zeile 11 in deiner Batch ist überflüssig.
Ich nehme mal der Ordner in dem sich die Batchdatei und die default.log befinden ist nicht
Dann hast du ab dem zweiten Durchlauf das Problem das die default.log ohne Pfadangabe nicht gefunden wird.
Ich würde ja auch einen Merker einbauen der den comit nur anstößt, wenn tatsächlich ein neuer Ordner gefunden wird.
Gruß
LotPings
Zeile 11 in deiner Batch ist überflüssig.
Ich nehme mal der Ordner in dem sich die Batchdatei und die default.log befinden ist nicht
cd c:\workingcopy\svn_repos
.Dann hast du ab dem zweiten Durchlauf das Problem das die default.log ohne Pfadangabe nicht gefunden wird.
Ich würde ja auch einen Merker einbauen der den comit nur anstößt, wenn tatsächlich ein neuer Ordner gefunden wird.
@echo off
Set LogPath=%CD%
Cd c:\workingcopy\svn_repos
:Start
Set Flag=0
for /f "Tokens=2 delims=]" %%A in (
'findstr "Ordner.erstellt" "%LogPath%\default.log" '
) do Call :Check %%A
if Flag GTR 0 (
tskill syncappw
Call commit.bat
"C:\Programme\Allway Sync\Bin\syncappw.exe"
)
Set /A Sekunden=5
Ping -n %Sekunden% localhost >NUL
goto :Start
:Check
svn add %3
Set /A Flag+=1
goto :Eof
Gruß
LotPings
Ich habe deinen Edit nicht gesehen,
aber der call hat nur bei Batch Dateien eine Wirkung. Wenn du eine Exe startest und nicht auf deren Beendigung warten willst,
benutze "Start" statt "Call" - dabei musst du darauf achten das Start den ersten Parameter in Anführungszeichen als FensterTitel betrachtet - also musst du den explizit setzen
Start "Fenstertitel" "C:\Programme\Allway Sync\Bin\syncappw.exe"
Gruß
LotPings
aber der call hat nur bei Batch Dateien eine Wirkung. Wenn du eine Exe startest und nicht auf deren Beendigung warten willst,
benutze "Start" statt "Call" - dabei musst du darauf achten das Start den ersten Parameter in Anführungszeichen als FensterTitel betrachtet - also musst du den explizit setzen
Start "Fenstertitel" "C:\Programme\Allway Sync\Bin\syncappw.exe"
Gruß
LotPings