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

Batchdatei soll immer nur die neuste zeile aus einer .txt auslesen und anzeigen

Frage Entwicklung Batch & Shell

Mitglied: Feardotcom

Feardotcom (Level 1) - Jetzt verbinden

14.10.2008, aktualisiert 16.10.2008, 4140 Aufrufe, 11 Kommentare

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
Mitglied: miniversum
14.10.2008 um 13:11 Uhr
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:
01.
FOR /F "delims=" %%i in (hi.txt) do set zeile=%%i 
02.
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.
Bitte warten ..
Mitglied: Feardotcom
14.10.2008 um 14:28 Uhr
Wie sähe das dann ca. mit deinem zusätzlichen Tip aus?Kannst du ein beispiel geben?
Ich bin jetzt soweit :

01.
@echo off 
02.
cls  
03.
FOR /F "delims=" %%i in (hi.txt) do set zeile=%%i  
04.
echo %zeile%
wenn das allerdings so aussieht, ruft der das einmal auf und beendet das doch gleich wieder?
Bitte warten ..
Mitglied: miniversum
14.10.2008 um 20:05 Uhr
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:
01.
echo %username%: %Eingabe% >> hi.txt
kommt noch diese Zeile dazu:
01.
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:
01.
@echo off 
02.
cls 
03.
:loop 
04.
if exist flag ( 
05.
FOR /F "delims=" %%i in (hi.txt) do set zeile=%%i 
06.
echo %zeile% 
07.
08.
goto:loop
Bitte warten ..
Mitglied: Feardotcom
15.10.2008 um 15:52 Uhr
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 ....
Bitte warten ..
Mitglied: bastla
15.10.2008 um 18:37 Uhr
Hallo Feardotcom!

... flag datei das erste mal erstellt, ist sie doch durchgehend da ...
Nicht, wenn Du noch als Zeile 7 einfügst:
01.
del flag
Grüße
bastla
Bitte warten ..
Mitglied: miniversum
15.10.2008 um 18:58 Uhr
Ups ja das war auch so gedacht. hatte ich vergessen zu coden. in der erklärung des Ablaufs ists ja erwähnt.
Bitte warten ..
Mitglied: Feardotcom
16.10.2008 um 00:12 Uhr
Hey ihr beiden und Danke für die Antworten, jedoch passt etwas nich mit
01.
FOR /F "delims=" %%i in (hi.txt) do set zeile=%%i  
02.
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
Bitte warten ..
Mitglied: bastla
16.10.2008 um 00:22 Uhr
Hallo Feardotcom!

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

Gegen die Ausgabe "ECHO ist ausgeschaltet (OFF)." hilft übrigens
01.
echo\%zeile%
Grüße
bastla
Bitte warten ..
Mitglied: Feardotcom
16.10.2008 um 12:17 Uhr
Huhu Bastla!
Jap ich hab die Reihenfolge eingehalten.
Hier mal die 2 codes:
Einmal die Eingabe:
01.
@echo off 
02.
:B  
03.
set /p username=Username: 
04.
echo Type "username" to choose a new username. 
05.
echo. 
06.
:A 
07.
set /p Eingabe=Eingabe (%username%) : 
08.
if "%Eingabe%"=="username" Goto B 
09.
echo %username%: %Eingabe% >> hi.txt 
10.
echo flag > flag 
11.
goto A
[...] und die Ausgabe:
01.
@echo off 
02.
cls  
03.
echo. > hi.txt 
04.
:A 
05.
if exist flag ( 
06.
FOR /F "delims=" %%i in (hi.txt) do set zeile=%%i  
07.
echo\%zeile% 
08.
del flag 
09.
10.
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
Bitte warten ..
Mitglied: bastla
16.10.2008 um 17:24 Uhr
Hallo Feardotcom!

Versuch es mit der folgenden Ausgabe:
01.
@echo off & setlocal 
02.
cls  
03.
echo. > hi.txt 
04.
:A 
05.
if not exist flag goto :A 
06.
set zeile= 
07.
FOR /F "delims=" %%i in (hi.txt) do set "zeile=%%i" 
08.
echo\%zeile% 
09.
del flag 
10.
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
01.
@echo off & setlocal enabledelayedexpansion 
02.
cls  
03.
echo. > hi.txt 
04.
:A 
05.
if exist flag ( 
06.
    FOR /F "delims=" %%i in (hi.txt) do set zeile=%%i  
07.
    echo\!zeile! 
08.
    del flag 
09.
10.
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 ...
Bitte warten ..
Mitglied: Feardotcom
16.10.2008 um 21:08 Uhr
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
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?

01.
if "%Eingabe%"=="" echo. >> hi.txt
[...] das will nich gehn =D

MFG Fear
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

Outlook & Mail
gelöst Outlook 2010 findet ost datei nicht (19)

Frage von Floh21 zum Thema Outlook & Mail ...

Microsoft
Ordner mit LW-Buchstaben versehen und benennen (19)

Frage von Xaero1982 zum Thema Microsoft ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...