noadmin
Goto Top

Letzte Zeile auslesen funktioniert nicht

habe mir heute ein Beispiel aus einem Beitrag hier im Forum (einzelne Zeile aus Textdatei auslesen) entnommen.
erste und n-te Zeile funktioniert wunderbar nur die letzte Zeile nicht. Habe leider fast keine Erfahrungen mit Batchdateien und kann den Fehler nicht finden.

Hier nochmal der Code - bei letzter Zeile erscheint bei mir immer nur Echo ist ausgeschaltet (off)
In meiner TXT stehen nur Zahlen, aber das sollte nicht die Ursache sein.

::-------LineToVar.bat
@echo off
echo ----C:\testbat\angnr.txt----
Type C:\testbat\angnr.txt
Echo ----ende C:\testbat\angnr.txt
:: Letzte Zeile in %Var% speichern
for /F "Tokens=*" %%i in (C:\testbat\angnr.txt) do Set var=%%i  
Echo Letzte Zeile...: %var%
Set var=
::Erste Zeile in %var% speichern
for /F "Tokens=*" %%i in (C:\testbat\angnr.txt) do call :setvarOnce "%%i"  
Echo Erste Zeile....: [%Var%]
Set var=
Pause
::
:: n-te Zeile in %var% speichern; n ist im Beispiel 3
Set /a "cnt=1"  
Set /a "n=3"  
for /F "Tokens=*" %%i in (C:\testbat\angnr.txt) do call :setvarFixLine %n% "%%i"  
Echo n-te Zeile, n=%n%: [%Var%]
Pause
goto :eof
~~~
:setvarOnce --Eine Variable einmal setzen
if "%var%"=="" Set "Var=%~1"  
goto :eof

~~~
:setvarFixLine
If %cnt%==%1 Set "Var=%~2"  
Set /a "cnt+=1"  
goto :eof

Content-Key: 43657

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

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

Member: Dani
Dani Nov 03, 2006 at 16:23:46 (UTC)
Goto Top
Hi,
steht in der letzten Zeile wirklich ein Text oder hast noch mit ENTER/RETURN einen Absatz gemacht?!


Gruß
Dani
Member: noadmin
noadmin Nov 03, 2006 at 16:31:13 (UTC)
Goto Top
oder hast noch mit ENTER/RETURN einen Absatz gemacht
Danke Dani! Ich hätte schon heute mittag mal fragen sollen... face-wink
Member: Biber
Biber Nov 03, 2006 at 17:26:57 (UTC)
Goto Top
Anmerkung dazu:

Die Aussage "Zeile x finden" ist nicht ganz richtig bzw. nicht ganz verlässlich.

Die beispielhaften Zeilen oben funktionieren dann, wenn die durchsuchte Textdatei keine Leerzeilen enthält.
Denn Leerzeilen werden vom dem "FOR /F"-Befehl ignoriert, d.h. nicht mitgezählt.

Wenn denn wirklich eine bestimmte Zeile 50 gemeint ist (sprich: im Texteditor oder im Notepad wird mir diese Zeile als "Zeile 50" angezeigt) und ist sind aber Leerzeilen vorher im Text enthalten...

...dann würde die FOR /F-Anweisung die 50ste "Zeile mit Inhalt" finden.
Dann müsste man/frau ausweichen auf "FindStr.exe"
findstr /n  "$" C:\testbat\angnr.txt|findstr "17:"  
### würde Zeile 17 anzeigen am CMD-Prompt
### in der Form "17: <i>zeileninhalt von Zeile 17</i>" 
### -bzw-:
...
for /f "delims=: tokens=2*" %i in ('findstr /n  "$" C:\testbat\angnr.txt|findstr^|findstr "17:"') do echo %i  
### würde nur den Inhalt der Zeile 17 (ohne das "17:" vorweg) anzeigen 
### -bzw- im Batch mit zwei Prozentzeichen:
...
for /f "delims=: tokens=2*" %%i in ('findstr /n  "$" C:\testbat\angnr.txt|findstr^|findstr "17:"') do echo %%i  

[Aber oben im Schnipsel sollte ja auch nur die Strategie gezeigt werden.]

Gruß
Biber
Member: snadboy
snadboy Nov 29, 2006 at 13:07:24 (UTC)
Goto Top
Hallo,

habe im Forum dazu folgendes gefunden
:: Letzte Zeile in %Var% speichern
for /F "Tokens=*" %%i in (C:\testbat\angnr.txt) do Set var=%%i
Echo Letzte Zeile...: %var%
Set var=


kann mir jemand sagen wie man aus einer TXT Datei mit mehreren Zeilen
die komplette Datei auslesen kann um die einzelenen Zeilen dann in
Variablen zu speichern um diese dann später mit echo auszugeben oder
in eine neue Datei speichern zu können !

Gibt es in Kombination mit dem for /F Befehl eine Schleife ähnlich wie
while not eof - also alle zeilen auslesen bis dateiende erreicht ist ???
Member: Biber
Biber Nov 29, 2006 at 14:33:22 (UTC)
Goto Top
Moin snadboy,

willkommen im Forum.
Grundsätzlich ist es -wenn irgendwie machbar- sinnvoller, bei einer FOR/F-Verarbeitung ZEILENweise zu lesen und auch diese Zeile wieder sofort zu schreiben.

Natürlich gehen auch andere Konstrukte - aber da kann man/frau sich eben nur an andere, besser geeignete Skriptsprachen annähern.
Was dem Batch fehlt, ist weniger die While-not-eof-Lese-Möglichkeit als vielmehr eine Array/Index-Mimik.

Diese Array/Index-Mimik kannst Du so nachbilden:
Kurze Demo am CMD-Prompt:
>set /a cnt=1 & for /L %i in (1,1,9) do @set "Ln[!cnt!]=zeile!cnt!" & @set /a "cnt+=1"  
>set ln
Ln[1]=zeile1
Ln[2]=zeile2
Ln[3]=zeile3
Ln[4]=zeile4
Ln[5]=zeile5
Ln[6]=zeile6
Ln[7]=zeile7
Ln[8]=zeile8
Ln[9]=zeile9

Bezogen auf eine Datei
@echo off & setlocal EnableDelayedExpansion
:: Letzte Zeile in %ln[!cnt!]% zb %ln[127]% speichern
Set /a cnt=0
for /F "Tokens=*" %%i in (C:\testbat\angnr.txt) do (  
       Set /a "cnt+=1"  
       Set "ln[!cnt!]=%%i"  
)
Echo Zeilenanzahl ...: %cnt%     
Echo Letzte Zeile: %ln[!cnt!]%
...

Das heißt, Du hast dann alle 127 Zeilen in Variablen %ln[1]% ...%ln[127]% bei 127 gelesenen Zeilen.

In dem BatchTut II ("Workshop Batch for Runaways Tart II - Ein bisschen Handwerkszeuch") hier im Forum unter "Batch & Shell" habe ich das mal vorgeturnt.

Gruß
Biber
Member: snadboy
snadboy Nov 29, 2006 at 16:15:49 (UTC)
Goto Top
Hallo Biber,

vielen Dank für die schnelle und sehr gute Antwort !

die TXT Dateien die als LOG bei uns gespeichert werden haben meist
unterschiedliche anzahl von Zeilen !

Kannst du mir noch sagen wie ich das ganze noch so variabel wenn
möglich gestalten könnte das ich zunächst ermitteln kann wie viele
zeilen überhaupt in der TXT datei sind und somit dann auch die ausgabe
ebenfalls variabel gestalten kann und nicht mit %In[1]% bis %In[127]%
arbeiten müsste wie in deinem Vorschlag !

Besten Dank schon im Voraus

Grüsse Snadboy
Member: Biber
Biber Nov 29, 2006 at 16:43:08 (UTC)
Goto Top
Moin snadboy,

na, da beschreib doch erstmal genauer, wo ihr hinwollt...

Gerade beim Auswerten von Logdateien halte ich es für unwahrscheinlich, dass ihr die per FOR/F-Schleife durchwackeln müsst und dann nach -zig Einzelzeilenprüfungen im Batch die Zeilen 18, 23, 77 und die Zusammenfassung aus den letzten 4 Zeilen anzeigt..

Für diesen Zweck ist sicherlich eine Vor-Bearbeiting mit FindStr.exe/Find.exe sinnvoller und schneller.
Da bin ich sicher - denn ich bin überhaupt erst durch das Thema "Auswertung von Logdateien zu Batchdateien gekommen face-wink

Ansonsten vorab:
Die letzte Zeile ermitteln (bzw. die Anzahl Nicht-Leerzeilen):
for /f %%i in (deineLogdatei.txt) do set /a AnzZeilen+=1
[AnzZeilen braucht vorher nicht mit "Set /a AnzZeilen=0" definiert werden;
um sicherzugehen, dass da aber nicht 676 drinsteht, würde ich es tun.]

Um am CMD-Prompt zu vergleichen, ob das Ergebnis stimmt:
>findstr /n "." deineLogDatei.txt  

Poste erst mal Deine Anforderungen bitte.

Gruß
Biber
Member: snadboy
snadboy Nov 29, 2006 at 20:26:40 (UTC)
Goto Top
Hallo Biber,

ich möchte folgendes machen, wir loggen in unsere Windows Domäne die Ameldungen
von Zeitarbeitsusern in einer Datei im Netlogon Verzeichnis names anmeldung.txt.

Die Datei hat folgenden Inhalt:

Computer: NOTE1
Benutzer: user1
Anmeldung am:
Datum: 29.11.2006
Uhrzeit: 21:05:28,38
Domäne: domain.com

Da sich am PC teilweise mehrer/viele Benutzer anmelden ( Teilzeitkräfte ) ist die Datei
tagesabhängig unterschiedlich groß ( unterschiedliche Anzahl von Zeilen )

Wir möchten nun aus der Datei per Batch den Inhalt auslesen - Zeilenanzahl wie
gesagt ist variabel, die einzelnen Werte ( Zeilen ) sollten dann in Variablen
gespeichert sein um diese dann z.B. mit echo Zeilenweise auszugeben oder mit
echo und Zusatz z.B. in eine HTML Ausgabe umzuleiten !

set htmlout=logfile.html
echo Zeile1=%Zeile1%^<BR /^> >>%htmlout%
start %htmlout%

ich müsste also Zeile auslesen diese in Variable %zeile1% setzen, damit
ich sie mit echo %zeile1% + den HTML Zusatu in die neue HTML Ausgabe datei
speichern kann - das gleiche dann mit Zeile 2 usw. bis das Dateiende erreich ist.

Bei deinem ersten Vorschlag haben wir die Anzahl der Zeilen in %cnt% stehen,
%ln[!cnt!]% ergibt gar keinen Wert. Wie kann nun oberes Szenario lösen

@echo off & setlocal EnableDelayedExpansion
:: Letzte Zeile in %ln[!cnt!]% zb %ln[127]% speichern
Set /a cnt=0
for /F "Tokens=*" %%i in (anmeldung.txt) do (
Set /a "cnt+=1"
Set "ln[!cnt!]=%%i"
)
Echo Zeilenanzahl ...: %cnt%
Echo Letzte Zeile: %ln[!cnt!]% ( Bei diesem Echo erscheint kein Wert ???

Besten Dank für deine Mithilfe !
Member: Biber
Biber Nov 30, 2006 at 06:21:03 (UTC)
Goto Top
Moin snaddelchen,

sorry, habe gestern tatsächlich nicht getestet und es muss in der Tat so aussehen:
::--- snipp lineDemo.bat
@echo off & setlocal EnableDelayedExpansion
:: Letzte Zeile in !ln[%cnt%]! z.B. %ln[127]% speichern und davor %ln[1]%...%ln[126]% :)
Set /a cnt=0
for /F "Tokens=*" %%i in (%1) do (  
       Set /a "cnt+=1"  
       Set "ln[!cnt!]=%%i"  
)
Echo Zeilenanzahl ...: %cnt% ;Inhalt letzte Zeile steht in  %%ln[%cnt%]%%
Echo [Inhalt:] !ln[%cnt%]!
::----snapp linedemo.bat
Demo am CMD-Prompt:
>lineDemo.bat Beispiel.txt
Zeilenanzahl ...: 27 ;Inhalt letzte Zeile steht in  %ln[27]%
[Inhalt:] regsvr32 -u -s scanemal.dll
[was auch mit der letzten Zeile übereinstimmt.]

Also... bei der Ausgabe/dem Lesen der Pseudo-Arraywerte AUSSEN das Ausrufungszeichen; INNEN das %-Zeichen.

So far erstmal (Zeit für ein Käffchen bei mir)
Biber