Top-Themen

Aktuelle Themen (A bis Z)

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 Ausgelesene Zeile als echo verfügbar, bekomme sie aber nicht in eine Variable

Mitglied: AmVerzweifeln

AmVerzweifeln (Level 1) - Jetzt verbinden

12.03.2018 um 15:08 Uhr, 315 Aufrufe, 17 Kommentare

Hallo erstmal an alle die das lesen,

ich bin im Batch schreiben blutiger Anfänger.

Ich möchte aus einer sehr großen (kann bis 200MB groß werden) txt Datei die letzte Zeile auslesen und weiter verarbeiten. Das Auslesen und auf dem Bildschirm ausgeben gelingt mir mit folgendermaßen:

FOR /F "skip=%ZN% delims=" %%i IN (C:\Windows\Temp\Work.txt) do echo %%i

Will ich dieses nun im Scribt einer Variable übergeben:

FOR /F "skip=%ZN% delims=XXX" %%i IN (C:\Windows\Temp\Work.txt) do Set ZT=%%i
oder
FOR /F "skip=%ZN% delims=XXX" %%i IN (C:\Windows\Temp\Work.txt) do "Set ZT=%%i"

bleibt die Variable leer.

Der Zeilenaufbau in der Datei sieht folgendermaßen aus:
m 16:50:35|main Speed 381.22 Mh/s gpu/0 31.77 gpu/1 31.77 gpu/2 31.77 gpu/3 31.77 gpu/4 31.77 gpu/5 31.77 gpu/6 31.77 gpu/7 31.92 gpu/8 31.62 gpu/9 31.77 gpu/10 31.77 gpu/11 31.77 [A6101+88:R7+2:F0] Time: 18:37

Bin für jeden Lösungsansatz dankbar


Mitglied: Pedant
12.03.2018 um 16:57 Uhr
Hallo AmVerzweifeln,

wenn Du die Datei zeilenweise durchläufst, dann wird "echo" für jede Zeile ausgeführt.
Bei "set" ist es ebenso, allerdings wird die Variable jedesmal neu belegt und nur die letzte Belegung bleibt nach der Schleife bestehen.
Sollte die letzte Belegung einen leeren Wert zuordnen, so ist auch Deine Variable leer, respektive ungesetzt.

01.
FOR /F "skip=%ZN% delims=" %%i IN (C:\Windows\Temp\Work.txt) do 
02.
03.
	echo Wert: %%i 
04.
	if not "%%i"=="" set ZT=%%i 
05.
06.
echo ZT: %ZT%
Schau mal was dabei raukommt.

Auf skip=%ZN% und delims=XXX" kann ich mir keinen Reim machen.
Da fehlen wohl Infos deinerseits.

Gruß Frank
Bitte warten ..
Mitglied: AmVerzweifeln
12.03.2018 um 17:14 Uhr
Hallo Pedant,

danke das Du dir das angesehen hast.

%ZN% ist die entsprechende Zeilennummer
XXX ist eine Zeichenfolge die auf keinen Fall im Text vorhanden ist.

Ich bin mittlerweile zu Testzwecken dazu übergegangen die einzelnen Tokens auszulessen. Wollte auf die Art feststellen ob der Text irgendwelche Unverträglichkeiten hat. Beim Versuch den Zweiten Token (16:51:43|main) auszulesen schmiert er ab.
Ich denke das, dass Sonderzeichen"|" die Übergabe in die Variable verhindert. Die anderen Werte kann ich als Spalte extrahieren.
Aber wie beschrieben ich bin Batch Anfänger.
Im Ergebnis komme ich so an fast alles was ich an Daten brauche. Die Uhrzeit wäre zwar schön gewesen, aber zur Nor geht es auch ohne.

Kann es wirklich am Zeichen liegen?
Bitte warten ..
Mitglied: AmVerzweifeln
12.03.2018 um 17:27 Uhr
PS: Habe deinen Code natürlich probiert. Selbes Ergebniss, schmiet ab.
Danke für die Mühe
Bitte warten ..
Mitglied: Pedant
12.03.2018 um 18:21 Uhr
Hallo AmVerzweifeln,

mit | verkettet man Befehle.
Bsp.:
 set ZA=16:51:43|main
Der Befehl "main" ist entweder falsch geschrieben oder konnte nicht gefunden werden.

Nimm mal | als Delimiter.
Damit das funktioniert musst Du es maskieren:
delims=^|

https://www.administrator.de/wissen/tutorial-for-schleife-155681.html

Gruß Frank
Bitte warten ..
Mitglied: AmVerzweifeln
12.03.2018 um 18:34 Uhr
Hallo Pedant,

versuch ich gleich mal.

Zwichenzeitlich hätte ich da ein neues Problem.
Ich lese ab einer bestimmten Stelle die erste Spalte der Zeilen aus. Wenn in der ersten Spalte ein m steht kann ich die verarbeiten. Wenn ein anderer Buchstabe da steht, will ich die Zeile davor prüfen.
Mein Code funktioniert, wenn ich beim ersten Versuch auf ein m treffe. Wenn in der ersten Zeile ein i steht, ich die Zeile davor prüfe wo ein m steht erhalte ich immer noch das Ergebnis der ersten Zeile.

Ich lese die erste Zeile
Code FOR /F "tokens=1 skip=%ZN%" %%i IN (C:\Windows\Temp\Work.txt) do Set ZT=%%i
Prüfe ZT und wenn <> m sage ich per Goto, gehe zurück und prüfe die vorige Zeile (ZN-1)

Im Ergebniss hat er nun beide Zeilen in %%i und deshalb läuft meine Prüfung ins leere.
Gibt es so eine Art "Clear Befehl", welcher den Inhalt aus der ersten Prüfung löscht?
Bitte warten ..
Mitglied: AmVerzweifeln
12.03.2018 um 18:40 Uhr
Hallo Pedant,

das mit dem Delimiter war ne sehr gute Idee. Damit bekomme ich jetzt auch die Uhrzeit raus.

Vielen Dank dafür
Bitte warten ..
Mitglied: Pedant
12.03.2018 um 19:07 Uhr
Hallo AmVerzweifeln,

Zitat von AmVerzweifeln:
Wenn ein anderer Buchstabe da steht, will ich die Zeile davor prüfen.
Mein Code funktioniert, wenn ich beim ersten Versuch auf ein m treffe. Wenn in der ersten Zeile ein i steht, ich die Zeile davor prüfe wo ein m steht erhalte ich immer noch das Ergebnis der ersten Zeile.

Zitat von AmVerzweifeln:
Ich lese die erste Zeile
Code FOR /F "tokens=1 skip=%ZN%" %%i IN (C:\Windows\Temp\Work.txt) do Set ZT=%%i
Prüfe ZT und wenn <> m sage ich per Goto, gehe zurück und prüfe die vorige Zeile (ZN-1)

if würde hier nicht mit goto arbeiten, sondern den Vorzeilenwert und den aktuellen Wert speichern und entsprechnd agieren.
01.
 FOR /F "tokens=1 skip=%ZN%" %%i IN (C:\Windows\Temp\Work.txt) do 
02.
03.
	set vorher=%ZT% 
04.
	set ZT=%%i 
05.
	if not "%ZT%"=="m" set ZT=%vorher% 
06.
	)
Aus Deinen Beispielen geht allerdings nicht hervor wo Du eigentlich hinwillst und nur sehr dürftig wo Du eigentlich herkommst.

Zitat von AmVerzweifeln:
Gibt es so eine Art "Clear Befehl", welcher den Inhalt aus der ersten Prüfung löscht?
set Variable=
löscht die Variable.

Wirf mal hier einem Blick drauf:
https://www.administrator.de/faq/20

Gruß Frank
Bitte warten ..
Mitglied: AmVerzweifeln
12.03.2018, aktualisiert um 20:18 Uhr
Hallo Pedant,

wirklich nett von dir, dass du dir die Zeit nimmst mir zu helfen.

Ich fang mal von vorne an, damit du siehst wo das ganze hinführen soll.
In eine Textdatei werden fortlaufend Daten reingeschrieben. Wenn ich den aktuellen Stand erfahren will muss ich mir also den letzen Ergebniseintrag raus holen. Nicht jede Zeile ist aber eine Ergebniszeile. Ergebniszeilen werden mit einem vorstehenden m gekennzeichnet. Informationszeilen mit einem i.
Der Inhalt dieser Datei sieht wie folgt aus:
m 22:44:40|main Sp
m 22:44:40|main Sp
m 22:44:40|main Sp
m 22:44:40|main Sp
m 22:44:40|main Sp
i 22:44:41|CUDA5 So
i 22:44:41|CUDA5 No
i 22:44:41|stratum Acc
m 22:44:41|main Sp
m 22:44:41|main Sp
m 22:44:41|main Sp
m 22:44:41|main Sp
m 22:44:41|main Sp
m 22:44:42|main Sp

sind jetzt nur die ersten Zeichen, Zeilenlänge ist 232 Zeichen.

Vom Konzept her möchte ich nun die letzte Zeile auslesen, die enthaltenen Werte anzeigen und das soll jede Minute aktuallisiert werden.
Nun kann es mir passieren, dass die letzte Zeile eine "Informationsseite" ist und keine Werte beinhaltet.
In diesem Fall möchte ich X Zeilen davor gehen bis ich den letzten "m" Eintrag finde und mir dort die Werte raus holen. Das X ist dabei dynamisch. Können 3 Zeilen wie in diesem Beispiel aber auch mehr oder weniger sein.

Zu Zeit ist mein Problem, das ich dies mit
FOR /F "tokens=1 skip=%ZN%" %%i IN (C:\Windows\Temp\Work.txt) do Set ZT=%%i
die Werte aus der letzten Zeile leinlesen kann.
Stelle ich fest dass ich in einer Informationszeile bin, reduziere ich den Zeilenzeiger um 1 und will nun Prüfen ob die Zeile davor eine Wertezeile ist, usw. bis ich die letzte Wertezeile finde.

Hier der Code den ich bisher habe:
@echo off
::---------------------------ANZAHL ZEILEN ERMITTELN---------------------------
find C:\Windows\Temp\Work.txt /c /v "" > C:\Windows\Temp\ZN.txt
FOR /F "skip=1 delims=" %%i IN (C:\Windows\Temp\ZN.txt) do Set ZN=%%i

::-----LÄNGE DES TEXT ERMITTELN-----
set /a L=0
:Loop
call set "Z=%%ZN:~%L%,1%%"
if defined Z (set /a L+=1 & goto :Loop)
echo %ZN% hat %L% Zeichen

::-----ZEILENNUMMER ERMITTELN------
set /a ZN=%ZN:~37%
echo %ZN%
set /A ZN=%ZN%-1
echo %ZN%

:ZEILE_EINLESEN
::-----ZEILE EINLESEN---------------------
set "ZT="
::-----ZEILENTYP---------------------------
FOR /F "skip=%ZN% delims=^|" %%i IN (C:\Windows\Temp\Work.txt) do echo %%i

FOR /F "tokens=1 skip=%ZN%" %%i IN (C:\Windows\Temp\Work.txt) do Set ZT=%%i

::for /f "tokens=1" %%a in ('more/e +%ZN% ^< C:\Windows\Temp\Work.txt') do (
:: if not defined line set "ZT=%%a"
:

set ZT=%ZT:~0,1%
echo Zeilentyp: %ZT%

IF /i %ZT% == m GOTO RICHTIGER_ZT
::-----ZEILENTYP <> M 1------------------
echo Zeile %ZN% Zeilentyp ist kein m
set /A ZN=%ZN%-1
echo Prüfe vorige Zeile Nr. %ZN%
set "ZT="

GOTO ZEILE_EINLESEN

:RICHTIGER_ZT
echo Zeilentyp als Klassse m identifieziert

pause

Im Ergebnis passiert nun folgendes:
1. Lauf
10474
10473
i 22:44:50
Zeilentyp: i
Zeile 10473 Zeilentyp ist kein m
Pr³fe vorige Zeile Nr. 10472

2. Lauf
i 22:44:50
i 22:44:50
Zeilentyp: i
Zeile 10472 Zeilentyp ist kein m
Pr³fe vorige Zeile Nr. 10471

3. Lauf
i 22:44:50
i 22:44:50
i 22:44:50
Zeilentyp: i
Zeile 10471 Zeilentyp ist kein m
Pr³fe vorige Zeile Nr. 10470

4. Lauf
m 22:44:49
i 22:44:50
i 22:44:50
i 22:44:50
Zeilentyp: i
Zeile 10470 Zeilentyp ist kein m
Pr³fe vorige Zeile Nr. 10469


Nun sollte er eigentlich das m auslesen (set ZT=%ZT:~0,1%). Da er aber immernoch alle vier Ergebnisse als ein Ergebnis speichert, findet er nur wieder ein i. Daher kamm die Frage ob ich irgendwie das Ergebnis des voherigen FOR Befehls löschen kann, ohne gleich all meine Variabln zu löschen.

Aber vieleicht verenne ich mich bei der ganzen konzeptionierung in die falsche Richtung und das lässt sich alles viel einfacher lösen.

Wäre schön wenn du ne Lösung, Anregung oder die richtige Kritik hättest.

Wenn du sonst noch infos brauchst, jederzeit gerne.

Grüße

PS: Wie bekomme ich den den Code so elegant hier abgebildet wie Du?
Bitte warten ..
Mitglied: Pedant
13.03.2018 um 11:59 Uhr
Hallo AmVerzweifeln,

Zitat von AmVerzweifeln:
Aber vieleicht verenne ich mich bei der ganzen konzeptionierung in die falsche Richtung und das lässt sich alles viel einfacher lösen.

Wenn Dich nur die Zeilen interessieren, die mit "m " anfangen, dann solltest Du auch nur diese untersuchen, um nicht umständlich filtern zu müssen.
01.
@echo off 
02.
for /f "tokens=1,* delims=^|" %%f in ('findstr /b "m " C:\Windows\Temp\Work.txt') do ( 
03.
	set zeilenzeit=%%f 
04.
	set zeilentext=%%g 
05.
06.
set zeilenzeit=%zeilenzeit:~2% 
07.
echo Um %zeilenzeit% Uhr wurde Folgendes ausgegeben: %zeilentext%
Diese Code könnte die Aufgabe lösen, falls Uhrzeit und Inhalt der letzen m-Zeile alles ist, was Dich interessiert.

Ein paar Worte dazu:
 findstr /b "m " C:\Windows\Temp\Work.txt
Das gibt alle Zeilen aus die mit "m " beginnen.
Die Ausgabe des Befehls wird in der For-Schleife zeilenweise ausgewertet.
Getrennt wird am |.
Genutzt wird Token 1 => %%f und der Rest (Token *) => %%g
Die Variablen werden solange erneut belegt, bis die letzte Zeile ausgewertet wurde.
Nach der For-Schleife kommt die Ausgabe, wobei die Zeit zuvor noch vom führenden "m " befreit wird.

Bei mir bleibt die Frager offen was Du mit der Zeilennummer willst.
Hat das Performancegründe und Du möchtest deshalb ein skip=Zeilenanzahl nutzen oder benötigst Du die Zeilennummer in der Ausgabe?

Zitat von AmVerzweifeln:
PS: Wie bekomme ich den den Code so elegant hier abgebildet wie Du?

Zitat von Pedant
Wirf mal hier einem Blick drauf:
https://www.administrator.de/faq/20

Gruß Frank
Bitte warten ..
Mitglied: AmVerzweifeln
13.03.2018, aktualisiert um 15:01 Uhr
Hallo Frank,

wenn ich ohne die Zeilennummer ein FOR ausgeführt habe, ist er mir bei großen Dateien immer abgeschmiert. Die aktuelle Datei hat 1.16 Mio. Zeilen. Daher dachte ich, dass der Umfang das Problem für das abschmieren war. Seit ich erst die Zeilennummer ermittle, hab ich das Problem nicht mehr.
Und ja die Performance ist erheblich schneller.

Der Code von dir gibt mir leider nur leere Variablen. Vor dem "m" bzw "i" sind drei Leerstellen. Das habe ich geändert, dass Ergebnis ist aber immer noch das Selbe:

Um ~2 Uhr wurde Folgendes ausgegeben:

Habe das m in allen Varianten (3 Lerrzeichen davor und eins danach, ein Leerzeichen davor und danach, ohne Leerzeichen usw) suchen lassen, immer das selbe Ergebnis.

Habe dann mir den FOR Befehl noch mal angeschaut und die Option "eol=i" ausprobiert aber das selbe Ergebnis. Wobei ich mir nicht sicher bin, wie ich bei dem eol die Leerzeichen davor richtig darstelle.


Grüße Franco
Bitte warten ..
Mitglied: AmVerzweifeln
13.03.2018, aktualisiert um 14:26 Uhr
Habe jetzt mit eine vorherigen Versuch rumprobiert und dabei dein Model des Variablen setzen übernommen.
01.
FOR /F "skip=%ZN% tokens=1,* delims=^|" %%f IN (C:\Windows\Temp\Work.txt) do ( 
02.
                set V_ZEIT=%%f 
03.
                set V_WERT=%%g 
04.
05.
 
06.
echo Zeit:%V_ZEIT% 
07.
echo Wert:%V_WERT%
Lasse den Zeilentyp prüfen und wenn der nicht m ist, leere ich die Variablen und springe ich per GOTO wieder auf obigen Code zurück.

01.
set "V_ZEIT=" 
02.
set "V_WERT=" 
03.
 
04.
GOTO ZEILE_EINLESEN
Was ich nicht verstehe:
Der Code klettert korrekt immer eine Zeile weiter zurück aber der Wert der Variablen ändert sich nicht.
In der vierten Zeile von unten ändert sich die Sekunde. Aber auch wenn ich die Schleife 20 mal durchlaufe, zeigt er mir im Ergebniss immer die gleiche Zeit als Ergebniss an. Ergo erbehält den Wert des erstens Auslesen.
Ich denke ich hab da ein Grundsätzliches Verständnisproblem. Kann ich den Auslesenpart in eine eigene Batch auslagern und mit Rückgabewerte arbeiten? Wenn ich für jede Zeile die Lese-Batch extra starte sollten die Übergabewerte dann doch nur noch die geprüfte Zeile beinhalten oder verrenne ich mich jetzt schon wieder?
Bitte warten ..
Mitglied: AmVerzweifeln
13.03.2018 um 14:46 Uhr
Hallo Ralf,

ich denke ich hab das Problem verstanden.
In der FOR Schleife läuft er grundsätzlich von der Startzeile bis zur letzten Zeile alle Zeilen durch und übergibt damit auch jedesmal zum Schluss die Werte aus der letzten Zeile an die Variablen.

01.
FOR /F "skip=%ZN% tokens=1,* delims=^|" %%f IN (C:\Windows\Temp\Work.txt) do ( 
02.
                set V_ZEIT=%%f 
03.
                set V_WERT=%%g 
04.
                GOTO WEITER1 
05.
06.
 
07.
:WEITER1 
08.
 
09.
echo Zeilennummer:%ZN% 
10.
echo Zeit:%V_ZEIT% 
11.
echo Wert:%V_WERT%
Nach dem ich ihm aus der Schleife raus springen lasse, bekomme ich tatsächlich die Werte der aktuellen Zeile raus.
Das ist zwar nicht so elegant wie mit findstr aber löst ersteinmal mein Problem.
Ich bastle mal weiter.
Theoretisch ist das Problem damit gelöst. Es sei dem Du möchtest der Sache, warum das mit findst nicht funktioniert hat weiter auf den Grund gehen. Gib da mal kurz bescheid.

Vielen, vielen Dank für die Mühe die Du dir gemacht hast und für die sehr schnellen Antwortzeiten. Das hat mir sehr geholfen. Dickes Lob

Grüße Franco
Bitte warten ..
Mitglied: Pedant
LÖSUNG 13.03.2018 um 18:38 Uhr
Hallo Franco,

Zitat von AmVerzweifeln:
Der Code von dir gibt mir leider nur leere Variablen. Vor dem "m" bzw "i" sind drei Leerstellen.
wenn Du die Spielregel änderst...

Hier eine funktionierende Variante:
01.
@echo off 
02.
for /f "tokens=1,* delims=^|" %%f in ('findstr /r /c:"^[ ][ ][ ]m[ ]" C:\Windows\Temp\Work.txt') do ( 
03.
	set zeilenzeit=%%f 
04.
	set zeilentext=%%g 
05.
06.
set zeilenzeit=%zeilenzeit:~5% 
07.
echo Um %zeilenzeit% Uhr wurde Folgendes ausgegeben: %zeilentext%
Mit Deiner (aktualisierten) Quelldatei...
   m 22:44:40|main Sp 
   m 22:44:40|main Sp 
   m 22:44:40|main Sp 
   m 22:44:40|main Sp 
   m 22:44:40|main Sp 
   i 22:44:41|CUDA5 So 
   i 22:44:41|CUDA5 No 
   i 22:44:41|stratum Acc 
   m 22:44:41|main Sp 
   m 22:44:41|main Sp 
   m 22:44:41|main Sp 
   m 22:44:41|main Sp 
   m 22:44:41|main Sp 
   m 22:44:41|main Sp 
   m 22:44:42|main Sp
...kommt das hier raus:
Um 22:44:42 Uhr wurde Folgendes ausgegeben: main Sp

Gruß Frank

PS: Wer ist Ralf?
Bitte warten ..
Mitglied: AmVerzweifeln
13.03.2018 um 18:50 Uhr
Hallo Frank,

Ralf kommt dabei raus, wenn gleichzeitig telefoniert und schreibt.
Ich werd das gleich morgen früh mal einbauen und geb dir bescheid.

Danke nochmal und Grüße
Bitte warten ..
Mitglied: Pedant
LÖSUNG 14.03.2018 um 12:43 Uhr
Hallo Franco,

ich habe mir mal eine "richtige" Testdatei erzeugt,
die 1.160.000 Zeilen hat und so aussieht:
   m 16:50:35|main Speed 381.22 Mh/s gpu/0 31.77 gpu/1 31.77 gpu/2 31.77 gpu/3 31.77 gpu/4 31.77 gpu/5 31.77 gpu/6 31.77 gpu/7 31.92 gpu/8 31.62 gpu/9 31.77 gpu/10 31.77 gpu/11 31.77 [A6101+88:R7+2:F0] Time: 18:37 
... 
   m 16:50:35|main Speed 381.22 Mh/s gpu/0 31.77 gpu/1 31.77 gpu/2 31.77 gpu/3 31.77 gpu/4 31.77 gpu/5 31.77 gpu/6 31.77 gpu/7 31.92 gpu/8 31.62 gpu/9 31.77 gpu/10 31.77 gpu/11 31.77 [A6101+88:R7+2:F0] Time: 18:37
Meine letzte Variante mit findstr funktioniert zwar, ist aber bei einer größeren Datei weit jenseits von performant.
Habe ich eine Testdatei mit 1.000 Zeilen geht es noch einigermaßen, aber bei 100.000 Zeilen dauert es schon 9 Minuten bis die Suche fertig ist.

Ich habe es jetzt mit skip und ohne findstr gemacht, also so, wie Du es im Grunde auch schon gemacht hast.
Das geht mit der großen Datei, auch auf meinem eher schwächeren Rechner, ausreichend performant.
01.
@echo off 
02.
 
03.
:config 
04.
set suchpfad=C:\Windows\Temp 
05.
set suchdatei=Work.txt 
06.
 
07.
:alte_werte_loeschen 
08.
set zeilenanzahl= 
09.
set zeilenskip= 
10.
set zeilenanfang= 
11.
set zeilentyp= 
12.
set zeilenzeit= 
13.
set zeilentext= 
14.
set ausgabezeile= 
15.
 
16.
:zeilenanzahl_ermitteln 
17.
find %suchpfad%\%suchdatei% /c /v "" > %suchpfad%\zeilenanzahl.txt 
18.
for /f "tokens=3" %%i in (%suchpfad%\zeilenanzahl.txt) do ( 
19.
	set /a zeilenanzahl=%%i 
20.
21.
 
22.
REM echo Zeilenanzahl: %zeilenanzahl% 
23.
set /a zeilenskip=%zeilenanzahl% 
24.
 
25.
:suchloop 
26.
set /a zeilenskip=%zeilenskip%-1 
27.
if %zeilenskip% lss 1 goto ende 
28.
call :zeile_untersuchen %zeilenskip% 
29.
set zeilentyp=%zeilenanfang:~3,1% 
30.
set zeilenzeit=%zeilenanfang:~5% 
31.
REM echo Zeilentyp : %zeilentyp% 
32.
REM echo Zeilenzeit: %zeilenzeit% 
33.
REM echo Zeilentext: %zeilentext% 
34.
if not "%zeilentyp%"=="m" goto suchloop 
35.
 
36.
:ausgabe 
37.
set /a ausgabezeile=%zeilenskip%+1 
38.
echo Zeile: %ausgabezeile% 
39.
echo Zeit : %zeilenzeit% Uhr 
40.
echo Text : %zeilentext% 
41.
 
42.
:aufraeumen 
43.
set zeilenanzahl= 
44.
set zeilenskip= 
45.
set zeilenanfang= 
46.
set zeilentyp= 
47.
set zeilenzeit= 
48.
set zeilentext= 
49.
set ausgabezeile= 
50.
if exist %suchpfad%\zeilenanzahl.txt del %suchpfad%\zeilenanzahl.txt 
51.
 
52.
:ende 
53.
exit /b 
54.
 
55.
REM *** Hier endet die Batch, es folgt noch eine Funktion *** 
56.
 
57.
:zeile_untersuchen 
58.
REM echo Ueberspringe %1 Zeilen 
59.
for /f "skip=%1 tokens=1,* delims=^|" %%f in (%suchpfad%\%suchdatei%) do ( 
60.
	set zeilenanfang=%%f 
61.
	set zeilentext=%%g 
62.
	exit /b 
63.
)
Die Batch ermittelt mit Deiner Methode die Zeilenanzahl und skipt bei zeile_untersuchen zur letzen Zeile.
Sollte die letzte Zeile schon ein Treffer sein, also eine Zeile vom Typ "m", dann dauert die Suche ca. 3 Sek.
Sollte die Zeile kein Treffer sein, so wird zeile_untersuchen erneut aufgerufen, aber mit einem skip weniger.
So geht der suchloop immer eine Zeile höher, bis ein Treffer erzielt wurde.
Das dauert knapp eine Sekunde pro Zeile.
Wenn Typ-m-Zeilen also keine Seltenheit sind, ist der Suchvorgang vermutlich schnell genug.

alte_werte_loeschen und aufraeumen sind eigentlich nur relevant, wenn man die Batch manuell und wiederholt in derselben Eingabeaufforderung ausführt.
Damit verhindert man, dass man noch Werte vom vorhergehenden Durchlauf in den Variabel hat und eventuell diese angezeigt bekommt und nicht versteht wo die bloß herkommen.

Gruß Frank
Bitte warten ..
Mitglied: AmVerzweifeln
14.03.2018 um 14:14 Uhr
Hallo Frank,

nochmals vielen Dank für die Mühe die Du dir gemacht hast.
Beim ersten Versuch hat er sich tot gesucht. Habe dann Zeile 29

01.
set zeilentyp=%zeilenanfang:~3,1%
in

01.
set zeilentyp=%zeilenanfang:~2,1%
geändert, und siehe da: Funktioniert einwandfrei.

Ich markiere die Frage als gelöst.
Vielen, vielen Dank nochmal für die schnelle und gute Hilfe.

ohne dich wäre ich wahrscheinlich immer noch am Verzweifeln

Grüße
Bitte warten ..
Mitglied: Pedant
14.03.2018 um 14:28 Uhr
Hallo Franco,

Zitat von AmVerzweifeln:
...in
01.
set zeilentyp=%zeilenanfang:~2,1%
geändert, und siehe da: Funktioniert einwandfrei.

...dann hast Du die Spielregel wieder geändert,
Vor dem "m" bzw "i" sind drei Leerstellen
denn mit drei Leerzeichen müsste es mit ~3,1 funktionieren.

Aber egal, wenn's bei Dir jetzt läuft ist alles gut.

Ob Logdateien wirklich 1,16 Millionen Zeilen haben müssen, wäre noch eine andere Frage.
Man könnte sie sicher auch gelegentlich wegspeichern und neu (leer) anlegen.

Gruß Frank
Bitte warten ..
Ähnliche Inhalte
Batch & Shell

BATCHDATEI - Variable unter "echo" nicht angezeigt

gelöst Frage von TobiBotBatch & Shell4 Kommentare

Hey, ich bin neu hier und habe gleich mal eine Frage: Ich bin Batch-Neuling und arbeite gerade an einem ...

Batch & Shell

Echo date - Variable

gelöst Frage von CerauxBatch & Shell1 Kommentar

Hallo, ich versuche eine Variable in ein Textdokument auszugeben, jedoch will das nicht wirklich funktionieren: Batch: So soll die ...

Linux Tools

Mit echo eine Ausgabe einer Variable ändern.

gelöst Frage von rsadmchefLinux Tools2 Kommentare

Hallo Team, ich habe am Linux Terminal folgendes Konstrukt vor: num="11000" echo $num 11000 Es soll aber 1 1 ...

PHP

Übergabe von Php-Variablen an ein a href in einem echo

gelöst Frage von TheAlexPHP2 Kommentare

Ich versuche derzeit in einem echo befindlichem <a href> block php-variablen zu übergeben. Das Resultat ist dass er mir ...

Neue Wissensbeiträge
Windows 10

Mikrofon von Headset geht nach Update auf Windows 10 1803 nicht mehr

Tipp von Deepsys vor 1 TagWindows 101 Kommentar

Ich verwende ein Plantronics Headset das per USB mit dem Windows 10 PC verbunden ist. Damit kann ich auch ...

Video & Streaming

Ruckelfreies Fernsehen auf Smartphone oder Tablet - in SD oder gar HD - Eine Alternative zum Fritz DVB-C Receiver

Anleitung von power-user vor 2 TagenVideo & Streaming9 Kommentare

Wer kennt das nicht: Man möchte gemütlich auf dem Balkon sitzen und vielleicht grillen und dabei das WM-Spiel gucken ...

Erkennung und -Abwehr
Trendmicro WFBS 10 ist in deutsch verfügbar!
Tipp von VGem-e vor 2 TagenErkennung und -Abwehr4 Kommentare

Servus Kollegen, downloadbar unter

Windows Update

Microsoft Patchday Juni 2018 - BSOD, obwohl noch kein Patch freigegeben

Erfahrungsbericht von diemilz vor 2 TagenWindows Update8 Kommentare

Hallo zusammen, wir hatten hier letzte Woche ein massives Problem. Alles begann damit, dass ein Mitarbeiter kurz vor Feierabend ...

Heiß diskutierte Inhalte
Windows Userverwaltung
User Überwachung
gelöst Frage von YellowcakeWindows Userverwaltung38 Kommentare

Hey ich habe von unserem neuem Datenschutzbeauftragten ein kleines Horror Paket bekommen. Ich soll wenn es möglich ist, das ...

Windows Installation
Adobe Reader noch notwendig?
gelöst Frage von EitieOSWindows Installation26 Kommentare

Muss ich mir noch die Arbeit machen und den Adobe Reader installieren und aktuell halten, wenn doch in Win10 ...

Instant Messaging
Whats App Business am PC einsetzen
Frage von thomasreischerInstant Messaging15 Kommentare

Hallo zusammen, wir würden demnächst gerne WhatsApp Business verwenden um den Kontakt zwischen Kunden und Mitarbeitern zu erleichtern. Natürlich ...

Netzwerkmanagement
Druckprobleme bei Thin Clients und Netzwerkdruckern
Frage von hesperNetzwerkmanagement14 Kommentare

Morgen zusammen! Bei uns werden in den Außenstellen HP t520 Thin Clients an drei W2k16 Terminalserver mittels RDP eingesetzt. ...