feardotcom
Goto Top

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

Content-Key: 99229

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

Printed on: April 19, 2024 at 20:04 o'clock

Member: miniversum
miniversum Oct 14, 2008 at 11:11:57 (UTC)
Goto Top
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:
FOR /F "delims=" %%i in (hi.txt) do set zeile=%%i  
echo %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.
Member: Feardotcom
Feardotcom Oct 14, 2008 at 12:28:44 (UTC)
Goto Top
Wie sähe das dann ca. mit deinem zusätzlichen Tip aus?Kannst du ein beispiel geben?
Ich bin jetzt soweit :

@echo off
cls 
FOR /F "delims=" %%i in (hi.txt) do set zeile=%%i   
echo %zeile%
wenn das allerdings so aussieht, ruft der das einmal auf und beendet das doch gleich wieder?
Member: miniversum
miniversum Oct 14, 2008 at 18:05:34 (UTC)
Goto Top
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:
echo %username%: %Eingabe% >> hi.txt
kommt noch diese Zeile dazu:
echo flag>flag
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:
@echo off
cls
:loop
if exist flag (
FOR /F "delims=" %%i in (hi.txt) do set zeile=%%i  
echo %zeile%
)
goto:loop
Member: Feardotcom
Feardotcom Oct 15, 2008 at 13:52:03 (UTC)
Goto Top
huhu
Danke für den Vorschlag =) , aber wenn man die erste Eingabe und somit diese flag datei das erste mal erstellt, ist sie doch durchgehend da und er macht sozusagen ne schleife, so dass er dauerhaft die erste Eingabe anzeigt ....
Member: bastla
bastla Oct 15, 2008 at 16:37:15 (UTC)
Goto Top
Hallo Feardotcom!

... flag datei das erste mal erstellt, ist sie doch durchgehend da ...
Nicht, wenn Du noch als Zeile 7 einfügst:
del flag
Grüße
bastla
Member: miniversum
miniversum Oct 15, 2008 at 16:58:03 (UTC)
Goto Top
Ups ja das war auch so gedacht. hatte ich vergessen zu coden. in der erklärung des Ablaufs ists ja erwähnt.
Member: Feardotcom
Feardotcom Oct 15, 2008 at 22:12:16 (UTC)
Goto Top
Hey ihr beiden und Danke für die Antworten, jedoch passt etwas nich mit
FOR /F "delims=" %%i in (hi.txt) do set zeile=%%i   
echo %zeile% 
[...] denn er gibt immer die zeile aus die ich zuvor geschrieben hab: z.B.
XYZ : hi .... <- wenn ich das eingebe erscheint "ECHO ist
ausgeschaltet (OFF).
XYZ : hi 2 .... <- wenn ich das eingebe erscheint "hi" :-P

könnt ja mal sofern ich noch einen Nerv dafür habt eben die 2 .txt erstellen und nachgucken =D

MFG Fear
Member: bastla
bastla Oct 15, 2008 at 22:22:07 (UTC)
Goto Top
Hallo Feardotcom!

Die Reihenfolge
echo %username%: %Eingabe% >> hi.txt
echo flag>flag
hast Du so eingehalten?

Gegen die Ausgabe "ECHO ist ausgeschaltet (OFF)." hilft übrigens
echo\%zeile%
Grüße
bastla
Member: Feardotcom
Feardotcom Oct 16, 2008 at 10:17:50 (UTC)
Goto Top
Huhu Bastla!
Jap ich hab die Reihenfolge eingehalten.
Hier mal die 2 codes:
Einmal die Eingabe:
@echo off
:B 
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
echo flag > flag
goto A
[...] und die Ausgabe:
@echo off
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
sieht das richtig aus ? theoretisch sollte es klappen aber wie gesagt er nimmt nich die letzte sondern die die ich davor getippt hab.

Gruß Fear
Member: bastla
bastla Oct 16, 2008 at 15:24:25 (UTC)
Goto Top
Hallo Feardotcom!

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
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
@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
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 ...
Member: Feardotcom
Feardotcom Oct 16, 2008 at 19:08:51 (UTC)
Goto Top
Hallo Bastla und Miniversum!
Es klappt ! =D herzlichen Dank ... ihr habt es zur Vollendung gebracht endlich ist der Infounterricht nicht mehr so langweilig !!!
Denn der Admin hat net send deaktiviert face-sad
Allerdings macht er bei leerer Eingabe verständlicherweise die zeile davor, weil ja nix in die .txt geschrieben wird, wie lautet also der befehl dafür, dass er bei leerer Eingabe auch ne leere Zeile in die .txt schreibt?

if "%Eingabe%"=="" echo. >> hi.txt  

[...] das will nich gehn =D

MFG Fear