Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

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

Von Batch in txt schreiben lassen, aber letzte Zeile soll immer oben sein

Frage Entwicklung Batch & Shell

Mitglied: franky11

franky11 (Level 1) - Jetzt verbinden

05.02.2008, aktualisiert 06.02.2008, 8897 Aufrufe, 9 Kommentare

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
Mitglied: TuXHunt3R
05.02.2008 um 23:14 Uhr
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.
Bitte warten ..
Mitglied: bastla
05.02.2008 um 23:44 Uhr
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:
01.
@echo off & setlocal 
02.
set "Datei=D:\Datei.txt" 
03.
 
04.
if exist "%Datei%" del "%Datei%" 
05.
echo Erstellte Zeilen: 
06.
for /l %%i in (1,1,10) do call :ProcessLine "Zeile %%i" 
07.
del "%Datei%.bak" 
08.
echo. 
09.
echo Dateiinhalt: 
10.
type "%Datei%" 
11.
goto :eof 
12.
 
13.
:ProcessLine 
14.
echo %~1 
15.
if exist "%Datei%" move "%Datei%" "%Datei%.bak" 
16.
(echo %~1)>"%Datei%" 
17.
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
Bitte warten ..
Mitglied: bastla
06.02.2008 um 00:04 Uhr
... als Alternative das von TuXHunt3R angesprochene nachträgliche "Sortieren" (unter Verwendung eines kleinen temporären VBScripts):
01.
@echo off & setlocal 
02.
set "Datei=Z:\Datei.txt" 
03.
 
04.
:: Dein Batch 
05.
:: 
06.
:: 
07.
 
08.
set "R=%temp%\ReverseLines.vbs" 
09.
echo Set fso=CreateObject("Scripting.FileSystemObject"):T=Split(fso.OpenTextFile("%Datei%",1).ReadAll,vbCrLF)>"%R%" 
10.
echo Set D=fso.OpenTextFile("%Datei%",2,True):For i=UBound(T) To 0 Step -1:D.WriteLine T(i):Next:D.Close>>"%R%" 
11.
cscript //nologo "%R%" 
12.
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
Bitte warten ..
Mitglied: franky11
06.02.2008 um 18:53 Uhr
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.
Bitte warten ..
Mitglied: bastla
06.02.2008 um 19:06 Uhr
Hallo franky11!

Das sollte dann etwa so gehen:
01.
@echo off & setlocal 
02.
set "Datei=c:\Test\htdocs\Testdatei.txt" 
03.
 
04.
set mydate=%date:~-10,2%-%date:~-7,2%-%date:~-4% 
05.
set mytime=%time:~-11,2%-%time:~-8,2%-%time:~-5,2% 
06.
 
07.
if exist "%Datei%" move "%Datei%" "%Datei%.bak" 
08.
echo %mydate% %mytime% %1 %2 %3 >"%Datei%" 
09.
if exist "%Datei%.bak" type "%Datei%.bak">>"%Datei%"
Grüße
bastla
Bitte warten ..
Mitglied: Biber
06.02.2008 um 20:24 Uhr
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
Bitte warten ..
Mitglied: franky11
06.02.2008 um 20:37 Uhr
@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.
Bitte warten ..
Mitglied: bastla
06.02.2008 um 21:02 Uhr
Hallo franky11!

Zu den genannten Zeilen:

Vorweg eine zusätzliche Zeile, um den Wunsch nach einem anderen Speicherort der "%Datei%.bak" umzusetzen:
01.
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]

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

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

01.
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
Bitte warten ..
Mitglied: franky11
06.02.2008 um 21:14 Uhr
Das ist einfach Spitze mit euch. Habs nochmal genau durchgeschaut und gleich meinen Bedürfnissen angepasst.
Hier wird einem wirklich schnell geholfen.

franky11
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Debian
Www-data in ein CIFS Share Daten schreiben lassen? (3)

Frage von Jens4ever zum Thema Debian ...

Windows 7
Texte weisen Fehler auf letzte Zeile wie Barcod Striche (3)

Frage von Nemonautilus zum Thema Windows 7 ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (20)

Frage von Xaero1982 zum Thema Microsoft ...

Outlook & Mail
gelöst Outlook 2010 findet ost datei nicht (19)

Frage von Floh21 zum Thema Outlook & Mail ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Festplatten, SSD, Raid
M.2 SSD wird nicht erkannt (14)

Frage von uridium69 zum Thema Festplatten, SSD, Raid ...