Batch ersten 10 Zeilen aus Text-Datei auslesen

2 Antworten

Leider krieg ich das nicht mit einer einzigen Batch-Datei hin, da

CMD.EXE /C Befehl Parameter

sich nur aufrufen lässt, wenn Befehl eine Datei ist, nicht wenn Befehl ein eingebauter Befehl ist.

Ich nenne die auszulesende Datei hier Scorelist.txt und die Zieldatei TopTen.txt

Erste Datei: TopTen.bat

%COMSPEC% /V:ON /E:ON /C TopTen2.bat

Zweite Datei: TopTen2.bat

IF EXIST TopTen.txt DEL TopTen.txt
SET zaehler=0
FOR /F "tokens=* delims=" %%A IN (Scorelist.txt) DO ( ( SET /A zaehler=zaehler+1 ) & ( IF !zaehler! GTR 10 EXIT /B ) & ( ECHO.%%A > TopTen.txt ) )

-----

Erklärung von TopTen.bat:

%COMSPEC% ruft immer den aktuellen Befehlsinterpreter (normalerweise CMD.EXE) auf, egal, wie er heißt und wo er sich befindet.

/V:ON schaltet die verzögerte Erweiterung von Variablen ein. Das ist nötig, um !zaehler! statt %zaehler% verwenden zu können. %zaehler% wird vor Ausführen der kompletten Zeile durch den dann aktuellen Wert von zaehler ersetzt, was immer 0 ist. !zaehler! wird erst ausgewertet, wenn es tatsächlich gebraucht wird, dadurch wird es möglich, in der einen Zeile !zaehler! mit verschiedenen Werten zu verwenden.

/E:ON schaltet die Befehlserweiterungen ein. Dadurch wird FOR /F möglich, was eine Datei zeilenweise auslesen kann.

/C ruft einen Befehl auf und beendet danach den neu gestarteten Befehlsinterpreter.

(Das ist nötig, da FOR ein eingebauter Befehl ist und CMD.EXE die nicht mit CMD.EXE /C ausführen kann; dafür ist eine ausführbare Datei nötig und TopTen2.bat ist ja eine ausführbare Datei.

-----

Erklärung von TopTen2.bat:

In der ersten Zeile wird die Datei TopTen.txt gelöscht, falls sie existiert. Das ist nötig, da hier nur ein Befehl zum Anhängen an eine Datei verwendet wird (ECHO ... >> Zieldatei mit 2 >-Zeichen).

Die zweite Zeile initialisiert die Variable zaehler.

Bis hierher noch nichts außergewöhnliches. Dafür wird es jetzt etwas komplizierter als sonst.

FOR /F bearbeitet wie schon gesagt einzelne Zeilen von Dateien und nicht die Dateien selber.

Zwischen den folgenden Anführungszeichen stehen die Optionen für FOR /F. tokens=* besagt, dass die gesamte Zeile in die Variable genommen werden soll, delims= direkt vor den schließenden Anführungszeichen sagt, dass keine Worttrenner verwendet werden sollen, d. h. die gesamte Zeile soll als ein einziges Wort gesehen werden (sonst würde in %%A das erste Wort, in %%B das zweite Wort etc. stehen).

%%A legt den Namen der durchlaufenen Variablen auf A fest. (In Batch-Dateien sind 2 Prozentzeichen nötig, bei Direkteingabe eines FOR-Befehls nur eins.)

IN (Dateiname(n)) gibt die auszuwertende(n) Datei(en) an. Hier nur Scorelist.txt. (Man kann aber auch mehrere Dateien durch Semikola trennen und/oder Wildcards - ? und * - verwenden.)

DO heißt, dass jetzt der Befehl folgt, der für jedes Element der Gruppe - hier die Zeilen aus der Datei Scorelist.txt - ausgeführt werden soll.

Die Klammern gruppieren die einzelnen Befehle.

Die &-Zeichen trennen einzelne Befehle auf einer Zeile - die Befehle werden nacheinander ausgeführt.

SET /A verwendet Arithmetik, um eine Variable zu setzen. Dadurch sind Rechenausdrücke möglich - hier zähler+1. SET /A erwartet alle Variablennamen ohne darumgestellte Prozentzeichen.

IF !zaehler! GTR 10 fragt ab, ob der aktuelle Wert von zaehler (dafür die !-Zeichen) größer (GreaTeR) als 10 ist. Das ist bei den ersten 10 Zeilen nicht der Fall, sondern erst ab / bei der 11.

EXIT /B beendet die gerade laufende Batch-Datei.

ECHO.Ausdruck (mit dem Punkt direkt am ECHO und ohne Leerzeichen vor dem Ausdruck) gibt Ausdruck aus, und zwar auch dann, wenn Ausdruck leer ist. (Sonst tut ECHO etwas anderes.)

>> Dateiname leitet die Ausgabe des vorangehenden Befehls in die Datei Dateiname um, anstatt sie auf der Textkonsole anzuzeigen. > würde den Inhalt der Datei überschreiben, >> hängt an die Datei an.

Lachsack305 
Fragesteller
 30.05.2015, 19:41

ok ich habe mir alles durchgelesen und habe es befolgt.

Ich dachte, dass eine neue text-Datei angelegt wird und in diese die ersten 10 Zeilen geschrieben werden.

Könntest du mir nochmal sagen welche Datei ich vorher selber anlegen muss.

Gruß Hannes

0
PWolff  30.05.2015, 19:46
@Lachsack305

Scorelist.txt musst du vorher füllen - die 10 zu kopierenden Zeile als oberste.

TopTen.txt wird von der Batch-Datei angelegt.

Aber wenn du so etwas fragen musst, solltest du vielleicht erst mehr Erfahrung entweder mit Programmierung im allgemeinen oder mit Shellskripten sammeln, bevor du so etwas einsetzt.

Die Batch-Programmierung bei Windows ist bei weitem nicht so leistungsfähig wie die unter unixoiden Systemen. Die PowerShell dürfte so was wesentlich einfacher können, erfordert aber eine komplett eigene Einarbeitung.

0
PWolff  30.05.2015, 20:43
@PWolff

(Und die Dateinamen kannst du natürlich frei wählen, auch die für die Batch-Dateien selbst. Du musst nur die Namen in den Batch-Dateien austauschen. Und natürlich Anführungszeichen darum setzen, wenn darin Leerzeichen vorkommen.)

0

Nachtrag im Jahr 2020:

Bei Windows 10 funktioniert

CMD.EXE /C Eingebauter_Befehl Parameter