gurkensalat89
Goto Top

Bestimmte Zeilen aus einer Datei lesen

Hallo,

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!

Content-ID: 142201

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

Ausgedruckt am: 17.11.2024 um 07:11 Uhr

77559
77559 05.05.2010 um 15:00:36 Uhr
Goto Top
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.
@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
eTh0-R
eTh0-R 05.05.2010 um 15:04:40 Uhr
Goto Top
for /f  "delims=" %%i in ('findstr /C:"Datei kopiert" /C:"Ordner erstellt" default.log') do @echo %%i  

ich versteh aber ned ganz welchen Pfad du nun willst... Source oder Destinationfile ?
gurkensalat89
gurkensalat89 05.05.2010 um 16:04:08 Uhr
Goto Top
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. Wie ginge das? Hab was gelesen, man kann keine 2 Schleifen ineinander verschachteln oder so... ??
77559
77559 05.05.2010 um 16:19:31 Uhr
Goto Top
Zitat von @gurkensalat89:
Hey wow! Das ging aber schnell! VIelen Dank, das funktioniert ja richtig gut!
Nee, ehrlich - ist ja schön.

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.
Einen Wait Befehl kennen die WinDosen normalerweise nicht, er lässt sich aber gut über einen Ping nachbilden:
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 face-wink 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
gurkensalat89
gurkensalat89 11.05.2010 um 12:57:20 Uhr
Goto Top
Hi,
jetzt hab ich noch ein Problem. Ich möchte die herausgefilterten Pfade per "svn add" dem SVN hinzufügen, damit ich danach einen Commit durchführen kann.
Ich habe den obigen Batch-Code etwas erweitert:
@echo off
for /f "Tokens=2 delims=]" %%A in ('findstr "Ordner.erstellt" default.log') do Call :Check %%A  
goto :Eof
:Check
svn add %~3
goto :Eof

goto :Eof .... wo ist denn diese Sprungmarke eigentlich?
warum klappt das svn add nicht? ich verstehs ned... wenn ich es per hand in die konsole eingebe, funktioniert es...
77559
77559 11.05.2010 um 13:25:57 Uhr
Goto Top
Was wann genau in deiner default.log drin steht wissen wir nicht, du offensichtlich auch nicht face-wink

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
gurkensalat89
gurkensalat89 12.05.2010 um 09:21:07 Uhr
Goto Top
Okay, heute geht das "svn add" komischerweise wieder. Oo
Fragt mich nicht warum.

Ich versteh die Schleife noch nicht so ganz mit den Sprungzielen... Was bedeutet "goto :Eof"?

Mein aktueller Code:

@echo off
for /f "Tokens=2 delims=]" %%A in ('findstr "Ordner.erstellt" default.log') do Call :Check %%A  
goto :Eof
:Check
svn add %3
cd c:\workingcopy\svn_repos
goto :Eof
c:\commit.bat


Wenn ich "c:\commit.bat" vor "goto :Eof" setze, heißt es: "Sprungziel Check nicht gefunden". Wenn ich es nach "goto :Eof" setze, so wie hier im Code, kommt diese Meldung nicht, allerdings wird "commit.bat" auch nicht aufgerufen... Wie funktioniert das? Wie funktioniert die Schleife genau?
77559
77559 12.05.2010 um 09:44:07 Uhr
Goto Top
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
gurkensalat89
gurkensalat89 12.05.2010 um 10:18:13 Uhr
Goto Top
Ah, alles klar, danke!
Das nächste Problem:
@echo off
:Start
tskill syncappw
for /f "Tokens=2 delims=]" %%A in ('findstr "Ordner.erstellt" default.log') do Call :Check %%A  
cd c:\workingcopy\svn_repos
Call commit.bat
Call "C:\Programme\Allway Sync\Bin\syncappw.exe"  
Set /A Sekunden=5
Ping -n %Sekunden% localhost >NUL
goto :Start
goto :Eof
:Check
svn add %3
goto :Eof

Das Problem ist die Dauerschleife.. Habs auch schon mit "goto Start" und "goto :Start" versucht, geht beides nicht. Der springt einfach nicht mehr zum Start-Label, sondern verharrt in der Position nach dem Warten (ping an localhost).
Das Warten an sich funktioniert, das hab ich schon getestet, aber er springt einfach nicht mehr an den Anfang.. Oo

PS: mit dem tskill hat das nichts zu tun. Das funktioniert auch super. "syncapp" ist gestartet, bevor die Batch gestartet wird, also funktioniert tskill schon.


EDIT: Mir ist etwas aufgefallen: Ich rufe ja syncapp.exe mit Call auf, bevor er wartet. Dann passiet nichts, er verharrt. Wenn ich aber per Hand das syncappw.exe schließe, macht er weiter im Code und wartet seine 5 Sekunden und springt dann wieder an den Anfang... Warum ist das so? Geht das nicht anders?
77559
77559 12.05.2010 um 10:47:20 Uhr
Goto Top
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 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
gurkensalat89
gurkensalat89 12.05.2010 um 10:58:49 Uhr
Goto Top
Ich glaub du hast meinen EDIT nicht mehr gesehen im obigen Post face-wink

EDIT: Mir ist etwas aufgefallen: Ich rufe ja syncapp.exe mit Call auf, bevor er wartet. Dann passiet nichts, er verharrt. Wenn ich aber per Hand das syncappw.exe schließe, macht er weiter im Code und wartet seine 5 Sekunden und springt dann wieder an den Anfang... Warum ist das so? Geht das nicht anders?


Das selbe ist auch bei deinem Script. Ich verstehe nicht, wieso das nicht funktioniert...
77559
77559 12.05.2010 um 13:43:19 Uhr
Goto Top
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