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
GELÖST

Logfile letzten Zeilen in Txt File mit Batch

Frage Entwicklung Batch & Shell

Mitglied: keksprinz

keksprinz (Level 2) - Jetzt verbinden

26.07.2005, aktualisiert 09.05.2008, 23616 Aufrufe, 21 Kommentare

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
Mitglied: Biber
26.07.2005 um 14:45 Uhr
...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
Bitte warten ..
Mitglied: gemini
26.07.2005 um 14:47 Uhr
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.
Bitte warten ..
Mitglied: Biber
26.07.2005 um 17:22 Uhr
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)

01.
::::::::::::::::::::-------Robologsummary.bat 
02.
@echo off 
03.
::..ggf mit Parameter [logdatei] aufrufen. 
04.
if (%1)==() (set rclog=robocopy.log) else (set rclog=%1) 
05.
find /n "Total    Copied   Skipped  Mismatch    FAILED    Extras" %rclog% >%temp%\rctmp.txt 
06.
for /F "delims=[] skip=2 tokens=1" %%a in ( %temp%\rctmp.txt) do Set /a rcZeile=%%a - 1 
07.
more +%rcZeile% %rclog% 
08.
:: und den more-Output ggf in eine neue Datei mit  
09.
::.... echo Robocopy-Summary vom %date%: >>neueDatei 
10.
::.... more +%rcZeile% %rclog%         >>neueDatei 
11.
::::::::::::::::::---------- EndeRobologsummary.bat
Hope That Helps

Frank /der Biber aus Bremen

P.S. Würde ich auch als Einzeiler hinbekommen, aber das erspar ich uns
Bitte warten ..
Mitglied: keksprinz
03.08.2005 um 10:55 Uhr
Viel Dank für deine antwort,
es funktioniert super
Bitte warten ..
Mitglied: Biber
03.08.2005 um 11:01 Uhr
Freut mich und ebenfalls danke für die Rückmeldung.
Bitte warten ..
Mitglied: Oli-nux
17.08.2005 um 22:01 Uhr
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.
Bitte warten ..
Mitglied: Biber
18.08.2005 um 00:36 Uhr
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"
01.
Benutzer 
02.
AAA  
03.
AAB......erster  
04.
Aachen....zweiter FILE: bla-5.txt LN :2 Text:  
05.
Adele FILE: bla-5.txt LN :3 Text:  
06.
Aerosmith  
07.
Afk,  
08.
Agnes  
09.
Ahnungslos  
10.
Aida 
11.
Ajax  
12.
Akazia  
13.
Alter 	Schwede 
14.
Am  
15.
AMMO+  
16.
AMMOMEGAPACK++  
17.
AMMOSUPERMEGAMEGAPACK  
18.
Anna  
19.
Antje  
20.
Anus  
21.
Aorta  
22.
April  
23.
Aqua  
24.
Aries  
25.
As is it is et jut 
26.
Astoria  die Berlinerin 
27.
Astrid die Schwäbin 
28.
Attention  
29.
Au weia 
30.
Avignon  
31.
Awsome  
32.
Axa  
33.
Ayayay  
34.
Azalee 	die Rote 
35.
Babsi die Blonde 
36.
Baby Balla  
37.
Babylon Barney  
38.
Barney G. 
39.
----ende bla.txt ...beginn erzeugte bla-1.txt 
40.
Benutzer 
41.
FILE: bla-1.txt LN :2 Text: AAA  
42.
FILE: bla-1.txt LN :3 Text: AAB......erster  
43.
FILE: bla-1.txt LN :4 Text: Aachen....zweiter FILE: bla-5.txt LN :2 Text:  
44.
FILE: bla-1.txt LN :5 Text: Adele FILE: bla-5.txt LN :3 Text:  
45.
FILE: bla-1.txt LN :6 Text: Aerosmith  
46.
FILE: bla-1.txt LN :7 Text: Afk,  
47.
FILE: bla-1.txt LN :8 Text: Agnes  
48.
FILE: bla-1.txt LN :9 Text: Ahnungslos  
49.
FILE: bla-1.txt LN :10 Text: Aida 
50.
 
51.
---- beginn erzeugte bla-2.txt 
52.
Benutzer 
53.
FILE: bla-2.txt LN :2 Text: Ajax  
54.
FILE: bla-2.txt LN :3 Text: Akazia  
55.
FILE: bla-2.txt LN :4 Text: Alter 	Schwede 
56.
FILE: bla-2.txt LN :5 Text: Am  
57.
FILE: bla-2.txt LN :6 Text: AMMO+  
58.
FILE: bla-2.txt LN :7 Text: AMMOMEGAPACK++  
59.
FILE: bla-2.txt LN :8 Text: AMMOSUPERMEGAMEGAPACK  
60.
FILE: bla-2.txt LN :9 Text: Anna  
61.
FILE: bla-2.txt LN :10 Text: Antje  
62.
---- beginn erzeugte bla-3.txt 
63.
Benutzer 
64.
FILE: bla-3.txt LN :2 Text: Anus  
65.
FILE: bla-3.txt LN :3 Text: Aorta  
66.
FILE: bla-3.txt LN :4 Text: April  
67.
FILE: bla-3.txt LN :5 Text: Aqua  
68.
FILE: bla-3.txt LN :6 Text: Aries  
69.
FILE: bla-3.txt LN :7 Text: As is it is et jut 
70.
FILE: bla-3.txt LN :8 Text: Astoria  die Berlinerin 
71.
FILE: bla-3.txt LN :9 Text: Astrid die Schwäbin 
72.
FILE: bla-3.txt LN :10 Text: Attention  
73.
----beginn erzeugte bla-4.txt 
74.
Benutzer 
75.
FILE: bla-4.txt LN :2 Text: Au weia 
76.
FILE: bla-4.txt LN :3 Text: Avignon  
77.
FILE: bla-4.txt LN :4 Text: Awsome  
78.
FILE: bla-4.txt LN :5 Text: Axa  
79.
FILE: bla-4.txt LN :6 Text: Ayayay  
80.
FILE: bla-4.txt LN :7 Text: Azalee 	die Rote 
81.
FILE: bla-4.txt LN :8 Text: Babsi die Blonde 
82.
FILE: bla-4.txt LN :9 Text: Baby Balla  
83.
FILE: bla-4.txt LN :10 Text: Babylon Barney  
84.
-------- beginn erzeugte bla-5.txt 
85.
Benutzer 
86.
FILE: bla-5.txt LN :2 Text: Barney G.
Und das ist die splitbla.txt mit all ihren vielen Zeilen..*gg
01.
@echo off 
02.
IF (%1)==() (echo Syntax %0 inputfile) & goto :eof 
03.
if not exist "%1" echo (Datei %1 nicht gefunden) & goto :eof  
04.
setlocal 
05.
set blafile=%1 
06.
type %blafile% |find /i "Benutzer" >%temp%\Headline.Txt 
07.
(set /a cntLn=0 ) && REM Zeilenzähler 
08.
(set /a MaxLnsPerFile=10) && REM Max. Zeilen je Splitdatei, eigentlich Konstante  
09.
(set /a FileCnt=1 ) && REM Zähler für die Splitdateien 
10.
(Set Dirty=TRUE ) && REM DirtyFlag.. muss ich noch eine Datei "endgültig" schreiben? 
11.
if exist %temp%\tmpbla*.tmp del /q %temp%\tmpbla-*.tmp >nul 
12.
for /F "Tokens=1* delims=" %%a IN ('type %blafile%') do call :WriteTmp %1 "%%a"  
13.
IF "%Dirty%"=="TRUE" call :WriteFinal %~n1-%FileCnt%%~x1 
14.
goto :eof 
15.
---------hier Ende der Welt 
16.
:WriteTmp 
17.
Set /a cntln=%cntln%+1 
18.
IF  %cntln% GTR 1 (      
19.
     echo FILE: %~n1-%FileCnt%%~x1 LN :%cntln% Text: %~2>>%temp%\tmpbla-%FileCnt%.tmp 
20.
     SET Dirty=TRUE 
21.
     If %cntln% EQU %MaxLnsPerFile% call :WriteFinal %~n1-%FileCnt%%~x1  ) 
22.
goto :eof 
23.
 ------- ende WriteTmp-Block...zurück zur FOR.. IN.. DO..Schleife 
24.
:WriteFinal 
25.
Copy /b "%temp%\Headline.Txt"+ "%temp%\tmpbla-%FileCnt%.tmp" "%1" >nul 
26.
(SET Dirty=FALSE) & (set /a cntln=1) & (set /a FileCnt=%FileCnt%+1) 
27.
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
Bitte warten ..
Mitglied: Oli-nux
18.08.2005 um 12:03 Uhr
@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.
Bitte warten ..
Mitglied: Biber
18.08.2005 um 16:05 Uhr
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
Bitte warten ..
Mitglied: Oli-nux
18.08.2005 um 16:30 Uhr
>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.

>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 hab das nochmal überprüft.
\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.
>>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.
\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?
Bitte warten ..
Mitglied: Biber
18.08.2005 um 19:30 Uhr
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.
01 ::-----snipp Splitbla.bat Vers. 0.2----   
02.
02 @echo off    
03.
03 IF (%1)==() (echo Syntax %0 inputfile) & goto :eof    
04.
04 if not exist "%1" echo (Datei %1 nicht gefunden) & goto :eof    
05.
05 setlocal    
06.
06 (set blafile=%1) & (set FirstLine=) & (set LastLine=)   
07.
07 for /f "delims=" %%i in ('type bla.txt') do if not defined firstline set firstline=%%i   
08.
08 for /f "delims=" %%i in ('type bla.txt') do set lastline=%%i   
09.
09 echo %firstline% >%temp%\Headline.Txt   
10.
10 :: type %blafile% |find /i "Benutzer" >%temp%\Headline.Txt    
11.
11 (set /a cntLn=0 ) && REM Zeilenzähler    
12.
12 (set /a MaxLnsPerFile=10)     && REM Max. Zeilen je Splitdatei, eigentlich Konstante    
13.
13 (set /a FileCnt=1 )           && REM Zähler für die Splitdateien    
14.
14 (Set Dirty=TRUE )             && REM DirtyFlag.. muss ich noch eine Datei "endgültig" schreiben?    
15.
15 if exist %temp%\tmpbla*.tmp del /q %temp%\tmpbla-*.tmp >nul    
16.
16 for /F "Tokens=1* delims=" %%a IN ('type %blafile%') do call :WriteTmp %1 "%%a"    
17.
17 IF "%Dirty%"=="TRUE" call :WriteFinal %~n1-%FileCnt%%~x1    
18.
18 echo Datei %1 zerlegt in Dateien %~n1-1%~x1 bis %~n1-%FileCnt%%~x1.   
19.
19 goto :eof    
20.
20 ---------hier Ende der Welt    
21.
21 :WriteTmp    
22.
22 Set /a cntln=%cntln%+1    
23.
23 IF %cntln% GTR 1 (    
24.
24 :: echo FILE: %~n1-%FileCnt%%~x1 LN :%cntln% Text: %~2>>%temp%\tmpbla-%FileCnt%.tmp    
25.
25 echo %~2>>%temp%\tmpbla-%FileCnt%.tmp    
26.
26 SET Dirty=TRUE    
27.
27 If %cntln% EQU %MaxLnsPerFile% call :WriteFinal %~n1-%FileCnt%%~x1 )    
28.
28 goto :eof    
29.
29 ------- ende WriteTmp-Block...zurück zur FOR.. IN.. DO..Schleife    
30.
30 :WriteFinal    
31.
31 echo %LastLine% >>"%temp%\tmpbla-%FileCnt%.tmp"   
32.
32 Copy /b "%temp%\Headline.Txt"+ "%temp%\tmpbla-%FileCnt%.tmp" "%1" >nul    
33.
33 (SET Dirty=FALSE) & (set /a cntln=1) & (set /a FileCnt=%FileCnt%+1)    
34.
34 goto :eof   
35.
35 ::-----snapp Splitbla.bat Vers. 0.2---- 
Meine "Bla.txt" hab ich so verändert:
01.
-- Anfang Benutzer-Liste vom 13.Frühling-- 
02.
AAA  
03.
AAB......erster  
04.
.... 
05.
... 
06.
Babylon Barney  
07.
Barney G. 
08.
-- Ende Benutzer-Liste vom 13.Frühling-- 
09.
(Ende Bla.txt)
Output z.B. von Bla-4.txt:
01.
D:\temp> 
02.
>type bla-4.txt 
03.
-- Anfang Benutzer-Liste vom 13.Fr³hling-- 
04.
Au weia 
05.
Avignon 
06.
Awsome 
07.
Axa 
08.
Ayayay 
09.
Azalee  die Rote 
10.
Babsi die Blonde 
11.
Baby Balla 
12.
Babylon Barney 
13.
-- 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?
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*
Bitte warten ..
Mitglied: Oli-nux
18.08.2005 um 21:58 Uhr
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?
>>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.

Nochmal danke bis hierher.
Bitte warten ..
Mitglied: 57214
19.11.2007 um 23:25 Uhr
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+.
Bitte warten ..
Mitglied: jhe1960
09.05.2008 um 11:10 Uhr
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:

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 test.txt') do if not defined firstline set firstline=%%i   
08.
for /f "delims=" %%i in ('type test.txt') do set lastline=%%i 
09.
(set /a cntLn=0 ) && REM Zeilenzähler    
10.
(set /a MaxLnsPerFile=500)     && REM Max. Zeilen je Splitdatei, eigentlich Konstante    
11.
(set /a FileCnt=1 )           && REM Zähler für die Splitdateien    
12.
(Set Dirty=TRUE )             && REM DirtyFlag.. muss ich noch eine Datei "endgültig" schreiben?    
13.
if exist %temp%\tmpbla*.tmp del /q %temp%\tmpbla-*.tmp >nul    
14.
for /F "Tokens=1* delims=" %%a IN ('type %blafile%') do call :WriteTmp %1 "%%a"    
15.
IF "%Dirty%"=="TRUE" call :WriteFinal %~n1-%FileCnt%%~x1    
16.
echo Datei %1 zerlegt in Dateien %~n1-1%~x1 bis %~n1-%FileCnt%%~x1.   
17.
goto :eof 
18.
---------hier Ende der Welt    
19.
:WriteTmp    
20.
Set /a cntln=%cntln%+1    
21.
IF %cntln% GTR 1 (    
22.
:: echo FILE: %~n1-%FileCnt%%~x1 LN :%cntln% Text: %~2>>%temp%\tmpbla-%FileCnt%.tmp    
23.
echo %~2>>%temp%\tmpbla-%FileCnt%.tmp    
24.
SET Dirty=TRUE    
25.
If %cntln% EQU %MaxLnsPerFile% call :WriteFinal %~n1-%FileCnt%%~x1 )    
26.
goto :eof    
27.
------- ende WriteTmp-Block...zurück zur FOR.. IN.. DO..Schleife    
28.
:WriteFinal    
29.
echo %LastLine% >>"%temp%\tmpbla-%FileCnt%.tmp"   
30.
Copy /b "%temp%\tmpbla-%FileCnt%.tmp" "%1" >nul    
31.
(SET Dirty=FALSE) & (set /a cntln=1) & (set /a FileCnt=%FileCnt%+1)    
32.
goto :eof   
33.
::-----snapp Splitbla.bat Vers. 0.2---- 
Wäre echt nett, wenn Du mir da auf die Sprünge helfen könntest...

Gruß

jhe
Bitte warten ..
Mitglied: Biber
09.05.2008 um 11:40 Uhr
Moin jhe,
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...
01.
... 
02.
SET Dirty=TRUE    
03.
 
04.
::-... und später: 
05.
 
06.
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:
01.
... 
02.
SET "dirty=TRUE"
Und dann starte nochmal.

Grüße
Biber
Bitte warten ..
Mitglied: jhe1960
09.05.2008 um 13:17 Uhr
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:

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 test.txt') do if not defined firstline set firstline=%%i   
08.
for /f "delims=" %%i in ('type test.txt') do set lastline=%%i 
09.
(set /a cntLn=0 ) && REM Zeilenzähler    
10.
(set /a MaxLnsPerFile=500)     && REM Max. Zeilen je Splitdatei, eigentlich Konstante    
11.
(set /a FileCnt=1 )           && REM Zähler für die Splitdateien    
12.
(Set Dirty=TRUE)  && REM DirtyFlag.. muss ich noch eine Datei "endgültig" schreiben?    
13.
if exist %temp%\tmpbla*.tmp del /q %temp%\tmpbla-*.tmp >nul    
14.
for /F "Tokens=1* delims=" %%a IN ('type %blafile%') do call :WriteTmp %1 "%%a"    
15.
IF "%Dirty%"=="TRUE" call :WriteFinal %~n1-%FileCnt%%~x1   
16.
echo Datei %1 zerlegt in Dateien %~n1-1%~x1 bis %~n1-%FileCnt%%~x1.   
17.
goto :eof 
18.
---------hier Ende der Welt    
19.
:WriteTmp    
20.
Set /a cntln=%cntln%+1    
21.
IF %cntln% GTR 1 (    
22.
:: echo FILE: %~n1-%FileCnt%%~x1 LN :%cntln% Text: %~2>>%temp%\tmpbla-%FileCnt%.tmp    
23.
echo %~2>>%temp%\tmpbla-%FileCnt%.tmp    
24.
SET "dirty=TRUE" 
25.
If %cntln% EQU %MaxLnsPerFile% call :WriteFinal %~n1-%FileCnt%%~x1 )    
26.
goto :eof    
27.
------- ende WriteTmp-Block...zurück zur FOR.. IN.. DO..Schleife    
28.
:WriteFinal    
29.
echo %LastLine% >>"%temp%\tmpbla-%FileCnt%.tmp"   
30.
Copy /b "%temp%\tmpbla-%FileCnt%.tmp" "%1" >nul    
31.
(SET Dirty=FALSE) & (set /a cntln=1) & (set /a FileCnt=%FileCnt%+1)    
32.
goto :eof   
33.
::-----snapp Splitbla.bat Vers. 0.2---- 
Bitte warten ..
Mitglied: Biber
09.05.2008 um 14:35 Uhr
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
Bitte warten ..
Mitglied: jhe1960
09.05.2008 um 15:40 Uhr
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
Bitte warten ..
Mitglied: Biber
09.05.2008 um 16:41 Uhr
Moin jhe1960,

die Billig-Version der Splitterei (ohne Kopf- und ohne Fusszeile) sollte dann ungefähr so ausssehen:
01.
::-----snipp Splitbla.bat Vers. 0.3----   
02.
@echo off & setlocal    
03.
IF (%1)==() (echo Syntax %0 inputfile) & goto :eof    
04.
IF not exist "%1" echo (Datei %1 nicht gefunden) & goto :eof    
05.
    
06.
SET "blafile=%1"  
07.
(set /a cntLn=0 )             && REM Zeilenzähler    
08.
(set /a MaxLnsPerFile=500)    && REM Max. Zeilen je Splitdatei, eigentlich Konstante    
09.
(set /a FileCnt=1 )           && REM Zähler für die Splitdateien    
10.
Set "Dirty=TRUE"              && REM DirtyFlag.. muss ich noch eine Datei "endgültig" schreiben?    
11.
IF exist %temp%\tmpbla*.tmp del /q %temp%\tmpbla-*.tmp >nul    
12.
FOR /F "Tokens=1* delims=" %%a IN ('type %blafile%') do call :WriteTmp %1 "%%a"    
13.
IF "%Dirty%"=="TRUE" call :WriteFinal %~n1-%FileCnt%%~x1 
14.
echo Datei %1 zerlegt in Dateien %~n1-1%~x1 bis %~n1-%FileCnt%%~x1.   
15.
goto :eof 
16.
---------hier Ende der Welt    
17.
:WriteTmp    
18.
Set /a cntln=%cntln%+1    
19.
IF %cntln% GEQ 1 (    
20.
   echo %~2>>%temp%\tmpbla-%FileCnt%.tmp    
21.
   SET "Dirty=TRUE"    
22.
   If %cntln% EQU %MaxLnsPerFile% call :WriteFinal %~n1-%FileCnt%%~x1  
23.
24.
goto :eof    
25.
------- ende WriteTmp-Block...zurück zur FOR.. IN.. DO..Schleife    
26.
:WriteFinal    
27.
Copy /b "%temp%\tmpbla-%FileCnt%.tmp" "%1" >nul    
28.
REM Copy /b "%temp%\Headline.Txt"+ "%temp%\tmpbla-%FileCnt%.tmp" "%1" >nul   
29.
SET "Dirty=FALSE" & (set /a cntln=1) & (set /a FileCnt=%FileCnt%+1)    
30.
goto :eof   
31.
::-----snapp Splitbla.bat Vers. 0.3---- 
[...ungetestet wegen Zeitmangel. So lange dauerts nicht mehr bis 2155.]

Grüße
Biber
Bitte warten ..
Mitglied: jhe1960
09.05.2008 um 17:28 Uhr
YippppiiieeeeeeeeeeeeeeeeeeeeeeyYeahhhhhhhhhhhhhhhhhhh....^^

Es funktioniert!

Vielen Dank!!!

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

Gruß

jhe
Bitte warten ..
Mitglied: Biber
09.05.2008 um 20:05 Uhr
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
Bitte warten ..
Neuester Wissensbeitrag
Internet

Unbemerkt - Telekom Netzumschaltung! - BNG - Broadband Network Gateway

(3)

Erfahrungsbericht von ashnod zum Thema Internet ...

Heiß diskutierte Inhalte
Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...

Grafikkarten & Monitore
Tonprobleme bei Fernseher mit angeschlossenem Laptop über HDMI (11)

Frage von Y3shix zum Thema Grafikkarten & Monitore ...

Microsoft Office
Keine Updates für Office 2016 (11)

Frage von Motte990 zum Thema Microsoft Office ...