Batch ersten 10 Zeilen aus Text-Datei auslesen
Hallo zusammen,
ich habe eine Batch Datei in der etwas in eine text-datei (1) geschrieben wird. Und zwar handelt es sich um ein Spiel in dem man eine zufällige zahl zwischen 1 und 100 raten muss, einem wird dann nach jedem raten gesagt ob die gesuchte Zahl größer oder kleiner ist als die geratene. Am Ende kann man sich in die Bestenliste eintragen. Diese wird in zwei Text-dateien angelegt. In die eine wird jedes Ergebnis zusammen mit dem Namen geschrieben (1) und in die andere (2) wird die Liste sortiert (die wenigsten Versuche oben) Jetzt zu meiner Frage: Und zwar würde ich jetzt noch gerne eine weitre Datei (3) anlegen lassen in die nur die ersten 10 der sortierten Datei (2) angelegt werden.
Ist dies möglich und wenn ja wie (bitte nicht nur den Code schreiben sondern auch was er mach und wie er sich zusammensetzt)
Vielen Dank schon mal für eure Antworten
Hannes
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.
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.
Nachtrag im Jahr 2020:
Bei Windows 10 funktioniert
CMD.EXE /C Eingebauter_Befehl Parameter
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