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

Letzte Zeile auslesen funktioniert nicht

Frage Entwicklung Batch & Shell

Mitglied: noadmin

noadmin (Level 1) - Jetzt verbinden

03.11.2006, aktualisiert 30.11.2006, 7445 Aufrufe, 9 Kommentare

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.

01.
::-------LineToVar.bat 
02.
@echo off 
03.
echo ----C:\testbat\angnr.txt---- 
04.
Type C:\testbat\angnr.txt 
05.
Echo ----ende C:\testbat\angnr.txt 
06.
:: Letzte Zeile in %Var% speichern 
07.
for /F "Tokens=*" %%i in (C:\testbat\angnr.txt) do Set var=%%i 
08.
Echo Letzte Zeile...: %var% 
09.
Set var= 
10.
::Erste Zeile in %var% speichern 
11.
for /F "Tokens=*" %%i in (C:\testbat\angnr.txt) do call :setvarOnce "%%i" 
12.
Echo Erste Zeile....: [%Var%] 
13.
Set var= 
14.
Pause 
15.
:: 
16.
:: n-te Zeile in %var% speichern; n ist im Beispiel 3 
17.
Set /a "cnt=1" 
18.
Set /a "n=3" 
19.
for /F "Tokens=*" %%i in (C:\testbat\angnr.txt) do call :setvarFixLine %n% "%%i" 
20.
Echo n-te Zeile, n=%n%: [%Var%] 
21.
Pause 
22.
goto :eof 
23.
~~~ 
24.
:setvarOnce --Eine Variable einmal setzen 
25.
if "%var%"=="" Set "Var=%~1" 
26.
goto :eof 
27.
 
28.
~~~ 
29.
:setvarFixLine 
30.
If %cnt%==%1 Set "Var=%~2" 
31.
Set /a "cnt+=1" 
32.
goto :eof
Mitglied: Dani
03.11.2006 um 17:23 Uhr
Hi,
steht in der letzten Zeile wirklich ein Text oder hast noch mit ENTER/RETURN einen Absatz gemacht?!


Gruß
Dani
Bitte warten ..
Mitglied: noadmin
03.11.2006 um 17:31 Uhr
oder hast noch mit ENTER/RETURN einen Absatz gemacht
Danke Dani! Ich hätte schon heute mittag mal fragen sollen...
Bitte warten ..
Mitglied: Biber
03.11.2006 um 18:26 Uhr
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"
01.
findstr /n  "$" C:\testbat\angnr.txt|findstr "17:" 
02.
### würde Zeile 17 anzeigen am CMD-Prompt 
03.
### in der Form "17: <i>zeileninhalt von Zeile 17</i>" 
04.
### -bzw-: 
05.
... 
06.
for /f "delims=: tokens=2*" %i in ('findstr /n  "$" C:\testbat\angnr.txt|findstr^|findstr "17:"') do echo %i 
07.
### würde nur den Inhalt der Zeile 17 (ohne das "17:" vorweg) anzeigen 
08.
### -bzw- im Batch mit zwei Prozentzeichen: 
09.
... 
10.
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
Bitte warten ..
Mitglied: snadboy
29.11.2006 um 14:07 Uhr
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 ???
Bitte warten ..
Mitglied: Biber
29.11.2006 um 15:33 Uhr
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:
01.
>set /a cnt=1 & for /L %i in (1,1,9) do @set "Ln[!cnt!]=zeile!cnt!" & @set /a "cnt+=1" 
02.
>set ln 
03.
Ln[1]=zeile1 
04.
Ln[2]=zeile2 
05.
Ln[3]=zeile3 
06.
Ln[4]=zeile4 
07.
Ln[5]=zeile5 
08.
Ln[6]=zeile6 
09.
Ln[7]=zeile7 
10.
Ln[8]=zeile8 
11.
Ln[9]=zeile9
Bezogen auf eine Datei
01.
@echo off & setlocal EnableDelayedExpansion 
02.
:: Letzte Zeile in %ln[!cnt!]% zb %ln[127]% speichern 
03.
Set /a cnt=0 
04.
for /F "Tokens=*" %%i in (C:\testbat\angnr.txt) do ( 
05.
       Set /a "cnt+=1" 
06.
       Set "ln[!cnt!]=%%i" 
07.
08.
Echo Zeilenanzahl ...: %cnt%      
09.
Echo Letzte Zeile: %ln[!cnt!]% 
10.
...
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
Bitte warten ..
Mitglied: snadboy
29.11.2006 um 17:15 Uhr
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
Bitte warten ..
Mitglied: Biber
29.11.2006 um 17:43 Uhr
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

Ansonsten vorab:
Die letzte Zeile ermitteln (bzw. die Anzahl Nicht-Leerzeilen):
01.
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:
01.
>findstr /n "." deineLogDatei.txt
Poste erst mal Deine Anforderungen bitte.

Gruß
Biber
Bitte warten ..
Mitglied: snadboy
29.11.2006 um 21:26 Uhr
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 !
Bitte warten ..
Mitglied: Biber
30.11.2006 um 07:21 Uhr
Moin snaddelchen,

sorry, habe gestern tatsächlich nicht getestet und es muss in der Tat so aussehen:
01.
::--- snipp lineDemo.bat 
02.
@echo off & setlocal EnableDelayedExpansion 
03.
:: Letzte Zeile in !ln[%cnt%]! z.B. %ln[127]% speichern und davor %ln[1]%...%ln[126]% :) 
04.
Set /a cnt=0 
05.
for /F "Tokens=*" %%i in (%1) do ( 
06.
       Set /a "cnt+=1" 
07.
       Set "ln[!cnt!]=%%i" 
08.
09.
Echo Zeilenanzahl ...: %cnt% ;Inhalt letzte Zeile steht in  %%ln[%cnt%]%% 
10.
Echo [Inhalt:] !ln[%cnt%]! 
11.
::----snapp linedemo.bat
Demo am CMD-Prompt:
01.
>lineDemo.bat Beispiel.txt 
02.
Zeilenanzahl ...: 27 ;Inhalt letzte Zeile steht in  %ln[27]% 
03.
[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
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Windows 7
Texte weisen Fehler auf letzte Zeile wie Barcod Striche (3)

Frage von Nemonautilus zum Thema Windows 7 ...

Installation
gelöst Mit Powershell in einer Datei eine Zeile auslesen (6)

Frage von Bommi1961 zum Thema Installation ...

Google Android
Textdatei auf SD Karte auslesen funktioniert nicht (Oneplus One) (4)

Frage von lordzwieback zum Thema Google Android ...

Windows Server
Flickercode remote am Terminalserver auslesen funktioniert nicht (9)

Frage von immobrauch zum Thema Windows Server ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (20)

Frage von Xaero1982 zum Thema Microsoft ...

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

Frage von Floh21 zum Thema Outlook & Mail ...

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

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Festplatten, SSD, Raid
M.2 SSD wird nicht erkannt (14)

Frage von uridium69 zum Thema Festplatten, SSD, Raid ...