keksprinz
Goto Top

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

Content-ID: 13620

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

Ausgedruckt am: 16.11.2024 um 03:11 Uhr

Biber
Biber 26.07.2005 um 14:45:35 Uhr
Goto Top
...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
gemini
gemini 26.07.2005 um 14:47:59 Uhr
Goto Top
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 face-wink
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.
Biber
Biber 26.07.2005 um 17:22:23 Uhr
Goto Top
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)

::::::::::::::::::::-------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
Hope That Helps

Frank /der Biber aus Bremen

P.S. Würde ich auch als Einzeiler hinbekommen, aber das erspar ich uns face-wink
keksprinz
keksprinz 03.08.2005 um 10:55:52 Uhr
Goto Top
Viel Dank für deine antwort,
es funktioniert super face-smile
Biber
Biber 03.08.2005 um 11:01:32 Uhr
Goto Top
Freut mich und ebenfalls danke für die Rückmeldung. face-wink
Oli-nux
Oli-nux 17.08.2005 um 22:01:14 Uhr
Goto Top
Ich könnte so ne Batch-Datei auch brauchen. face-smile
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). face-wink
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. face-smile
Ich hoffe mir kann da jemand was vernünftiges schreiben.face-wink
Biber
Biber 18.08.2005 um 00:36:27 Uhr
Goto Top
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"
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.
Und das ist die splitbla.txt mit all ihren vielen Zeilen..*gg
@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
Oli-nux
Oli-nux 18.08.2005 um 12:03:51 Uhr
Goto Top
@Biber
Ich glaube du hast schon richtig verstanden was ich wollte. face-smile
Das Script funktioniert prima. face-smile
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. face-smile
Sonst muss ich pro Text-File ja noch mit dem "Ersetzen" arbeiten. face-wink
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. face-wink
Alles andere ist schon ganz richtig so. face-big-smile
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. face-wink
Biber
Biber 18.08.2005 um 16:05:45 Uhr
Goto Top
Okay, Oli-Nux,
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:
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
Oli-nux
Oli-nux 18.08.2005 um 16:30:30 Uhr
Goto Top
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:
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. face-smile

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?
\Ne, ich glaub das passt schon face-wink hab das nochmal überprüft. face-smile
\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. face-smile

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?
\In der Letzten Zeile steht z.b. "Benuter-Ende" und das soll auch übernommen werden. face-wink
\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. face-smile

PS: Wie lernt man sowas zu schreiben?
Biber
Biber 18.08.2005 um 19:30:14 Uhr
Goto Top
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)
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---- 
Meine "Bla.txt" hab ich so verändert:
-- Anfang Benutzer-Liste vom 13.Frühling--
AAA 
AAB......erster 
....
...
Babylon Barney 
Barney G.
-- Ende Benutzer-Liste vom 13.Frühling--
(Ende Bla.txt)
Output z.B. von Bla-4.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--
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? face-wink
b) By Doing? face-wink face-wink
c) in meinem Batch-Workshop? face-big-smile

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*
Oli-nux
Oli-nux 18.08.2005 um 21:58:17 Uhr
Goto Top
War Essen (außer Haus) deshalb antworte ich erst jetzt. face-wink
Nee Umlaute kommen in meiner *.txt nie vor. face-big-smile

PS: >PS: Wie lernt man sowas zu schreiben?
Mögliche Antworten:
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. face-smile

Nochmal danke bis hierher. face-smile
57214
57214 19.11.2007 um 23:25:30 Uhr
Goto Top
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+.
jhe1960
jhe1960 09.05.2008 um 11:10:02 Uhr
Goto Top
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:

::-----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
Biber
Biber 09.05.2008 um 11:40:40 Uhr
Goto Top
Moin jhe,
sorry, dass ich den alten Thread hier rauskrame

ja, ja.... solche Jugendsünden holen einen immer wieder ein... face-wink

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 Vergleich
Set "%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
jhe1960
jhe1960 09.05.2008 um 13:17:43 Uhr
Goto Top
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...... face-wink

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---- 
Biber
Biber 09.05.2008 um 14:35:23 Uhr
Goto Top
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:
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
jhe1960
jhe1960 09.05.2008 um 15:40:05 Uhr
Goto Top
Deine Ausgangssituation schildern (GROSSE
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....


HeHe...dann haben wir ja noch ein bissl Zeit, das Problem in den Griff zu bekommen...^^

Gruß

jhe
Biber
Biber 09.05.2008 um 16:41:51 Uhr
Goto Top
Moin jhe1960,

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---- 
[...ungetestet wegen Zeitmangel. So lange dauerts nicht mehr bis 2155.]

Grüße
Biber
jhe1960
jhe1960 09.05.2008 um 17:28:18 Uhr
Goto Top
YippppiiieeeeeeeeeeeeeeeeeeeeeeyYeahhhhhhhhhhhhhhhhhhh....^^

Es funktioniert!

Vielen Dank!!!

Und lass es dir bis 2155 nicht zu lange werden... xD

Gruß

jhe
Biber
Biber 09.05.2008 um 20:05:44 Uhr
Goto Top
Na gut, jhe,

dann mach ich den Beitrag jetzt aber dicht, bevor da nochmal einer drüber stolpert..
Und lass es dir bis 2155 nicht zu lange werden
Na ja, allein um meine Überstunden abzubummeln brauche ich bis 2163, hab ich grad ausgerechnet...

Vrohe Vinxten
Biber