franky11
Goto Top

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

Content-Key: 80006

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

Printed on: April 25, 2024 at 07:04 o'clock

Member: TuXHunt3R
TuXHunt3R Feb 05, 2008 at 22:14:21 (UTC)
Goto Top
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.
Member: bastla
bastla Feb 05, 2008 at 22:44:09 (UTC)
Goto Top
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:
@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%"  
Da Du leider Deinen Batch nicht genauer dargestellt hast, konnte ich auch nur ein derart allgemeines Beispiel anführen.

Grüße
bastla
Member: bastla
bastla Feb 05, 2008 at 23:04:38 (UTC)
Goto Top
... als Alternative das von TuXHunt3R angesprochene nachträgliche "Sortieren" (unter Verwendung eines kleinen temporären VBScripts):
@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%"  
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
Member: franky11
franky11 Feb 06, 2008 at 17:53:59 (UTC)
Goto Top
Hallo bastla,
ich weis PN hätte etwas ausfürlicher sein können. So nun zu meinem Problem.
Die Batch schreibt fortlaufend in eine bestehende Datei, wobei die Datei von oben nach unten geschrieben wird. Ich hätt es gern andersrum. Hier meine Batch:


@echo off
set mydate=%date:~-10,2%-%date:~-7,2%-%date:~-4%
set mytime=%time:~-11,2%-%time:~-8,2%-%time:~-5,2%
echo %mydate% %mytime% %1 %2 %3>>c:\Test\htdocs\Testdatei.txt


Hintergrund meines Anliegens ist, das die Datei übers Internet von mehreren Freunden angeschaut werden kann wobei das Aktuellste halt immer ganz oben stehen soll.
Member: bastla
bastla Feb 06, 2008 at 18:06:42 (UTC)
Goto Top
Hallo franky11!

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
Member: Biber
Biber Feb 06, 2008 at 19:24:11 (UTC)
Goto Top
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...
%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
Member: franky11
franky11 Feb 06, 2008 at 19:37:21 (UTC)
Goto Top
@bastla
Funktioniert einwandfrei. Voller Respekt. Ich will nicht Nerven aber könntest du mir die Zeilen einzeln erklären. Kenne da nicht alle Befehle und Zusammenhang.

if exist "%Datei%" move "%Datei%" "%Datei%.bak"
echo %mydate% %mytime% %1 %2 %3 >"%Datei%"
if exist "%Datei%.bak" type "%Datei%.bak">>"%Datei%"


Will die bak-Datei in ein anderes Verzeichnis haben.
Vielen Dank im vorraus.

franky11
@Biber
Hab gerade dein Komentar gelesen. Die Datei wird nur ca. 200 Zeilen lang dann lösch ich sie. Wegen Datum das muss so sein, in die Datei werden Alarmierungen geschrieben die müssen wegen der Übersicht so sein.
Member: bastla
bastla Feb 06, 2008 at 20:02:16 (UTC)
Goto Top
Hallo franky11!

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"  
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]

if exist "%Datei%" move "%Datei%" "%Bak%"  
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.

echo %mydate% %mytime% %1 %2 %3 >"%Datei%"  
Durch die Ausgabe dieser Zeile wird die Textdatei im ursprünglichen Ordner neu erstellt - die geschriebene Zeile ist daher der erste Eintrag.

if exist "%Bak%" type "%Bak%">>"%Datei%"  
"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
Member: franky11
franky11 Feb 06, 2008 at 20:14:11 (UTC)
Goto Top
Das ist einfach Spitze mit euch. Habs nochmal genau durchgeschaut und gleich meinen Bedürfnissen angepasst.
Hier wird einem wirklich schnell geholfen.

franky11