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, 393 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
Echo test.txt
gelöst Frage von CerauxBatch & Shell2 Kommentare

echo %test% >> test.txt Wie macht man es so, dass beim speichern kein Leerzeichen hinter dem Wort ist: Beispiel: ...

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 ...

Batch & Shell

Echo Ausgabe ohne Variablenauflösung

gelöst Frage von bartek76Batch & Shell9 Kommentare

Hallo Gemeinde, habe eine simple Frage, auf die ich aber bis jetzt keine Antwort fand. Möchte per Batch den ...

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 ...

Neue Wissensbeiträge
Humor (lol)
Administrator.de Perlen
Tipp von DerWindowsFreak2 vor 3 TagenHumor (lol)6 Kommentare

Hallo, Heute beim stöbern auf dieser Seite bin auf folgenden Thread aus dem Jahre 2006 gestossen: Was meint ihr? ...

Erkennung und -Abwehr
OpenSSH-Backdoor Malware erkennen
Tipp von Frank vor 4 TagenErkennung und -Abwehr

Sicherheitsforscher von Eset haben 21 Malware-Familien untersucht. Die Malware soll Hintertüren via OpenSSH bereitstellen, so dass Angreifer Fernzugriff auf ...

iOS
WatchChat für Whatsapp
Tipp von Criemo vor 7 TageniOS5 Kommentare

Ziemlich coole App für WhatsApp User in Verbindung mit der Apple Watch. Gibts für iOS sowohl als auch für ...

iOS
IOS hat nen Cursor!
Tipp von Criemo vor 7 TageniOS5 Kommentare

Nette Funktion im iOS. iPhone-Mauszeiger aktivieren „Nichts ist nerviger, als bei einem Tippfehler zu versuchen, den iOS-Cursor an die ...

Heiß diskutierte Inhalte
Windows Server
Dienstnamen und oder Deutsche und Englische Beschreibung in services.msc gleichzeitig anzeigen
gelöst Frage von vafk18Windows Server23 Kommentare

Guten Morgen, die Suche nach Diensten in services.msc gestaltet sich immer wieder schwierig, weil mir je nach Aufgabe die ...

Windows Server
Kleine Umfrage: Windows Server Desktop oder Core?
Frage von doomfreakWindows Server18 Kommentare

Hey :) Ich wollte mal eine kleine Umfrage hier starten. Ich bin schon etwas länger auf dieser Seite hier ...

JavaScript
Javascript: WebSql
gelöst Frage von internet2107JavaScript17 Kommentare

Guten Morgen zusammen, zunächst einmal einen schönen dritten Advent. Ich habe ein Problem mit Javascript und WebSQL. Bisher habe ...

Microsoft
Lizenzplausibilisierung oder Spam?
Frage von lordimacMicrosoft14 Kommentare

Liebe Forengemeinde, uns erreichte die Tage eine Mail bezüglich einer Lizenzplausibilisierung durch einen Microsoft SAM Partner. Die Meldung im ...