Von Batch in txt schreiben lassen, aber letzte Zeile soll immer oben sein
Ich lasse per Batch in eine txt-Datei schreiben, nur leider ist die letzte Zeile immer am Ende vom Dokument und man muss erst runterscrollen. Gibt es die Möglichkeit das genau umgedreht in die txt-Datei zuschreiben das die letzte Zeile immer an erster Stelle steht.
Hoffentlich hab ich es nicht zu kompliziert erklärt.
Oder gibt es andere Lösungen dafür.
franky11
Hoffentlich hab ich es nicht zu kompliziert erklärt.
Oder gibt es andere Lösungen dafür.
franky11
Please also mark the comments that contributed to the solution of the article
Content-Key: 80006
Url: https://administrator.de/contentid/80006
Printed on: April 28, 2024 at 02:04 o'clock
9 Comments
Latest comment
Wird so leider nicht so einfach gehen. Hab soeben auch schnell bei der PowerShell nachgesehen, auch dort ist keine solche Funktion vorhanden.
Was ich mir vorstellen könnte, wäre eine 2. Batchdatei, welche du am Schluss der ersten Batchdatei aufrufst und die dir das Ganze sortiert. Allerdings halte ich das Ganze für ziemlich übertrieben. Auch kann ich dir kein Beispielscript nennen, da das meine Batch-Kenntnisse übersteigen würde. Vielleicht wissen Biber oder bastla etwas, schicke Ihnen doch mal eine PN mit dem Link zu diesem Beitrag hier.
Was ich mir vorstellen könnte, wäre eine 2. Batchdatei, welche du am Schluss der ersten Batchdatei aufrufst und die dir das Ganze sortiert. Allerdings halte ich das Ganze für ziemlich übertrieben. Auch kann ich dir kein Beispielscript nennen, da das meine Batch-Kenntnisse übersteigen würde. Vielleicht wissen Biber oder bastla etwas, schicke Ihnen doch mal eine PN mit dem Link zu diesem Beitrag hier.
Hallo franky11 und willkommen im Forum!
Um den gewünschten Effekt schon beim Schreiben (ich gehe davon aus, dass die Datei neu erstellt wird) zu erzielen, wäre etwa folgende Strategie denkbar:
Da Du leider Deinen Batch nicht genauer dargestellt hast, konnte ich auch nur ein derart allgemeines Beispiel anführen.
Grüße
bastla
Um den gewünschten Effekt schon beim Schreiben (ich gehe davon aus, dass die Datei neu erstellt wird) zu erzielen, wäre etwa folgende Strategie denkbar:
@echo off & setlocal
set "Datei=D:\Datei.txt"
if exist "%Datei%" del "%Datei%"
echo Erstellte Zeilen:
for /l %%i in (1,1,10) do call :ProcessLine "Zeile %%i"
del "%Datei%.bak"
echo.
echo Dateiinhalt:
type "%Datei%"
goto :eof
:ProcessLine
echo %~1
if exist "%Datei%" move "%Datei%" "%Datei%.bak"
(echo %~1)>"%Datei%"
if exist "%Datei%.bak" type "%Datei%.bak">>"%Datei%"
Grüße
bastla
... als Alternative das von TuXHunt3R angesprochene nachträgliche "Sortieren" (unter Verwendung eines kleinen temporären VBScripts):
Da die gesamte Textdatei vorweg eingelesen werden muss, ist diese Variante für Logfiles mit 500.000 Zeilen vielleicht nicht soo gut geeignet - aber da ich, wie schon erwähnt, nix Genaues über Deinen Batch / Deine Textdatei weiß ...
Grüße
bastla
@echo off & setlocal
set "Datei=Z:\Datei.txt"
:: Dein Batch
::
::
set "R=%temp%\ReverseLines.vbs"
echo Set fso=CreateObject("Scripting.FileSystemObject"):T=Split(fso.OpenTextFile("%Datei%",1).ReadAll,vbCrLF)>"%R%"
echo Set D=fso.OpenTextFile("%Datei%",2,True):For i=UBound(T) To 0 Step -1:D.WriteLine T(i):Next:D.Close>>"%R%"
cscript //nologo "%R%"
del "%R%"
Grüße
bastla
Hallo franky11!
Das sollte dann etwa so gehen:
Grüße
bastla
Das sollte dann etwa so gehen:
@echo off & setlocal
set "Datei=c:\Test\htdocs\Testdatei.txt"
set mydate=%date:~-10,2%-%date:~-7,2%-%date:~-4%
set mytime=%time:~-11,2%-%time:~-8,2%-%time:~-5,2%
if exist "%Datei%" move "%Datei%" "%Datei%.bak"
echo %mydate% %mytime% %1 %2 %3 >"%Datei%"
if exist "%Datei%.bak" type "%Datei%.bak">>"%Datei%"
Grüße
bastla
Moin franky11,
Randbemerkung:
es ist aber auch ein Stück weit hausgemachtes Leiden...
Wenn ich es richtig sehe, wird jeweils EINE Zeile neu geschrieben, die beginnt mit einem...
Wenn Du einfach das Datum in einem sortierbaren Format schreiben würdest, also..
Und ggf. noch vorher mit Findstr filtern auf "alles mit "2008" am Zeilenanfang" oder so.
Denn bastlas Workaround wäre auch die einzige Strategie, die mir einfallen würde, aber wenn Deine Textdatei ein paar 100000 Sätze enthält, wird diese Hin-und-Herkopiererei nicht sonderlich performant sein.
Die wesentliche Aussage in diesem Thread ist doch, dass es eigentlich nicht geht, an den Anfang einer Datei zu schreiben.
Also sollte man/frau den Rest des Vorhabens doch dieser Tatsache anpassen...
Grüße
Biber
Randbemerkung:
es ist aber auch ein Stück weit hausgemachtes Leiden...
Wenn ich es richtig sehe, wird jeweils EINE Zeile neu geschrieben, die beginnt mit einem...
%date:~-10,2%-%date:~-7,2%-%date:~-4%
Oder auf Deutsch, mit einem...06-02-2008
Wenn Du einfach das Datum in einem sortierbaren Format schreiben würdest, also..
2008-02-2008
...dann könntest du die ganze Datei mit einem einfachen "SORT /R c:\Test\htdocs\Testdatei.txt" absteigend anzeigen lassen.Und ggf. noch vorher mit Findstr filtern auf "alles mit "2008" am Zeilenanfang" oder so.
Denn bastlas Workaround wäre auch die einzige Strategie, die mir einfallen würde, aber wenn Deine Textdatei ein paar 100000 Sätze enthält, wird diese Hin-und-Herkopiererei nicht sonderlich performant sein.
Die wesentliche Aussage in diesem Thread ist doch, dass es eigentlich nicht geht, an den Anfang einer Datei zu schreiben.
Also sollte man/frau den Rest des Vorhabens doch dieser Tatsache anpassen...
Grüße
Biber
Hallo franky11!
Zu den genannten Zeilen:
Vorweg eine zusätzliche Zeile, um den Wunsch nach einem anderen Speicherort der "%Datei%.bak" umzusetzen:
Den Namen dieser Datei leite ich nicht mehr vom ursprünglichen Dateinamen ab, Du kannst daher "Bak.txt" beliebig ändern. Wenn Du auch einen anderen Ordner als %temp% verwenden willst, sollte dieser aber (aus Performance-Gründen) auf dem gleichen Laufwerk liegen, da ansonsten ein zweimaliger Kopiervorgang nötig wird. [Edit] Diese Überlegung ist bei einem Umfang von 200 Zeilen dann wohl zu vernachlässigen ... [/Edit]
Wenn die Textdatei bereits existiert, wird sie durch diese Zeile einfach umbenannt - "move" verwende ich aus Bequemlichkeitsgründen, da ich damit eine alte Version automatisch überschreiben kann. In der hier verwendeten Fassung bringt es den zusätzlichen Vorteil, dass auch ein anderer Ordner als Ziel verwendet werden kann. In "%Bak%" befindet sich also jetzt der bisherige Dateiinhalt.
Durch die Ausgabe dieser Zeile wird die Textdatei im ursprünglichen Ordner neu erstellt - die geschriebene Zeile ist daher der erste Eintrag.
"type" gibt den Inhalt einer Datei aus. Durch die Umleitung mit ">>" in Deine mit der vorigen Zeile neu angelegte Datei wird der bisherige Dateiinhalt (wenn es schon einen gab - zur Sicherheit mit "if exist" geprüft) an die neue Datei angefügt.
@Biber
An sich gebe ich Dir hinsichtlich der Sortierung recht, aber auch dann muss ja eine Temporär-Datei erstellt werden, was hinsichtlich der Performance sogar nachteilig wäre, da bei der von mir verwendeten Methode eine zusätzliche Sortierung gar nicht nötig wird (die Reihenfolge des Eintrages entscheidet und wird auch nicht verändert) - oder übersehe ich noch etwas? [Edit] Offensichtlich hier nicht wichtig, trotzdem aber interessant ... [/Edit]
Grüße
bastla
Zu den genannten Zeilen:
Vorweg eine zusätzliche Zeile, um den Wunsch nach einem anderen Speicherort der "%Datei%.bak" umzusetzen:
set "Bak=%temp%\Bak.txt"
if exist "%Datei%" move "%Datei%" "%Bak%"
echo %mydate% %mytime% %1 %2 %3 >"%Datei%"
if exist "%Bak%" type "%Bak%">>"%Datei%"
@Biber
An sich gebe ich Dir hinsichtlich der Sortierung recht, aber auch dann muss ja eine Temporär-Datei erstellt werden, was hinsichtlich der Performance sogar nachteilig wäre, da bei der von mir verwendeten Methode eine zusätzliche Sortierung gar nicht nötig wird (die Reihenfolge des Eintrages entscheidet und wird auch nicht verändert) - oder übersehe ich noch etwas? [Edit] Offensichtlich hier nicht wichtig, trotzdem aber interessant ... [/Edit]
Grüße
bastla