Formatierte Aufbereitung einer DiskUse-Ausgabe per Batch
Hallo zusammen,
ich möchte folgendes erreichen:
In einer Textdatei sollen die ersten 8 Zeilen gelöscht und verschiedene Texte gefunden und dann gelöscht werden bzw. umsortiert werden.
Die Quelldatei wird mit diskuse.exe" /d:w /w /t /v erzeugt.
Wobei der Aufbau der Datei folgender ist:
Die vorhandene TXT (CNT.txt) Datei sieht z.B. so aus:
Die geänderte Datei (Das Ergebnis) soll dann wie folgt aussehen.
Ist dieses Problem per Batch zu lösen?
Wenn ja wie? Bin euch für die Hilfe Dankbar!
Gruß CCED
ich möchte folgendes erreichen:
In einer Textdatei sollen die ersten 8 Zeilen gelöscht und verschiedene Texte gefunden und dann gelöscht werden bzw. umsortiert werden.
Die Quelldatei wird mit diskuse.exe" /d:w /w /t /v erzeugt.
Wobei der Aufbau der Datei folgender ist:
Die vorhandene TXT (CNT.txt) Datei sieht z.B. so aus:
DiskUse Version 1.3
Scanning Path C:\FileBase\.
Resolving Names.
Sorting.
CCED Admin 213
36 : 06/17/2011 : C:\FileBase\Datei1.zip
150 : 06/17/2011 : C:\FileBase\\09_I4_SandBlood.zip
27 : 06/17/2011 : C:\FileBase\\DL.Log
Die geänderte Datei (Das Ergebnis) soll dann wie folgt aussehen.
Datum Dateiname Dateigröße in Bytes
--------------------------------------------------------------------------------------
06/17/2011 Datei1.zip 4294967296
06/17/2011 09_I4_SandBlood.zip 6589545
06/17/2011 DL.Log 54824
Ist dieses Problem per Batch zu lösen?
Wenn ja wie? Bin euch für die Hilfe Dankbar!
Gruß CCED
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Kommentar vom Moderator Biber am 18.06.2011 um 14:43:38 Uhr
Original-Titel "Batch- Findstr - SyntaxFehler bei der Ausführung" etwas an die Realität angeglichen.
Content-ID: 168208
Url: https://administrator.de/forum/formatierte-aufbereitung-einer-diskuse-ausgabe-per-batch-168208.html
Ausgedruckt am: 25.12.2024 um 17:12 Uhr
19 Kommentare
Neuester Kommentar
Aloha,
... spielen wir heute Ratequiz? Was hat der Threadtitel mit dem EP zu tun?
Batch- Findstr - SyntaxFehler bei der Ausführung sollte dazu nicht ein Skript bereits vorhanden sein?
Sollen wir dir jetzt etwas neues hinklatschen oder bei etwas helfen? Hast du bereits ein Skript (wovon ich anhand des Titels ausgehe) oder wie oder was?
Ja.
greetz André
P.S.: Warum enthälft die geänderte Datei, Daten, die in der Ursprungsdatei nicht vorkommen? bei der Ausgabe kann man auch gleich
... spielen wir heute Ratequiz? Was hat der Threadtitel mit dem EP zu tun?
Batch- Findstr - SyntaxFehler bei der Ausführung sollte dazu nicht ein Skript bereits vorhanden sein?
Sollen wir dir jetzt etwas neues hinklatschen oder bei etwas helfen? Hast du bereits ein Skript (wovon ich anhand des Titels ausgehe) oder wie oder was?
Ist dieses Problem per Batch zu lösen?
Ja.
greetz André
P.S.: Warum enthälft die geänderte Datei, Daten, die in der Ursprungsdatei nicht vorkommen? bei der Ausgabe kann man auch gleich
dir
mit bisschen Schnickschnack drumherum nutzen ... was genau macht diskuse.exe eigentlich
Hallo cced-de
den Thread solltest Du wirklich mal umbenennen...
Teste mal das hier:
Gruß
Friemler
[EDIT]
Nachgereichte Erklärung:
Die
Wegen
Als Trennzeichen zwischen den einzelnen Bestandteilen (Tokens) einer Zeile wird wegen
Wegen
In beiden Fällen enthalten die Laufvariablen aber noch führende (und nachfolgende) Leerzeichen. Die würden vor allem bei der Ermittelung der Dateigröße zu einem Fehler führen und außerdem das Layout der Tabelle unschön machen.
Die Leerzeichen um das Datum werden von der
Die
Die
Das Unterprogramm
Im Unterprogramm
In den Zeilen 49 bis 52 wird eine Variable erzeugt, die aus der berechneten Anzahl von Leerzeichen besteht. Da hierfür die verzögerte Variablenerweiterung benötigt wird, wird diese in Zeile 49 eingeschaltet und in Zeile 52 wieder ausgeschaltet. Um die erzeugte Variable
In den Zeilen 54 und 55 wird der Inhalt einer Zeile in der Ausgabedatei zusammengebaut (die Variable
Nachdem eine Zeile der Ausgabedatei komplett erzeugt wurde, wird in Zeile 36 das Unterprogramm
Die Ausgabe erfolgt in Zeile 61 über eine
Da die Zeilen 13 bis 38 einen in Klammern eingeschlossenen Block bilden, werden sämtliche Ausgaben, auch im Unterprogramm
Ausführliche Informationen zu
[/EDIT]
den Thread solltest Du wirklich mal umbenennen...
Teste mal das hier:
@echo off
setlocal
set "InputFile=%ProgPath%\CNT.txt"
set "OutputFile=content.txt"
"%tools%\diskuse.exe" /d:w /w /t /v %Upload% >"%InputFile%"
(echo.
echo.
echo Datum Dateiname Groesse in Bytes
echo -------------------------------------------------------------------------------
for /f "skip=8 tokens=2* delims=:" %%a in ('findstr "^" "%InputFile%"') do (
for /f "tokens=1" %%i in ("%%a") do (
set "String=%%i"
call :ConcatString 12 0
)
for /f "tokens=*" %%i in ("%%b") do (
set "String=%%~nxi"
call :ConcatString 51 0
)
for /f "tokens=*" %%i in ("%%b") do (
set "String=%%~zi"
call :ConcatString 16 1
)
call :OutputLine
)
) >"%OutputFile%"
exit /b
:ConcatString
>"%TEMP%\strlen.txt" <NUL (set /p "=<%String%"&echo.&set /p "=<"&echo.)
for /f "delims=:" %%l in ('findstr /o /b "<" "%TEMP%\strlen.txt"') do set /a "nSpaces=%1-(%%l-3)"
del "%TEMP%\strlen.txt"
setlocal enabledelayedexpansion
set "Space="
for /l %%z in (1,1,%nSpaces%) do set "Space=!Space! "
endlocal & set "Space=%Space%"
if "%2" equ "0" set "Line=%Line%%String%%Space%"
if "%2" equ "1" set "Line=%Line%%Space%%String%"
exit /b
:OutputLine
for %%s in ("%Line%") do echo %%~s
set "Line="
exit /b
Gruß
Friemler
[EDIT]
Nachgereichte Erklärung:
Die
FOR
-Schleife in Zeile 20 verarbeitet die Datei, die von DISKUSE
erzeugt wurde, zeilenweise.Wegen
skip=8
werden dabei die ersten 8 Zeilen übersprungen. Das eigentliche Einlesen übernimmt der FINDSTR
-Befehl, der wegen "^"
nach allen Zeilen sucht, die einen Anfang haben. Er findet also alle Zeilen.Als Trennzeichen zwischen den einzelnen Bestandteilen (Tokens) einer Zeile wird wegen
delims=:
der Doppelpunkt definiert.Wegen
tokens=2*
wird das Datum der Laufvariablen %%a
zugewiesen und der Dateiname inkl. Pfad der automatisch erzeugten Laufvariablen %%b
.In beiden Fällen enthalten die Laufvariablen aber noch führende (und nachfolgende) Leerzeichen. Die würden vor allem bei der Ermittelung der Dateigröße zu einem Fehler führen und außerdem das Layout der Tabelle unschön machen.
Die Leerzeichen um das Datum werden von der
FOR
-Schleife in den Zeilen 21 bis 24 entfernt und nur der Datums-String an die Laufwariable %%i
zugewiesen.Die
FOR
-Schleife in den Zeilen 26 bis 29 entfernt die führenden Leerzeichen des Dateipfades/-namens und ermittelt wegen dem ~nx
in set "String=%%~nxi"
den Namen inkl. Erweiterung der Datei.Die
FOR
-Schleife in den Zeilen 31 bis 34 entfernt auch die führenden Leerzeichen des Dateipfades/-namens und ermittelt wegen dem ~z
in set "String=%%~zi"
die Größe der Datei.Das Unterprogramm
ConcatString
, was aus allen diesen FOR
-Schleifen aufgerufen wird, hat als ersten Parameter die Breite der jeweiligen Tabellenspalte (beim Datum also 12, beim Dateinamen 51 und bei der Dateigröße 16 Zeichen). Der zweite Parameter gibt an, ob der Wert linksbündig (zweiter Parameter gleich 0) oder rechtsbündig (zweiter Parameter gleich 1) ausgegeben werden soll. Bei der Dateigröße ist die rechtsbündige Ausgabe sinnvoll, deshalb das call :ConcatString 16 1
in Zeile 33.Im Unterprogramm
ConcatString
wird in den Zeilen 45 und 46 die Länge des auszugebenden Strings ermittelt und mit diesem Wert berechnet, wie viele Leerzeichen ergänzt werden müssen, um die Tabellenspalte auf die gewünschte Breite (enthalten im Parameter %1) aufzufüllen. Dazu wird eine Hilfsdatei verwendet, die in Zeile 47 wieder gelöscht wird. Da alleine die Erklärung dieser zwei Zeilen eine halbe DIN A4 Seite füllen würde, möge der geneigte Leser die genaue Funktionsweise unter Zuhilfenahme der Hilfe von FINDSTR
, seines analytischen Verstandes und dem Betrachten der erzeugten Hilfsdatei in einem (Hex-)Editor selbst herausfinden .In den Zeilen 49 bis 52 wird eine Variable erzeugt, die aus der berechneten Anzahl von Leerzeichen besteht. Da hierfür die verzögerte Variablenerweiterung benötigt wird, wird diese in Zeile 49 eingeschaltet und in Zeile 52 wieder ausgeschaltet. Um die erzeugte Variable
Space
außerhalb dieses Blocks zur Verfügung zu haben, muss in der Zeile mit dem ENDLOCAL
-Befehl, mit diesem durch den Operator &
verkettet, die Zuweisung set "Space=%Space%"
stehen. Genaueres dazu findet man in diesem Thread und in diesem Tutorial von Benutzer pieh-ejdsch.In den Zeilen 54 und 55 wird der Inhalt einer Zeile in der Ausgabedatei zusammengebaut (die Variable
Line
wird verlängert), in Abhängigkeit des Parameters %2 werden die eben erzeugten Leerzeichen vor (Zeile 55, rechtsbündig) oder nach (Zeile 54, linksbündig) dem Wert der aktuellen Tabellenspalte eingefügt.Nachdem eine Zeile der Ausgabedatei komplett erzeugt wurde, wird in Zeile 36 das Unterprogramm
OutputLine
aufgerufen.Die Ausgabe erfolgt in Zeile 61 über eine
FOR
-Schleife, da beim Ausgeben von Laufvariablen der FOR
-Schleife Sonderzeichen wie %
, &
, ^
keine Probleme machen (für die Experten: Bei Verwendung von verzögerter Variablenerweiterung macht die Kombination ^!
Probleme). Danach wird in Zeile 62 die Variable Line
wieder gelöscht, damit beim nächsten Durchlauf der Hauptschleife (Zeilen 20 bis 37) wieder mit einer leeren Puffervariablen begonnen werden kann.Da die Zeilen 13 bis 38 einen in Klammern eingeschlossenen Block bilden, werden sämtliche Ausgaben, auch im Unterprogramm
OutputLine
, mit >"%OutputFile%"
in Zeile 38 in die Ausgabedatei umgeleitet.Ausführliche Informationen zu
FOR
-Schleife liefert mein Tutorial zur FOR-Schleife.[/EDIT]
[OT] @Friemler
These 1: Das Einsparen von Kommentarzeilen in Skripten hat keinen positiven Einfluss auf die Entwicklungszeit.
These 2: Wenn ein "exit /b" statt des vorgesehenen "goto :eof" zwar funktioniert, aber über keine Suchmaschine dieser Galaxie als Abschlussmarke eines geCALLten Batch-Unterprogrammblocks erklärt wird, dann erleichtert es die Les- und Nachvollziehbarkeit für Wochenendskripter nicht.
Es gibt immer wieder Beiträge, bei denen mir der Begriff "selbst verursachte Leiden" durch den Kopf schiesst...
Grüße
Biber
[/OT]
These 1: Das Einsparen von Kommentarzeilen in Skripten hat keinen positiven Einfluss auf die Entwicklungszeit.
These 2: Wenn ein "exit /b" statt des vorgesehenen "goto :eof" zwar funktioniert, aber über keine Suchmaschine dieser Galaxie als Abschlussmarke eines geCALLten Batch-Unterprogrammblocks erklärt wird, dann erleichtert es die Les- und Nachvollziehbarkeit für Wochenendskripter nicht.
Es gibt immer wieder Beiträge, bei denen mir der Begriff "selbst verursachte Leiden" durch den Kopf schiesst...
Grüße
Biber
[/OT]
[OT] @Biber
Zu These 1:
Der TO hat selbst Code gepostet, der nicht den Eindruck machte, er sei völlig ahnungslos. Nachfragen zum Code beantworte ich gerne, vorausgesetzt dass der Fragesteller auch etwas Eigeninitiative zeigt und die
Zu These2:
Wenn ich bei Google nach "batch exit /b" suche, erhalte ich als erstes Suchergebnis die sehr gute Seite von Rob van der Woude, wo genau das erklärt wird. Deine Aussage erschien mir auch sehr unwahrscheinlich.
Um selbst verursachte Leiden zu vermeiden, müsste ich dem Forum den Rücken kehren. Es gibt eben Dinge, die man hinnehmen muss.
Gruß
Friemler
[OT]
Zu These 1:
Der TO hat selbst Code gepostet, der nicht den Eindruck machte, er sei völlig ahnungslos. Nachfragen zum Code beantworte ich gerne, vorausgesetzt dass der Fragesteller auch etwas Eigeninitiative zeigt und die
brain.exe
gestartet hat . Und das jemand eine solche Nachfrage stellen könnte, wäre mir im Traum nicht eingefallen; ich hätte sowieso keinen Kommentar für diesen Fall eingebaut.Zu These2:
Wenn ich bei Google nach "batch exit /b" suche, erhalte ich als erstes Suchergebnis die sehr gute Seite von Rob van der Woude, wo genau das erklärt wird. Deine Aussage erschien mir auch sehr unwahrscheinlich.
Um selbst verursachte Leiden zu vermeiden, müsste ich dem Forum den Rücken kehren. Es gibt eben Dinge, die man hinnehmen muss.
Gruß
Friemler
[OT]
Och Friemler,
Und ehrlich, mit
Ausserdem - ja hey! Es waren doch nur zwei Thesen. Unbewiesene Behauptungen. Mehr nicht.
Wenn ich Glaubenskriege hätte auslösen wollen, dann hätte ich 99 davon an irgendeine Kirchentür getackert.
Hier sollte es wirklich nur eine Randmerkung ohne unmittelbar abzuleitenden Handlungsbedarf sein.
Dennoch vielen Dank für deine Mühe.
Schönes Wochenende
Biber
Zitat von @Friemler:
[OT]@Biber
Erklärung zum Script nachgeliefert. Die These mit der Zeitersparnis hat sich auch hier nicht bewahrheitet .
Gruß
Friemler
[/OT]
Ich wollte dich doch mit meiner kleinen Randbemerkung nicht zu unbezahlter Wochenendarbeit anstiften.[OT]@Biber
Erklärung zum Script nachgeliefert. Die These mit der Zeitersparnis hat sich auch hier nicht bewahrheitet .
Gruß
Friemler
[/OT]
Und ehrlich, mit
These 1: Das Einsparen von Kommentarzeilen in Skripten hat keinen positiven Einfluss auf die Entwicklungszeit.
...meinte ich wirklich so kleine Kommentare wie "REM hier Rücksprung zur CALLing-Zeile".Ausserdem - ja hey! Es waren doch nur zwei Thesen. Unbewiesene Behauptungen. Mehr nicht.
Wenn ich Glaubenskriege hätte auslösen wollen, dann hätte ich 99 davon an irgendeine Kirchentür getackert.
Hier sollte es wirklich nur eine Randmerkung ohne unmittelbar abzuleitenden Handlungsbedarf sein.
Dennoch vielen Dank für deine Mühe.
Schönes Wochenende
Biber
Wow, CCED,
vielen Dank auch dir für deine Mühen!
Vorhin hatte ich es zwischendurch schon bereut, meinen OffTopic-Kommentar hier abgestellt zu haben, weil sich Friemler wohl ein bisschen anden Ei^H^H an der Ehre gepackt fühlte,
Jetzt allerdings, wenn ich überlege, dass der Beitrag ohne meinen Zwischenruf wohl um 14:40h beendet gewesen wäre...
--> So gefällt es mir wesentlich besser.
Ich werde eine entsprechende Bewertung vergeben.
Schönes Wochenende auch dir
Biber
P.S. Wochenendskripter wie du sind hier auf Herzlichste willkommen.
vielen Dank auch dir für deine Mühen!
Vorhin hatte ich es zwischendurch schon bereut, meinen OffTopic-Kommentar hier abgestellt zu haben, weil sich Friemler wohl ein bisschen an
Jetzt allerdings, wenn ich überlege, dass der Beitrag ohne meinen Zwischenruf wohl um 14:40h beendet gewesen wäre...
--> So gefällt es mir wesentlich besser.
Ich werde eine entsprechende Bewertung vergeben.
Schönes Wochenende auch dir
Biber
P.S. Wochenendskripter wie du sind hier auf Herzlichste willkommen.
Hallo CCED,
auch von mir: Respect!
Ein Script von ca. 700 Zeilen zu schreiben und dabei den Überblick über die verschiedenen Ablaufpfade zu behalten ist schon eine reife Leistung für einen "Wochenendscripter". Du benutzt auch öfter fortgeschrittenere Techniken (z.B.
Und das wichtigste ist: Deine Frage war für mich die größte Herausforderung hier im Forumsbereich "Batch & Shell" in den letzten zwei bis drei Wochen, deshalb werde ich (zum ersten mal überhaupt) auch eine entsprechende Bewertung vergeben.
Den "grünen Haken" hat wohl Biber schon gesetzt, jedenfalls ist er vorhanden. Um das selbst zu erledigen, musst Du unter Deinem Beitrag auf "Bearbeiten" klicken, bis ans Ende der Seite scrollen und den Haken bei "Diese Frage gilt als gelöst" setzen.
@Biber:
Auch wenn es evtl. anders rübergekommen ist - ich war zu keinem Zeitpunkt irgendwie ungehalten bzgl. Deines Kommentars, da braucht Dir nichts leid tun.
Schönes WE an alle
Friemler
auch von mir: Respect!
Ein Script von ca. 700 Zeilen zu schreiben und dabei den Überblick über die verschiedenen Ablaufpfade zu behalten ist schon eine reife Leistung für einen "Wochenendscripter". Du benutzt auch öfter fortgeschrittenere Techniken (z.B.
FOR
-Schleifen, Inline-VBScript). Auch wenn es da noch die eine oder andere Möglichkeit zur Optimierung gäbe - das sind eher Kleinigkeiten, die der Erwähnung nicht wirklich Wert sind oder zwar die Anzahl der Zeilen verringern aber nicht unbedingt die Verständlichkeit erhöhen würden.Und das wichtigste ist: Deine Frage war für mich die größte Herausforderung hier im Forumsbereich "Batch & Shell" in den letzten zwei bis drei Wochen, deshalb werde ich (zum ersten mal überhaupt) auch eine entsprechende Bewertung vergeben.
Den "grünen Haken" hat wohl Biber schon gesetzt, jedenfalls ist er vorhanden. Um das selbst zu erledigen, musst Du unter Deinem Beitrag auf "Bearbeiten" klicken, bis ans Ende der Seite scrollen und den Haken bei "Diese Frage gilt als gelöst" setzen.
@Biber:
Auch wenn es evtl. anders rübergekommen ist - ich war zu keinem Zeitpunkt irgendwie ungehalten bzgl. Deines Kommentars, da braucht Dir nichts leid tun.
Schönes WE an alle
Friemler