Logfile letzten Zeilen in Txt File mit Batch
Hallo,
ich habe ein Text Logfile, welches ich mit robocopy erstelle. Am ende dieses Logfieles steht eine Zusammenfassung, immer in den letzten 10 Zeilen.
Wie kann ich mit einer Batchfile diese 10 Zeilen in ein anderes Textfile kopieren.
Das Logfile kann unterschiedlich lang sein, deshalb komme ich mit Zeilenangaben nicht weiter.
Danke
Keksprinz
ich habe ein Text Logfile, welches ich mit robocopy erstelle. Am ende dieses Logfieles steht eine Zusammenfassung, immer in den letzten 10 Zeilen.
Wie kann ich mit einer Batchfile diese 10 Zeilen in ein anderes Textfile kopieren.
Das Logfile kann unterschiedlich lang sein, deshalb komme ich mit Zeilenangaben nicht weiter.
Danke
Keksprinz
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 13620
Url: https://administrator.de/contentid/13620
Ausgedruckt am: 16.11.2024 um 03:11 Uhr
21 Kommentare
Neuester Kommentar
...aber die Zusammenfassung fängt doch immer mit einem bestimmten Text an?
Wäre jedenfalls meine Strategie, ab einer bestimmten Zeile (Kriterium "Suchtext") den Rest zu lesen/anzuzeigen. Und zwar mit der Mimik, die hier steht: IP Adresse als Systemvariable speichern (die Lösung mit "find" und "more" von stupsnose)
Andernfalls gibt es für Windows auch ein paar Unix-like Freeware-Utilities a la head/footer, die jeweils die ersten/letzten n Zeilen anzeigen können.
Frank /der Biber aus Bremen
Wäre jedenfalls meine Strategie, ab einer bestimmten Zeile (Kriterium "Suchtext") den Rest zu lesen/anzuzeigen. Und zwar mit der Mimik, die hier steht: IP Adresse als Systemvariable speichern (die Lösung mit "find" und "more" von stupsnose)
Andernfalls gibt es für Windows auch ein paar Unix-like Freeware-Utilities a la head/footer, die jeweils die ersten/letzten n Zeilen anzeigen können.
Frank /der Biber aus Bremen
Also bei mir wären das 11 Zeilen zum auslesen, da Robocopy am Ende eine Leerzeile anfügt.
Schreiben kann ich jetzt nichts, muss nebenher auch noch was arbeiten
Darum nur mal ein möglicher Ansatz für ein VBScript.
Das Log mit ReadLine zeilenweise in eine Variable lesen und einen Zähler mitlaufen lassen.
Danach alle Zeilen in eine weitere Variable schreiben, die > Zähler - 11 sind.
Zweites Log ForAppending öffnen und die zweite Variable reinschreiben.
Wie gesagt noch nicht ausgegoren aber sollte funktionieren.
Schreiben kann ich jetzt nichts, muss nebenher auch noch was arbeiten
Darum nur mal ein möglicher Ansatz für ein VBScript.
Das Log mit ReadLine zeilenweise in eine Variable lesen und einen Zähler mitlaufen lassen.
Danach alle Zeilen in eine weitere Variable schreiben, die > Zähler - 11 sind.
Zweites Log ForAppending öffnen und die zweite Variable reinschreiben.
Wie gesagt noch nicht ausgegoren aber sollte funktionieren.
Okay, keksprinz,
anbei kurze Skizze als Batchdatei. Sind im wesentlichen drei Zeilen.
Ich habe eine englische Robycoby-Version, die die Summary so einleitet:
"Total Copied Skipped Mismatch FAILED Extras"
Wenn die LogDatei also Robocopy.log hieße ("robocopy von nach [parameter] /Log:robocopy.log"), dann:
- schreibt die erste der grünen Zeilen die Zeilennummer der gesuchten Zeile und ein bisschen Beiwerk weg ( [234] ...)
- in der zweiten Zeile wird die Zeilennummer der Variablen %rczeile% zugewiesen
- in der dritten Zeile zeigt "more" alles ab dieser Zeile an (und läßt sich umleiten)
Hope That Helps
Frank /der Biber aus Bremen
P.S. Würde ich auch als Einzeiler hinbekommen, aber das erspar ich uns
anbei kurze Skizze als Batchdatei. Sind im wesentlichen drei Zeilen.
Ich habe eine englische Robycoby-Version, die die Summary so einleitet:
"Total Copied Skipped Mismatch FAILED Extras"
Wenn die LogDatei also Robocopy.log hieße ("robocopy von nach [parameter] /Log:robocopy.log"), dann:
- schreibt die erste der grünen Zeilen die Zeilennummer der gesuchten Zeile und ein bisschen Beiwerk weg ( [234] ...)
- in der zweiten Zeile wird die Zeilennummer der Variablen %rczeile% zugewiesen
- in der dritten Zeile zeigt "more" alles ab dieser Zeile an (und läßt sich umleiten)
::::::::::::::::::::-------Robologsummary.bat
@echo off
::..ggf mit Parameter [logdatei] aufrufen.
if (%1)==() (set rclog=robocopy.log) else (set rclog=%1)
find /n "Total Copied Skipped Mismatch FAILED Extras" %rclog% >%temp%\rctmp.txt
for /F "delims= skip=2 tokens=1" %%a in ( %temp%\rctmp.txt) do Set /a rcZeile=%%a - 1
more +%rcZeile% %rclog%
:: und den more-Output ggf in eine neue Datei mit
::.... echo Robocopy-Summary vom %date%: >>neueDatei
::.... more +%rcZeile% %rclog% >>neueDatei
::::::::::::::::::---------- EndeRobologsummary.bat
Frank /der Biber aus Bremen
P.S. Würde ich auch als Einzeiler hinbekommen, aber das erspar ich uns
Ich könnte so ne Batch-Datei auch brauchen.
Allerdings ist mein Inhalt in der *.txt ab der 2. Zeile immer anders.
Ich kann auch nicht sagen, wieviel Zeilen die *.txt im Endeffekt hat, das ist immer unterschiedlich (neue Benutzer kommen hinzu oder werden gelöscht).
Wäre aber super, wenn es ne Batch-Datei geben würde, die mir die 1. Zeile und sagen wir die nächsten 10 Zeilen in eine neue *.txt speichert und zwar aufsteigend.
Also sagen wir die *.txt heisst bla.txt mit Inhalt "Benutzer" und den Buchstaben A bis Z und darunter die Namen wie Arnold bis Zyklop, dann sollen die ersten 10 Buchstaben/Namen samt "Benutzer" in eine neue *.txt gespeichert werden, die sich dann bla.txt-1 nennt und das halt mit allen Buchstaben/Namen die in der *.txt stehen.
Nochmal zur Veranschaulichung (das enthält die bla.txt):
Zeile 1: Benutzer
Zeile 2: A
Zeile 3: Anton
Zeile 4: Arnold
Zeile 5: B
Zeile 6: Berta
Zeile ..............
usw.
Ende der Benutzer!
Jetzt soll der die 1. Zeile "Benutzer" und die nächsten 10 Zeilen in eine neue *.txt kopieren und diese bla-1.txt nennen, dann wieder die 1. Zeile "Benutzer" und die nächsten 10 Zeilen, die Datei heisst dann bla-2.txt usw.
Ich hoffe mir kann da jemand was vernünftiges schreiben.
Allerdings ist mein Inhalt in der *.txt ab der 2. Zeile immer anders.
Ich kann auch nicht sagen, wieviel Zeilen die *.txt im Endeffekt hat, das ist immer unterschiedlich (neue Benutzer kommen hinzu oder werden gelöscht).
Wäre aber super, wenn es ne Batch-Datei geben würde, die mir die 1. Zeile und sagen wir die nächsten 10 Zeilen in eine neue *.txt speichert und zwar aufsteigend.
Also sagen wir die *.txt heisst bla.txt mit Inhalt "Benutzer" und den Buchstaben A bis Z und darunter die Namen wie Arnold bis Zyklop, dann sollen die ersten 10 Buchstaben/Namen samt "Benutzer" in eine neue *.txt gespeichert werden, die sich dann bla.txt-1 nennt und das halt mit allen Buchstaben/Namen die in der *.txt stehen.
Nochmal zur Veranschaulichung (das enthält die bla.txt):
Zeile 1: Benutzer
Zeile 2: A
Zeile 3: Anton
Zeile 4: Arnold
Zeile 5: B
Zeile 6: Berta
Zeile ..............
usw.
Ende der Benutzer!
Jetzt soll der die 1. Zeile "Benutzer" und die nächsten 10 Zeilen in eine neue *.txt kopieren und diese bla-1.txt nennen, dann wieder die 1. Zeile "Benutzer" und die nächsten 10 Zeilen, die Datei heisst dann bla-2.txt usw.
Ich hoffe mir kann da jemand was vernünftiges schreiben.
Na, Oli-nux,
ob vernünftig, weiß ich nicht... aber was schnell zusammengeschreddertes kann ich anbieten. Obwohl Dein Problem ja soviel mit Zeilen ans LogFile anhängen zu tun wie Bätcheln mit Programmieren..*gg
Aber egal, unter diesem Thread liest dann halt keiner außer uns beiden mit.
Wäre mir aber auch schwer gefallen, eine passende Überschrift zu finden.
Ich hoffe, ich hab Dich halbwegs richtig verstanden... bei mir werden aus dem Input ("bla.txt" )
solange Häppchen-Dateien "bla-1.txt", "bla-2.txt",usw gemacht wie noch User in der Bla.txt sind. Und ein bisschen überflüssiger Debugtext, damit man/frau was sieht.
Also Inputdatei "bla.txt"
Und das ist die splitbla.txt mit all ihren vielen Zeilen..*gg
(Variable blafile ist nur zum besseren Lesen da, ist natürlich überflüssig.)
War es das in etwa, was Du meintest?
Frank / der Biber aus Bremen
ob vernünftig, weiß ich nicht... aber was schnell zusammengeschreddertes kann ich anbieten. Obwohl Dein Problem ja soviel mit Zeilen ans LogFile anhängen zu tun wie Bätcheln mit Programmieren..*gg
Aber egal, unter diesem Thread liest dann halt keiner außer uns beiden mit.
Wäre mir aber auch schwer gefallen, eine passende Überschrift zu finden.
Ich hoffe, ich hab Dich halbwegs richtig verstanden... bei mir werden aus dem Input ("bla.txt" )
solange Häppchen-Dateien "bla-1.txt", "bla-2.txt",usw gemacht wie noch User in der Bla.txt sind. Und ein bisschen überflüssiger Debugtext, damit man/frau was sieht.
Also Inputdatei "bla.txt"
Benutzer
AAA
AAB......erster
Aachen....zweiter FILE: bla-5.txt LN :2 Text:
Adele FILE: bla-5.txt LN :3 Text:
Aerosmith
Afk,
Agnes
Ahnungslos
Aida
Ajax
Akazia
Alter Schwede
Am
AMMO+
AMMOMEGAPACK++
AMMOSUPERMEGAMEGAPACK
Anna
Antje
Anus
Aorta
April
Aqua
Aries
As is it is et jut
Astoria die Berlinerin
Astrid die Schwäbin
Attention
Au weia
Avignon
Awsome
Axa
Ayayay
Azalee die Rote
Babsi die Blonde
Baby Balla
Babylon Barney
Barney G.
----ende bla.txt ...beginn erzeugte bla-1.txt
Benutzer
FILE: bla-1.txt LN :2 Text: AAA
FILE: bla-1.txt LN :3 Text: AAB......erster
FILE: bla-1.txt LN :4 Text: Aachen....zweiter FILE: bla-5.txt LN :2 Text:
FILE: bla-1.txt LN :5 Text: Adele FILE: bla-5.txt LN :3 Text:
FILE: bla-1.txt LN :6 Text: Aerosmith
FILE: bla-1.txt LN :7 Text: Afk,
FILE: bla-1.txt LN :8 Text: Agnes
FILE: bla-1.txt LN :9 Text: Ahnungslos
FILE: bla-1.txt LN :10 Text: Aida
---- beginn erzeugte bla-2.txt
Benutzer
FILE: bla-2.txt LN :2 Text: Ajax
FILE: bla-2.txt LN :3 Text: Akazia
FILE: bla-2.txt LN :4 Text: Alter Schwede
FILE: bla-2.txt LN :5 Text: Am
FILE: bla-2.txt LN :6 Text: AMMO+
FILE: bla-2.txt LN :7 Text: AMMOMEGAPACK++
FILE: bla-2.txt LN :8 Text: AMMOSUPERMEGAMEGAPACK
FILE: bla-2.txt LN :9 Text: Anna
FILE: bla-2.txt LN :10 Text: Antje
---- beginn erzeugte bla-3.txt
Benutzer
FILE: bla-3.txt LN :2 Text: Anus
FILE: bla-3.txt LN :3 Text: Aorta
FILE: bla-3.txt LN :4 Text: April
FILE: bla-3.txt LN :5 Text: Aqua
FILE: bla-3.txt LN :6 Text: Aries
FILE: bla-3.txt LN :7 Text: As is it is et jut
FILE: bla-3.txt LN :8 Text: Astoria die Berlinerin
FILE: bla-3.txt LN :9 Text: Astrid die Schwäbin
FILE: bla-3.txt LN :10 Text: Attention
----beginn erzeugte bla-4.txt
Benutzer
FILE: bla-4.txt LN :2 Text: Au weia
FILE: bla-4.txt LN :3 Text: Avignon
FILE: bla-4.txt LN :4 Text: Awsome
FILE: bla-4.txt LN :5 Text: Axa
FILE: bla-4.txt LN :6 Text: Ayayay
FILE: bla-4.txt LN :7 Text: Azalee die Rote
FILE: bla-4.txt LN :8 Text: Babsi die Blonde
FILE: bla-4.txt LN :9 Text: Baby Balla
FILE: bla-4.txt LN :10 Text: Babylon Barney
-------- beginn erzeugte bla-5.txt
Benutzer
FILE: bla-5.txt LN :2 Text: Barney G.
@echo off
IF (%1)==() (echo Syntax %0 inputfile) & goto :eof
if not exist "%1" echo (Datei %1 nicht gefunden) & goto :eof
setlocal
set blafile=%1
type %blafile% |find /i "Benutzer" >%temp%\Headline.Txt
(set /a cntLn=0 ) && REM Zeilenzähler
(set /a MaxLnsPerFile=10) && REM Max. Zeilen je Splitdatei, eigentlich Konstante
(set /a FileCnt=1 ) && REM Zähler für die Splitdateien
(Set Dirty=TRUE ) && REM DirtyFlag.. muss ich noch eine Datei "endgültig" schreiben?
if exist %temp%\tmpbla*.tmp del /q %temp%\tmpbla-*.tmp >nul
for /F "Tokens=1* delims=" %%a IN ('type %blafile%') do call :WriteTmp %1 "%%a"
IF "%Dirty%"=="TRUE" call :WriteFinal %~n1-%FileCnt%%~x1
goto :eof
---------hier Ende der Welt
:WriteTmp
Set /a cntln=%cntln%+1
IF %cntln% GTR 1 (
echo FILE: %~n1-%FileCnt%%~x1 LN :%cntln% Text: %~2>>%temp%\tmpbla-%FileCnt%.tmp
SET Dirty=TRUE
If %cntln% EQU %MaxLnsPerFile% call :WriteFinal %~n1-%FileCnt%%~x1 )
goto :eof
------- ende WriteTmp-Block...zurück zur FOR.. IN.. DO..Schleife
:WriteFinal
Copy /b "%temp%\Headline.Txt"+ "%temp%\tmpbla-%FileCnt%.tmp" "%1" >nul
(SET Dirty=FALSE) & (set /a cntln=1) & (set /a FileCnt=%FileCnt%+1)
goto :eof
(Variable blafile ist nur zum besseren Lesen da, ist natürlich überflüssig.)
War es das in etwa, was Du meintest?
Frank / der Biber aus Bremen
@Biber
Ich glaube du hast schon richtig verstanden was ich wollte.
Das Script funktioniert prima.
Schon mal Danke dafür.
Allerdings möchte ich, dass folgendes nicht in den gesplitteten Text-Files enthalten ist:
FILE: benutzer-1.txt LN :2 Text:
Sondern eben nur für das file benutzer-1.txt die Anfangsbuchstaben also A bis D und darunter jeweils die Benutzernamen.
Sonst muss ich pro Text-File ja noch mit dem "Ersetzen" arbeiten.
Wenn möglich auch noch die Erste und Letzte Zeile der Original bla.txt in jede nummerierte (bla-1.txt, bla-2.txt etc.) übernehmen.
Alles andere ist schon ganz richtig so.
Also sieht die benutzer-1.txt zum Schluß (bzw. so soll sie aussehen) so aus:
A
Andre
Arnold
B
Berta
C
Carolin
D
Dieter
Oder wenn das mit der Ersten und Letzten Zeile nicht geht, dass du noch nen script machst, welches in allen erzeugten bla-files (bla-1.txt, bla-2.txt etc.) mir folgendes löscht:
FILE: benutzer-1.txt LN :2 Text:
Denke aber, das man dies doch im Script umschreiben könnte.
Ich glaube du hast schon richtig verstanden was ich wollte.
Das Script funktioniert prima.
Schon mal Danke dafür.
Allerdings möchte ich, dass folgendes nicht in den gesplitteten Text-Files enthalten ist:
FILE: benutzer-1.txt LN :2 Text:
Sondern eben nur für das file benutzer-1.txt die Anfangsbuchstaben also A bis D und darunter jeweils die Benutzernamen.
Sonst muss ich pro Text-File ja noch mit dem "Ersetzen" arbeiten.
Wenn möglich auch noch die Erste und Letzte Zeile der Original bla.txt in jede nummerierte (bla-1.txt, bla-2.txt etc.) übernehmen.
Alles andere ist schon ganz richtig so.
Also sieht die benutzer-1.txt zum Schluß (bzw. so soll sie aussehen) so aus:
A
Andre
Arnold
B
Berta
C
Carolin
D
Dieter
Oder wenn das mit der Ersten und Letzten Zeile nicht geht, dass du noch nen script machst, welches in allen erzeugten bla-files (bla-1.txt, bla-2.txt etc.) mir folgendes löscht:
FILE: benutzer-1.txt LN :2 Text:
Denke aber, das man dies doch im Script umschreiben könnte.
Okay, Oli-Nux,
hab ich teilweise verstanden...
echo FILE: %~n1-%FileCnt%%~x1 LN :%cntln% Text: %~2>>%temp%\tmpbla-%FileCnt%.tmp
Ändere die um in die "Produktiv-Zeile"
echo %~2>>%temp%\tmpbla-%FileCnt%.tmp ...fertig.
>Sondern eben nur für das file benutzer-1.txt die Anfangsbuchstaben also A bis D und darunter jeweils die Benutzernamen.
Okay. Ist das eine Zusatzfunktionalilät? Oder sind die Einzelbuchstaben "A", "B"... usw. schon in der Quelldatei als Einzelzeilen? Ider sollen die erst für die Outputdateien generiert werden? ..ich schau mal gleich nach Deiner Antwort, ehe ich was ändere.
>Wenn möglich auch noch die Erste und Letzte Zeile der Original bla.txt in jede nummerierte (bla-1.txt, bla-2.txt etc.) übernehmen.
Verstanden: Die erste Zeile (in dem Beispiel die Zeile "Benutzer") wird übernommen.
Nicht verstanden: "die letzte Zeile ..übernehmen " ????? Hä? Wo? Wohin? Wozu?
Gespannt wartend
Biber
hab ich teilweise verstanden...
Allerdings möchte ich, dass folgendes nicht in den gesplitteten Text-Files enthalten ist:
FILE: benutzer-1.txt LN :2 Text:
Das ist ja nur die bisherige Debug-Display-Zeile:FILE: benutzer-1.txt LN :2 Text:
echo FILE: %~n1-%FileCnt%%~x1 LN :%cntln% Text: %~2>>%temp%\tmpbla-%FileCnt%.tmp
Ändere die um in die "Produktiv-Zeile"
echo %~2>>%temp%\tmpbla-%FileCnt%.tmp ...fertig.
>Sondern eben nur für das file benutzer-1.txt die Anfangsbuchstaben also A bis D und darunter jeweils die Benutzernamen.
Okay. Ist das eine Zusatzfunktionalilät? Oder sind die Einzelbuchstaben "A", "B"... usw. schon in der Quelldatei als Einzelzeilen? Ider sollen die erst für die Outputdateien generiert werden? ..ich schau mal gleich nach Deiner Antwort, ehe ich was ändere.
>Wenn möglich auch noch die Erste und Letzte Zeile der Original bla.txt in jede nummerierte (bla-1.txt, bla-2.txt etc.) übernehmen.
Verstanden: Die erste Zeile (in dem Beispiel die Zeile "Benutzer") wird übernommen.
Nicht verstanden: "die letzte Zeile ..übernehmen " ????? Hä? Wo? Wohin? Wozu?
Gespannt wartend
Biber
Allerdings möchte ich, dass folgendes nicht in den gesplitteten Text-Files enthalten ist:
FILE: benutzer-1.txt LN :2 Text:
Das ist ja nur die bisherige Debig-Display-Zeile:FILE: benutzer-1.txt LN :2 Text:
echo FILE: %~n1-%FileCnt%%~x1 LN :%cntln% Text: %~2>>%temp%\tmpbla-%FileCnt%.tmp
Ändere die um in die "Produktiv-Zeile"
echo %~2>>%temp%\tmpbla-%FileCnt%.tmp ...fertig.
\Hab ich gemacht und nun ist es genau so, wie ich es wollte.
Sondern eben nur für das file benutzer-1.txt die Anfangsbuchstaben also A bis D und darunter jeweils die Benutzernamen.
\Ne, ich glaub das passt schon hab das nochmal überprüft. Okay. ist das eine Zusatzfunktionalilät? Oder sind die Einzelbuchstaben "A", "B"... usw. schon in der Quelldatei als Einzelzeilen? Ider sollen die erst für die Outputdateien generiert werden?
\Es soll bei den gesplitteten Files aber wie in der Original bla.txt auch in der ersten Zeile "Benutzer" stehen und in der Letzten "Benutzer-Ende". Er soll also immer die erste und letzte Zeile (egal was da steht) in die gesplitteten übernehmen.
Wenn möglich auch noch die Erste und Letzte Zeile der Original bla.txt in jede nummerierte (bla-1.txt, bla-2.txt etc.) übernehmen.
Nicht verstanden: "die letzte Zeile ..übernehmen " ????? Hä? Wo? Wohin? Wozu?Verstanden: Die erste Zeile (in dem Beispiel die Zeile "Benutzer") wird übernommen.
\In der Letzten Zeile steht z.b. "Benuter-Ende" und das soll auch übernommen werden.
\Ich kann dir allerdings nicht sagen in welcher Zeile (sich die letzte Zeile befindet), denn das kommt immer drauf an, wieviel Benutzer in der Original bla.txt gelistet sind.
PS: Wie lernt man sowas zu schreiben?
Okay, Oli_Nux,
wenns weiter nichts ist..
Ich leg mal die ge-"NumberMe"-te SplitBla.txt bei.
("NumberMe.bat" siehe Workshop Batch for Runaways - Part 2 Ein bisschen Handwerkszeug)
Meine "Bla.txt" hab ich so verändert:
Output z.B. von Bla-4.txt:
Wie Du siehst, gehen eventuelle Umlaute kaputt, d.h. ich müsste, falls tatsächlich Umlaute in der bla.txt drin wären, diese maskieren. Auch kein Problem, aber dass wollte ich im Part 3 des Batch-Workshops machen. Oder in einem anderen Thread. Oder in einem anderen Leben.
HTH Frank / der Biber aus Bremen
P.S.: >PS: Wie lernt man sowas zu schreiben?
Mögliche Antworten:
a) in Hogwarts?
b) By Doing?
c) in meinem Batch-Workshop?
P.P.S. Natürlich habe ich mir auch eine "DeNumberMe.bat" geschrieben, falls hier oder in einem anderen Forum mal irgendeine Pappnase Sourcecode mit Zeilennummern postet. *lacht*
wenns weiter nichts ist..
Ich leg mal die ge-"NumberMe"-te SplitBla.txt bei.
("NumberMe.bat" siehe Workshop Batch for Runaways - Part 2 Ein bisschen Handwerkszeug)
01 ::-----snipp Splitbla.bat Vers. 0.2----
02 @echo off
03 IF (%1)==() (echo Syntax %0 inputfile) & goto :eof
04 if not exist "%1" echo (Datei %1 nicht gefunden) & goto :eof
05 setlocal
06 (set blafile=%1) & (set FirstLine=) & (set LastLine=)
07 for /f "delims=" %%i in ('type bla.txt') do if not defined firstline set firstline=%%i
08 for /f "delims=" %%i in ('type bla.txt') do set lastline=%%i
09 echo %firstline% >%temp%\Headline.Txt
10 :: type %blafile% |find /i "Benutzer" >%temp%\Headline.Txt
11 (set /a cntLn=0 ) && REM Zeilenzähler
12 (set /a MaxLnsPerFile=10) && REM Max. Zeilen je Splitdatei, eigentlich Konstante
13 (set /a FileCnt=1 ) && REM Zähler für die Splitdateien
14 (Set Dirty=TRUE ) && REM DirtyFlag.. muss ich noch eine Datei "endgültig" schreiben?
15 if exist %temp%\tmpbla*.tmp del /q %temp%\tmpbla-*.tmp >nul
16 for /F "Tokens=1* delims=" %%a IN ('type %blafile%') do call :WriteTmp %1 "%%a"
17 IF "%Dirty%"=="TRUE" call :WriteFinal %~n1-%FileCnt%%~x1
18 echo Datei %1 zerlegt in Dateien %~n1-1%~x1 bis %~n1-%FileCnt%%~x1.
19 goto :eof
20 ---------hier Ende der Welt
21 :WriteTmp
22 Set /a cntln=%cntln%+1
23 IF %cntln% GTR 1 (
24 :: echo FILE: %~n1-%FileCnt%%~x1 LN :%cntln% Text: %~2>>%temp%\tmpbla-%FileCnt%.tmp
25 echo %~2>>%temp%\tmpbla-%FileCnt%.tmp
26 SET Dirty=TRUE
27 If %cntln% EQU %MaxLnsPerFile% call :WriteFinal %~n1-%FileCnt%%~x1 )
28 goto :eof
29 ------- ende WriteTmp-Block...zurück zur FOR.. IN.. DO..Schleife
30 :WriteFinal
31 echo %LastLine% >>"%temp%\tmpbla-%FileCnt%.tmp"
32 Copy /b "%temp%\Headline.Txt"+ "%temp%\tmpbla-%FileCnt%.tmp" "%1" >nul
33 (SET Dirty=FALSE) & (set /a cntln=1) & (set /a FileCnt=%FileCnt%+1)
34 goto :eof
35 ::-----snapp Splitbla.bat Vers. 0.2----
-- Anfang Benutzer-Liste vom 13.Frühling--
AAA
AAB......erster
....
...
Babylon Barney
Barney G.
-- Ende Benutzer-Liste vom 13.Frühling--
(Ende Bla.txt)
D:\temp>
>type bla-4.txt
-- Anfang Benutzer-Liste vom 13.Fr³hling--
Au weia
Avignon
Awsome
Axa
Ayayay
Azalee die Rote
Babsi die Blonde
Baby Balla
Babylon Barney
-- Ende Benutzer-Liste vom 13.Fr³hling--
HTH Frank / der Biber aus Bremen
P.S.: >PS: Wie lernt man sowas zu schreiben?
Mögliche Antworten:
a) in Hogwarts?
b) By Doing?
c) in meinem Batch-Workshop?
P.P.S. Natürlich habe ich mir auch eine "DeNumberMe.bat" geschrieben, falls hier oder in einem anderen Forum mal irgendeine Pappnase Sourcecode mit Zeilennummern postet. *lacht*
War Essen (außer Haus) deshalb antworte ich erst jetzt.
Nee Umlaute kommen in meiner *.txt nie vor.
PS: >PS: Wie lernt man sowas zu schreiben?
\a) Harry Potter ^^
\b) Wenn man es kann (learning bei doing)
\c) Muss ich mir mal anschaun.
Nochmal danke bis hierher.
Nee Umlaute kommen in meiner *.txt nie vor.
PS: >PS: Wie lernt man sowas zu schreiben?
Mögliche Antworten:
a) in Hogwarts?
b) By Doing?
c) in meinem Batch-Workshop?
a) in Hogwarts?
b) By Doing?
c) in meinem Batch-Workshop?
\a) Harry Potter ^^
\b) Wenn man es kann (learning bei doing)
\c) Muss ich mir mal anschaun.
Nochmal danke bis hierher.
Hey,
du kannst hier relativ viel über die LogParameter von robocopy steuern, die du einfach im robocopy batchjob mit angibst. (s.u.)
Ich denke das löst das Problem zu 100 Prozent. wenn du mal ne Beispielzeile brauchst, dann sag mir kurz Bescheid, dann poste ich hier mal meinen Code
Grüße
Johannes
/NDL Turns off logging of directory names. Full file pathnames (as
opposed to simple file names) will be shown if /NDL is used.
/NFL Turns off logging of file names. File names are still shown,
however, if file copy errors occur.
/NJH Turns of logging of the job header.
/NJS Turns off logging of the job summary.
/NP Turns off copy progress indicator (% copied).
/ETA Shows estimated time of completion for copied files.
/LOG:file Redirects output to the specified file, overwriting the file if it
already exists.
/LOG+:file Redirects output to the specified file, appending it to the file if it
already exists.
/TEE Displays output in the console window, in addition to directing
it to the log file specified by /LOG or /LOG+.
du kannst hier relativ viel über die LogParameter von robocopy steuern, die du einfach im robocopy batchjob mit angibst. (s.u.)
Ich denke das löst das Problem zu 100 Prozent. wenn du mal ne Beispielzeile brauchst, dann sag mir kurz Bescheid, dann poste ich hier mal meinen Code
Grüße
Johannes
/NDL Turns off logging of directory names. Full file pathnames (as
opposed to simple file names) will be shown if /NDL is used.
/NFL Turns off logging of file names. File names are still shown,
however, if file copy errors occur.
/NJH Turns of logging of the job header.
/NJS Turns off logging of the job summary.
/NP Turns off copy progress indicator (% copied).
/ETA Shows estimated time of completion for copied files.
/LOG:file Redirects output to the specified file, overwriting the file if it
already exists.
/LOG+:file Redirects output to the specified file, appending it to the file if it
already exists.
/TEE Displays output in the console window, in addition to directing
it to the log file specified by /LOG or /LOG+.
Moin Forum,
sorry, dass ich den alten Thread hier rauskrame, aber ich wollte wegen meinem Problemchen keinen neuen aufmachen...
@ Biber
ich hab mir mal das Script rauskopiert und versucht an meine Belange anzupassen.
Ich habe eine Augangsdatei, die aus beliebig vielen Zeilen besteht. Diese Datei soll in Files zu je max. 500 Zeilen gesplittet werden. Ich habe keine Überschriften etc. in der Ausgangsdatei.
Es funktioniert auch so weit ganz gut. Einziges Problem, meine Ursprungsdatei hat z.B. 1300 Zeilen. Diese wird gesplittet in 2 Files zu je 500 Zeilen. Auch noch prima. Nur, die restlichen 300 Zeilen werden einfach ignoriert und nicht in eine Splitdatei geschrieben.
Konkret:
Es werden in die Datei test1.txt die Zeilen 2 bis 500 (Zeile 1 wird nicht übernommen???), plus die letzte Zeile aus der Ursprungsdatei (test.txt) geschrieben.
In die Datei test2.txt werden die Zeilen 501 bis 999 plus die letzte Zeile aus der Ursprungsdatei (test.txt) geschrieben.
Die Zeilen von 1000 bis 1300 (bis auf die letzte Zeile, die ja in beide Files als letzte Zeile übernommen wird???) werden ignoriert.
Hier noch mal das Script:
Wäre echt nett, wenn Du mir da auf die Sprünge helfen könntest...
Gruß
jhe
sorry, dass ich den alten Thread hier rauskrame, aber ich wollte wegen meinem Problemchen keinen neuen aufmachen...
@ Biber
ich hab mir mal das Script rauskopiert und versucht an meine Belange anzupassen.
Ich habe eine Augangsdatei, die aus beliebig vielen Zeilen besteht. Diese Datei soll in Files zu je max. 500 Zeilen gesplittet werden. Ich habe keine Überschriften etc. in der Ausgangsdatei.
Es funktioniert auch so weit ganz gut. Einziges Problem, meine Ursprungsdatei hat z.B. 1300 Zeilen. Diese wird gesplittet in 2 Files zu je 500 Zeilen. Auch noch prima. Nur, die restlichen 300 Zeilen werden einfach ignoriert und nicht in eine Splitdatei geschrieben.
Konkret:
Es werden in die Datei test1.txt die Zeilen 2 bis 500 (Zeile 1 wird nicht übernommen???), plus die letzte Zeile aus der Ursprungsdatei (test.txt) geschrieben.
In die Datei test2.txt werden die Zeilen 501 bis 999 plus die letzte Zeile aus der Ursprungsdatei (test.txt) geschrieben.
Die Zeilen von 1000 bis 1300 (bis auf die letzte Zeile, die ja in beide Files als letzte Zeile übernommen wird???) werden ignoriert.
Hier noch mal das Script:
::-----snipp Splitbla.bat Vers. 0.2----
@echo off
IF (%1)==() (echo Syntax %0 inputfile) & goto :eof
if not exist "%1" echo (Datei %1 nicht gefunden) & goto :eof
setlocal
(set blafile=%1) & (set FirstLine=) & (set LastLine=)
for /f "delims=" %%i in ('type test.txt') do if not defined firstline set firstline=%%i
for /f "delims=" %%i in ('type test.txt') do set lastline=%%i
(set /a cntLn=0 ) && REM Zeilenzähler
(set /a MaxLnsPerFile=500) && REM Max. Zeilen je Splitdatei, eigentlich Konstante
(set /a FileCnt=1 ) && REM Zähler für die Splitdateien
(Set Dirty=TRUE ) && REM DirtyFlag.. muss ich noch eine Datei "endgültig" schreiben?
if exist %temp%\tmpbla*.tmp del /q %temp%\tmpbla-*.tmp >nul
for /F "Tokens=1* delims=" %%a IN ('type %blafile%') do call :WriteTmp %1 "%%a"
IF "%Dirty%"=="TRUE" call :WriteFinal %~n1-%FileCnt%%~x1
echo Datei %1 zerlegt in Dateien %~n1-1%~x1 bis %~n1-%FileCnt%%~x1.
goto :eof
---------hier Ende der Welt
:WriteTmp
Set /a cntln=%cntln%+1
IF %cntln% GTR 1 (
:: echo FILE: %~n1-%FileCnt%%~x1 LN :%cntln% Text: %~2>>%temp%\tmpbla-%FileCnt%.tmp
echo %~2>>%temp%\tmpbla-%FileCnt%.tmp
SET Dirty=TRUE
If %cntln% EQU %MaxLnsPerFile% call :WriteFinal %~n1-%FileCnt%%~x1 )
goto :eof
------- ende WriteTmp-Block...zurück zur FOR.. IN.. DO..Schleife
:WriteFinal
echo %LastLine% >>"%temp%\tmpbla-%FileCnt%.tmp"
Copy /b "%temp%\tmpbla-%FileCnt%.tmp" "%1" >nul
(SET Dirty=FALSE) & (set /a cntln=1) & (set /a FileCnt=%FileCnt%+1)
goto :eof
::-----snapp Splitbla.bat Vers. 0.2----
Wäre echt nett, wenn Du mir da auf die Sprünge helfen könntest...
Gruß
jhe
Moin jhe,
ja, ja.... solche Jugendsünden holen einen immer wieder ein...
Diese 0.2er-Version enthält in der Tat einige Zeilen, die ich heute anders schreiben würde, und eine davon verursacht IMHO auch den Bug.
Im Quelltext, den Du gepostest hast und den ich mir mit copy&paste kopiert habe steht eine Zeile...
Dieser Vergleich geht in die Grütze, weil in der oberen Zeile in Wirklichkeit steht:
Bitte ändere derartige SET-Zeilen gemäß dieser Vorlage:
Und dann starte nochmal.
Grüße
Biber
sorry, dass ich den alten Thread hier rauskrame
ja, ja.... solche Jugendsünden holen einen immer wieder ein...
Diese 0.2er-Version enthält in der Tat einige Zeilen, die ich heute anders schreiben würde, und eine davon verursacht IMHO auch den Bug.
Im Quelltext, den Du gepostest hast und den ich mir mit copy&paste kopiert habe steht eine Zeile...
...
SET Dirty=TRUE
::-... und später:
IF "%dirty%=="TRUE" call:...Whatever
Dieser Vergleich geht in die Grütze, weil in der oberen Zeile in Wirklichkeit steht:
SET Dirty=TRUE{Leerzeichen}{Leerzeichen}
..und der VergleichSet "%Dirty%"=="TRUE{Leerzeichen}{Leerzeichen}"
...natürlich immer abwinkt.Bitte ändere derartige SET-Zeilen gemäß dieser Vorlage:
...
SET "dirty=TRUE"
Und dann starte nochmal.
Grüße
Biber
Hallo Biber,
erst mal vielen Dank, dass Du dich der Sache annimmst....
Also, ich hab jetzt die Zeile geändert. Ergebnis ist, dass jetzt die bisher ignorierten zeilen mitgenommen werden. Das ist ja schon mal Spitze. Nur werden weiterhin leider die erste Zeile aus der Ursprungsdatei ignoriert und die letzte Zeile aus der Ursprungsdatei, jeder neuen Splitdatei hinten angefügt.... Hast du dafür evtl. noch eine Idee?
In Ewigkeit dankbar......
jhe
P.S.:
Hier noch mal mein aktueller Code:
erst mal vielen Dank, dass Du dich der Sache annimmst....
Also, ich hab jetzt die Zeile geändert. Ergebnis ist, dass jetzt die bisher ignorierten zeilen mitgenommen werden. Das ist ja schon mal Spitze. Nur werden weiterhin leider die erste Zeile aus der Ursprungsdatei ignoriert und die letzte Zeile aus der Ursprungsdatei, jeder neuen Splitdatei hinten angefügt.... Hast du dafür evtl. noch eine Idee?
In Ewigkeit dankbar......
jhe
P.S.:
Hier noch mal mein aktueller Code:
::-----snipp Splitbla.bat Vers. 0.2----
@echo off
IF (%1)==() (echo Syntax %0 inputfile) & goto :eof
if not exist "%1" echo (Datei %1 nicht gefunden) & goto :eof
setlocal
(set blafile=%1) & (set FirstLine=) & (set LastLine=)
for /f "delims=" %%i in ('type test.txt') do if not defined firstline set firstline=%%i
for /f "delims=" %%i in ('type test.txt') do set lastline=%%i
(set /a cntLn=0 ) && REM Zeilenzähler
(set /a MaxLnsPerFile=500) && REM Max. Zeilen je Splitdatei, eigentlich Konstante
(set /a FileCnt=1 ) && REM Zähler für die Splitdateien
(Set Dirty=TRUE) && REM DirtyFlag.. muss ich noch eine Datei "endgültig" schreiben?
if exist %temp%\tmpbla*.tmp del /q %temp%\tmpbla-*.tmp >nul
for /F "Tokens=1* delims=" %%a IN ('type %blafile%') do call :WriteTmp %1 "%%a"
IF "%Dirty%"=="TRUE" call :WriteFinal %~n1-%FileCnt%%~x1
echo Datei %1 zerlegt in Dateien %~n1-1%~x1 bis %~n1-%FileCnt%%~x1.
goto :eof
---------hier Ende der Welt
:WriteTmp
Set /a cntln=%cntln%+1
IF %cntln% GTR 1 (
:: echo FILE: %~n1-%FileCnt%%~x1 LN :%cntln% Text: %~2>>%temp%\tmpbla-%FileCnt%.tmp
echo %~2>>%temp%\tmpbla-%FileCnt%.tmp
SET "dirty=TRUE"
If %cntln% EQU %MaxLnsPerFile% call :WriteFinal %~n1-%FileCnt%%~x1 )
goto :eof
------- ende WriteTmp-Block...zurück zur FOR.. IN.. DO..Schleife
:WriteFinal
echo %LastLine% >>"%temp%\tmpbla-%FileCnt%.tmp"
Copy /b "%temp%\tmpbla-%FileCnt%.tmp" "%1" >nul
(SET Dirty=FALSE) & (set /a cntln=1) & (set /a FileCnt=%FileCnt%+1)
goto :eof
::-----snapp Splitbla.bat Vers. 0.2----
Moin jhe,
für die beiden genannten Bugs/Features mit der in allen Teil-Dateien wiederkehrenden Kopf- und Fusszeilen sollten wir nochmal Deine Gegebenheiten mit deren von Oli-nux weiter oben abgleichen.
Oli-nux hatte als Vorlage eine große Datei mit Kopfzeile und Fusszeile und diese sollten in jeder der kleinen Split-Dateien auch am Anfang/am Ende geschrieben werden.
Dafür gab es (s.o.) eine Mimik mit %firstline% und %lastline% und einer Headline.txt-Datei die geschrieben wurde...
Und im WriteFinal-Block sowas:
Diese Zeilen sind jetzt z.T. nicht mehr im Batch -- deshalb bitte erst nochmal kurz Deine Ausgangssituation schildern (GROSSE Datei mit/ohne Kopf/Fusszeile; kleine Dateien mit/ohne..).
Dann wird das schon.
P.S. Und Du brauchst mir wirklich nicht ewig dankbar sein...
... depressiv wie ich bin, hab ich eh' nicht über das Jahr 2155 hinausgeplant....
Grüße
Biber
für die beiden genannten Bugs/Features mit der in allen Teil-Dateien wiederkehrenden Kopf- und Fusszeilen sollten wir nochmal Deine Gegebenheiten mit deren von Oli-nux weiter oben abgleichen.
Oli-nux hatte als Vorlage eine große Datei mit Kopfzeile und Fusszeile und diese sollten in jeder der kleinen Split-Dateien auch am Anfang/am Ende geschrieben werden.
Dafür gab es (s.o.) eine Mimik mit %firstline% und %lastline% und einer Headline.txt-Datei die geschrieben wurde...
Und im WriteFinal-Block sowas:
Copy /b "%temp%\Headline.Txt"+ "%temp%\tmpbla-%FileCnt%.tmp" "%1" >nul
Diese Zeilen sind jetzt z.T. nicht mehr im Batch -- deshalb bitte erst nochmal kurz Deine Ausgangssituation schildern (GROSSE Datei mit/ohne Kopf/Fusszeile; kleine Dateien mit/ohne..).
Dann wird das schon.
P.S. Und Du brauchst mir wirklich nicht ewig dankbar sein...
... depressiv wie ich bin, hab ich eh' nicht über das Jahr 2155 hinausgeplant....
Grüße
Biber
Deine Ausgangssituation schildern (GROSSE
Datei mit/ohne Kopf/Fusszeile; kleine Dateien
mit/ohne..).
Datei mit/ohne Kopf/Fusszeile; kleine Dateien
mit/ohne..).
Die Ausgangsdatei ist ohne Kopf- bzw. Fußzeile, die Splitdateien ebenfalls.
Es sollen lediglich die einzelnen Zeilen in Dateien zu je 500 Zeilen + 1 Datei Rest aufgeteilt werden.
P.S. Und Du brauchst mir wirklich nicht
ewig dankbar sein...
... depressiv wie ich bin, hab ich
eh' nicht über das Jahr 2155
hinausgeplant....
ewig dankbar sein...
... depressiv wie ich bin, hab ich
eh' nicht über das Jahr 2155
hinausgeplant....
HeHe...dann haben wir ja noch ein bissl Zeit, das Problem in den Griff zu bekommen...^^
Gruß
jhe
Moin jhe1960,
die Billig-Version der Splitterei (ohne Kopf- und ohne Fusszeile) sollte dann ungefähr so ausssehen:
[...ungetestet wegen Zeitmangel. So lange dauerts nicht mehr bis 2155.]
Grüße
Biber
die Billig-Version der Splitterei (ohne Kopf- und ohne Fusszeile) sollte dann ungefähr so ausssehen:
::-----snipp Splitbla.bat Vers. 0.3----
@echo off & setlocal
IF (%1)==() (echo Syntax %0 inputfile) & goto :eof
IF not exist "%1" echo (Datei %1 nicht gefunden) & goto :eof
SET "blafile=%1"
(set /a cntLn=0 ) && REM Zeilenzähler
(set /a MaxLnsPerFile=500) && REM Max. Zeilen je Splitdatei, eigentlich Konstante
(set /a FileCnt=1 ) && REM Zähler für die Splitdateien
Set "Dirty=TRUE" && REM DirtyFlag.. muss ich noch eine Datei "endgültig" schreiben?
IF exist %temp%\tmpbla*.tmp del /q %temp%\tmpbla-*.tmp >nul
FOR /F "Tokens=1* delims=" %%a IN ('type %blafile%') do call :WriteTmp %1 "%%a"
IF "%Dirty%"=="TRUE" call :WriteFinal %~n1-%FileCnt%%~x1
echo Datei %1 zerlegt in Dateien %~n1-1%~x1 bis %~n1-%FileCnt%%~x1.
goto :eof
---------hier Ende der Welt
:WriteTmp
Set /a cntln=%cntln%+1
IF %cntln% GEQ 1 (
echo %~2>>%temp%\tmpbla-%FileCnt%.tmp
SET "Dirty=TRUE"
If %cntln% EQU %MaxLnsPerFile% call :WriteFinal %~n1-%FileCnt%%~x1
)
goto :eof
------- ende WriteTmp-Block...zurück zur FOR.. IN.. DO..Schleife
:WriteFinal
Copy /b "%temp%\tmpbla-%FileCnt%.tmp" "%1" >nul
REM Copy /b "%temp%\Headline.Txt"+ "%temp%\tmpbla-%FileCnt%.tmp" "%1" >nul
SET "Dirty=FALSE" & (set /a cntln=1) & (set /a FileCnt=%FileCnt%+1)
goto :eof
::-----snapp Splitbla.bat Vers. 0.3----
Grüße
Biber