-heny-
Goto Top

Unterschlagung der letzten Zeile der FINDSTR-Ausgabe

Hallo,

ich bin beim Schreiben einer Batch-Datei auf ein Problem gestoßen, welches ich sehr kurios finde und ebenfalls die Gründe für diese Merkwürdigkeit nicht verstehe.

Gehen wir davon aus, dass ich eine Textdatei, sowie ein Batch-File habe.

beispiel.txt
Zeile 1
Zeile 2
Zeile 3
Zeile 4
Zeile 5

beispiel.bat
@echo off
findstr /n $ beispiel.txt
pause

Beide Dateien befinden sich im selben Verzeichnis. Der FINDSTR-Befehl funktioniert so weit ohne Probleme, er versieht die Zeilen der Textdatei mit Zeilennummern und gibt sie aus.

Schaut man sich den Output jetzt allerdings etwas genauer an, so fällt auf, dass die letzte Zeile der Textdatei nicht ausgegeben wird.

Output: beispiel.bat
1:Zeile 1
2:Zeile 2
3:Zeile 3
4:Zeile 4
Drücken Sie eine beliebige Taste . . .

Woran liegt dies? Das ganze ist keine Ausnahme, ich habe es mit mehreren Fällen probiert und es macht keinen Unterschied, ob die letzte Zeile der Textdatei eine Leerzeile ist oder beliebigen Inhalt enthält.
Kann man dies umgehen bzw. verhindern, da es beim Auslesen/Schreiben in Textdateien wesentlich nervt und man Workarounds bauen muss?

Ich wäre euch zu großem Dank verpflichtet, wenn ihr mir helfen könntet.

Gruß,
heny

Content-Key: 82218

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

Printed on: April 24, 2024 at 09:04 o'clock

Member: Biber
Biber Mar 03, 2008 at 20:12:32 (UTC)
Goto Top
Moin -heny-,

kein Grund zur Panik... works as designed, wie die Biber sagen.

Du lässt suchen nach allen Zeilen mit CRLF am Ende und die letzte Zeile hat halt keinen.
Aber einen Zeilenanfang haben alle Zeilen.
(=21:09:16  D:\temp=)
REM  ### findstr /n $ e:\log.txt  ## reicht auch...
>findstr /n "$" e:\log.txt  
1:Zeile 1
2:Zeile 2
3:Zeile 3
4:Zeile 4

(=21:09:27  D:\temp=)
REM  ### findstr /n ^^ e:\log.txt  ## ginge syntaktisch auch, sieht aber nicht aus...
>findstr /n "^" e:\log.txt  
1:Zeile 1
2:Zeile 2
3:Zeile 3
4:Zeile 4
5:Zeile 5
(=21:09:30  D:\temp=)

Kannst beruhigt schlafen heute... face-wink

...und M$ auch... keine Unterschlagung...

Grüße
Biber
Member: miniversum
miniversum Mar 03, 2008 at 20:33:11 (UTC)
Goto Top
Ist mir auch schon aufgefallen in nem andern Zusammenhang.
Was auch geht (und auch gut aussieht ;) ):
findstr /n .* e:\log.txt

miniversum
Member: Biber
Biber Mar 03, 2008 at 20:44:39 (UTC)
Goto Top
Hmmja, miniversum,

die echte Kurzform von findstr WTF "inmyfile.txt" ist aber
findstr /n . e:\log.txt

[ohne "*"; der Punkt bedeutet ja schon "ein beliebiges Zeichen, und wenn es nur ein Zeilenanfang ist...]

Grüße
Biber
Ja, WTF bedeutet "Watt tu findest...
Member: miniversum
miniversum Mar 04, 2008 at 07:16:04 (UTC)
Goto Top
Hmmja, miniversum,

die echte Kurzform von findstr WTF "inmyfile.txt" ist aber
> findstr /n . e:\log.txt

[ohne "*"; der Punkt bedeutet ja schon "ein beliebiges Zeichen, und wenn es nur ein Zeilenanfang ist...]

Grüße
Biber
Ja, WTF bedeutet "Watt tu findest...

Da muss ich dir wiedersprechen.
Angenommen deine "inmyfile.txt" sieht so aus:
abc
ab
a

a
ab
abc
Dann würde bei den einzelnen Varianten folgendes rauskommen:
 E:\>findstr /n .* inmyfile.txt
1:abc
2:ab
3:a
4:
5:a
6:ab
7:abc
E:\>findstr /n ^^ inmyfile.txt
1:abc
2:ab
3:a
4:
5:a
6:ab
7:abc
E:\>findstr /n . inmyfile.txt
1:abc
2:ab
3:a
5:a
6:ab
7:abc
Ohne das "*" fehlt also die vierte Zeile.
Das ".*" bewirkt aber das gleiche wie ein "^^"

miniversum
Member: Biber
Biber Mar 04, 2008 at 07:30:22 (UTC)
Goto Top
@miniversum

Stimmt, hast recht.
Logisch herleiten kann ich dieses Verhalten nicht wirklich.
Aber ich nehms hin... face-wink

Grüße
Biber
Member: miniversum
miniversum Mar 04, 2008 at 07:43:05 (UTC)
Goto Top
Ich hätte da nen Erklärungsversuch.
"." gibt ja an das irgentein Zeichen da stehen muss.
In einer Leren Zeile steht ja garkein Zeichen. Ein Zeilenanfangszeichen gibts ja eigentlich nicht. Nur Zeilenumbruch.
Das "*" steht hingegen lauf Hilfe von findstr dafür das dieses zeichen mehrmals vorkommt, oder garnicht.
Garnicht trift also in dem Fall zu das dort auch ncihts in dieser Zeile steht.
Also sucht er nach irgenteinem Zeichen das entweder mehrmals wiederholt wird (also beliebige Zeichenfolge) oder gernicht vorkommt (also Leere Zeile)
Member: Biber
Biber Mar 04, 2008 at 07:49:17 (UTC)
Goto Top
@miniversum

Jepp, jetzt habe ich es auch verstanden.
".*" == "Ein beliebiges Zeichen keinmal, einmal oder öfter".
"." == "Ein beliebiges Zeichen, aber mindestens eines"

Danke
Biber