Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Bestimmte Zeilen aus einer Datei lesen

Frage Entwicklung Batch & Shell

Mitglied: gurkensalat89

gurkensalat89 (Level 1) - Jetzt verbinden

05.05.2010, aktualisiert 14:23 Uhr, 4512 Aufrufe, 12 Kommentare

Hallo,

ich habe ein Logfile ("default.log"), hier ein kleiner Ausschnitt:
01.
[05.05.2010 10:13] Analysiere beendet, Projekt: "New Job 1" 
02.
[05.05.2010 10:13] Datei kopiert: "C:\a\hallo\test.txt" to "C:\b\hallo\test.txt" 
03.
[05.05.2010 10:13] Synchronisiere beendet, Projekt: "New Job 1" 
04.
[05.05.2010 10:13] Zusammenfassung: Projekt "New Job 1"; Dateien verarbeitet: 8; Dateien kopiert: 1; Bytes verarbeitet: 12; Bytes kopiert: 6. 
05.
[05.05.2010 10:14] Analysiere gestartet, Projekt: "New Job 1" 
06.
[05.05.2010 10:14] Synchronisiere gestartet, Projekt: "New Job 1" 
07.
[05.05.2010 10:14] Analysiere beendet, Projekt: "New Job 1" 
08.
[05.05.2010 10:14] Ordner erstellt: "C:\b\test" 
09.
[05.05.2010 10:14] Datei kopiert: "C:\a\test\asds.txt" to "C:\b\test\asds.txt" 
10.
[05.05.2010 10:14] Synchronisiere beendet, Projekt: "New Job 1" 
11.
[05.05.2010 10:14] Zusammenfassung: Projekt "New Job 1"; Dateien verarbeitet: 12; Dateien kopiert: 1; Bytes verarbeitet: 12; Bytes kopiert: 0. 
12.
[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:

01.
@echo off 
02.
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!
Mitglied: LotPings
05.05.2010 um 15:00 Uhr
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.
01.
@echo off 
02.
for /f "Tokens=2 delims=]" %%A in ('findstr "Datei.kopiert Ordner.erstellt" default.log') do Call :Check %%A 
03.
goto :Eof 
04.
:Check 
05.
Echo --- %* 
06.
Echo %%1 = %1 
07.
Echo %%2 = %2 
08.
Echo %%3 = %3 
09.
Echo %%4 = %4 
10.
Echo %%5 = %5 
11.
Echo %%6 = %6 
12.
Echo %%7 = %7 
13.
goto :Eof
Wenn du den jeweils richtigen Wert hast, kannst du den Inhalt ohne Anführungszeichen mit %~1 erhalten.

Gruß
LotPings
Bitte warten ..
Mitglied: eTh0-R
05.05.2010 um 15:04 Uhr
01.
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 ?
Bitte warten ..
Mitglied: gurkensalat89
05.05.2010 um 16:04 Uhr
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... ??
Bitte warten ..
Mitglied: LotPings
05.05.2010 um 16:19 Uhr
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 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
Bitte warten ..
Mitglied: gurkensalat89
11.05.2010 um 12:57 Uhr
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:
01.
@echo off 
02.
for /f "Tokens=2 delims=]" %%A in ('findstr "Ordner.erstellt" default.log') do Call :Check %%A 
03.
goto :Eof 
04.
:Check 
05.
svn add %~3 
06.
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...
Bitte warten ..
Mitglied: LotPings
11.05.2010 um 13:25 Uhr
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
Bitte warten ..
Mitglied: gurkensalat89
12.05.2010 um 09:21 Uhr
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:

01.
@echo off 
02.
for /f "Tokens=2 delims=]" %%A in ('findstr "Ordner.erstellt" default.log') do Call :Check %%A 
03.
goto :Eof 
04.
:Check 
05.
svn add %3 
06.
cd c:\workingcopy\svn_repos 
07.
goto :Eof 
08.
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?
Bitte warten ..
Mitglied: LotPings
12.05.2010 um 09:44 Uhr
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
Bitte warten ..
Mitglied: gurkensalat89
12.05.2010 um 10:18 Uhr
Ah, alles klar, danke!
Das nächste Problem:
01.
@echo off 
02.
:Start 
03.
tskill syncappw 
04.
for /f "Tokens=2 delims=]" %%A in ('findstr "Ordner.erstellt" default.log') do Call :Check %%A 
05.
cd c:\workingcopy\svn_repos 
06.
Call commit.bat 
07.
Call "C:\Programme\Allway Sync\Bin\syncappw.exe" 
08.
Set /A Sekunden=5 
09.
Ping -n %Sekunden% localhost >NUL 
10.
goto :Start 
11.
goto :Eof 
12.
:Check 
13.
svn add %3 
14.
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?
Bitte warten ..
Mitglied: LotPings
12.05.2010 um 10:47 Uhr
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.

01.
@echo off 
02.
Set LogPath=%CD% 
03.
Cd c:\workingcopy\svn_repos 
04.
:Start 
05.
Set Flag=0 
06.
for /f "Tokens=2 delims=]" %%A in ( 
07.
  'findstr "Ordner.erstellt" "%LogPath%\default.log" ' 
08.
    ) do Call :Check %%A 
09.
 
10.
if Flag GTR 0 ( 
11.
  tskill syncappw 
12.
  Call commit.bat 
13.
  "C:\Programme\Allway Sync\Bin\syncappw.exe" 
14.
15.
Set /A Sekunden=5 
16.
Ping -n %Sekunden% localhost >NUL 
17.
goto :Start 
18.
 
19.
:Check 
20.
svn add %3 
21.
Set /A Flag+=1 
22.
goto :Eof
Gruß
LotPings
Bitte warten ..
Mitglied: gurkensalat89
12.05.2010 um 10:58 Uhr
Ich glaub du hast meinen EDIT nicht mehr gesehen im obigen Post

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...
Bitte warten ..
Mitglied: LotPings
12.05.2010 um 13:43 Uhr
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
Bitte warten ..
Neuester Wissensbeitrag
CPU, RAM, Mainboards

Angetestet: PC Engines APU 3a2 im Rack-Gehäuse

(1)

Erfahrungsbericht von ashnod zum Thema CPU, RAM, Mainboards ...

Ähnliche Inhalte
Heiß diskutierte Inhalte
Grafikkarten & Monitore
Win 10 Grafikkarte Crash von Software? (13)

Frage von Marabunta zum Thema Grafikkarten & Monitore ...

DSL, VDSL
DSL-Signal bewerten (13)

Frage von SarekHL zum Thema DSL, VDSL ...

Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (9)

Frage von JayyyH zum Thema Switche und Hubs ...

Backup
Clients als Server missbrauchen? (8)

Frage von 1410640014 zum Thema Backup ...