Batchdatei soll immer nur die neuste zeile aus einer .txt auslesen und anzeigen
Hallo,
vorab wollte ich nur kurz erwähnen, dass ich relativ unerfahren bin und mich bei allen helfenden oder verbessernden Beitragsverfassern bedanken möchte =)
Nun zu meinem Problem:
Ich versuche ein Chat zu entwickeln,welcher aus 3 Teilen besteht:
-1 und 2, sind die beiden Eingabefenster :
@echo off
set /p username=Username:
echo Type "username" to choose a new username.
echo.
:A
set /p Eingabe=Eingabe (%username%) :
if "%Eingabe%"=="username" Goto B
echo %username%: %Eingabe% >> hi.txt
goto A
-die aus 1 & 2 verfassten und in die textdatei umgeleiteten Kommentare sollen im Fenster 3 aufgelistet werden, und dort liegt mein Problem. Der Text sieht so aus:
@echo off
cls
echo. > hi.txt
:A
cls
more hi.txt
ping localhost -n 2 > nul
goto A
allerdings geht er die schleife immer wieder ab und ruft den Text aus der .txt immer wieder auf, was zum Flackern fürht.
Ich würde gerne wissen, wie man Fenster 3 programmiert, dass es nur die neuste zeile der .txt ausliest und dem Fenster 3 unten anfügt.
Herzlichen Dank
Fear
vorab wollte ich nur kurz erwähnen, dass ich relativ unerfahren bin und mich bei allen helfenden oder verbessernden Beitragsverfassern bedanken möchte =)
Nun zu meinem Problem:
Ich versuche ein Chat zu entwickeln,welcher aus 3 Teilen besteht:
-1 und 2, sind die beiden Eingabefenster :
@echo off
set /p username=Username:
echo Type "username" to choose a new username.
echo.
:A
set /p Eingabe=Eingabe (%username%) :
if "%Eingabe%"=="username" Goto B
echo %username%: %Eingabe% >> hi.txt
goto A
-die aus 1 & 2 verfassten und in die textdatei umgeleiteten Kommentare sollen im Fenster 3 aufgelistet werden, und dort liegt mein Problem. Der Text sieht so aus:
@echo off
cls
echo. > hi.txt
:A
cls
more hi.txt
ping localhost -n 2 > nul
goto A
allerdings geht er die schleife immer wieder ab und ruft den Text aus der .txt immer wieder auf, was zum Flackern fürht.
Ich würde gerne wissen, wie man Fenster 3 programmiert, dass es nur die neuste zeile der .txt ausliest und dem Fenster 3 unten anfügt.
Herzlichen Dank
Fear
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 99229
Url: https://administrator.de/forum/batchdatei-soll-immer-nur-die-neuste-zeile-aus-einer-txt-auslesen-und-anzeigen-99229.html
Ausgedruckt am: 22.05.2025 um 20:05 Uhr
11 Kommentare
Neuester Kommentar
Die Letzte Zeile bekommst Du hinindem du it einer For-Schleife jede Zeile einliest udn in der gleichen Variabeln immer wieder speicherst. Dannach stehtin dieser Variabeln die letzte Zeile:
Du solltest allerdinge vorher immer noch abfragen ob die Datei sich überhaubt verändert hat, sonst würde ja imemr wieder die letzte zeile ausgegeben werden, auch wen keiner was schreibt. Also wäre es noch sinvoll z.B. das letzte-Änderungs-Datum der Datei zu merken und zu kontrollieren oder mit dem Archivbit oder einer Flagdatei zu arbeiten.
FOR /F "delims=" %%i in (hi.txt) do set zeile=%%i
echo %zeile%
Ja das war auch nur das eigentliche Auslesen der letzten Zeile ansich.
Ich erklärs mal anhand einer Flag-Datei weil das recht einfach ist (die anderen Möglichkeiten sind aber auch nicht sooo dramatisch zu realisieren):
Zunächst müßtest du die Batches 1 & 2 die die Eingabe in die hi.txt machen erweitern.
Nach der Zeile:
kommt noch diese Zeile dazu:
So wird nach jeder Eingabe die Datei Flag erzeugt.
Die Batch für das dritte Fenster würde dan immer in Schleide laufen und überprüfen ob die Flagdatei existiert. Wenn ja wird sie gelöscht und die letzte Zeile der hi.txt ausgegeben.
Da wäre dann so:
Ich erklärs mal anhand einer Flag-Datei weil das recht einfach ist (die anderen Möglichkeiten sind aber auch nicht sooo dramatisch zu realisieren):
Zunächst müßtest du die Batches 1 & 2 die die Eingabe in die hi.txt machen erweitern.
Nach der Zeile:
echo %username%: %Eingabe% >> hi.txt
echo flag>flag
Die Batch für das dritte Fenster würde dan immer in Schleide laufen und überprüfen ob die Flagdatei existiert. Wenn ja wird sie gelöscht und die letzte Zeile der hi.txt ausgegeben.
Da wäre dann so:
@echo off
cls
:loop
if exist flag (
FOR /F "delims=" %%i in (hi.txt) do set zeile=%%i
echo %zeile%
)
goto:loop
Hallo Feardotcom!
Versuch es mit der folgenden Ausgabe:
Der Hauptunterschied besteht darin, dass %zeile% jetzt nicht mehr im "if"-Konstrukt ausgelesen wird und dadurch sofort zur Verfügung steht. In der vorigen Variante wurde der Wert von %zeile% bereits am Beginn des "if"-Teiles ermittelt (da "delayedexpansion" nicht "eingeschaltet" war), sodass zwar der neue Wert von %zeile% richtig aus der Datei gelesen, aber erst beim nächsten "if" auch als Variableninhalt erkannt wurde.
Die Alternative, nämlich
hätte den Nachteil, dass ein "!" verschluckt, bzw bei zwei vorkommenden "!" innerhalb einer Zeile auch der Teil dazwischen (da dann als Variablenname interpretiert) nicht ausgegeben würde.
Grüße
bastla
P.S.: Die Variable %username% wird vom System gesetzt und sollte durch Deinen "Eingabe"-Batch besser nicht überschrieben werden, daher zB %UsrName% verwenden ...
Versuch es mit der folgenden Ausgabe:
@echo off & setlocal
cls
echo. > hi.txt
:A
if not exist flag goto :A
set zeile=
FOR /F "delims=" %%i in (hi.txt) do set "zeile=%%i"
echo\%zeile%
del flag
goto :A
Die Alternative, nämlich
@echo off & setlocal enabledelayedexpansion
cls
echo. > hi.txt
:A
if exist flag (
FOR /F "delims=" %%i in (hi.txt) do set zeile=%%i
echo\!zeile!
del flag
)
Goto A
Grüße
bastla
P.S.: Die Variable %username% wird vom System gesetzt und sollte durch Deinen "Eingabe"-Batch besser nicht überschrieben werden, daher zB %UsrName% verwenden ...