58378
Dec 03, 2007, updated at Oct 18, 2012 (UTC)
5623
7
0
Wie kann ich eine Textdatei Zeile für Zeile Auslesen?
Ich schreibe momentan eine kleine Batch Datei mit etwas GUI ähnlichem. Ich möchte jetzt eine Ordnerauflistung machen (nur "dir /b" den Rest brauche ich nicht) und diese Hübsch pro Zeile
in so etwas packen:
soll dann so aussehen
leider werden nicht alle Ordner die gleiche länge haben also wird es eher so sein sollen (Wenn nicht möglich könnte ich zu not auch die Ordner länge fest setzen. Würde ich aber sehr ungehrn tun!)
Meine Idee ist jetzt die Ordnerauflistung (eig ja Dateiauflistung aber im Orner werden nur Odner sein) "dir /b" per "dir /b > Liste.txt zu exportieren und dann diese Datei zeile für Zeile auszulesen (weiss nicht wie ich das machen kann) und jeweils eine neue Zeile schreiben mit "? " + Ordner + " ?". Leider hab ich noch keine Idee wie ich die verschiedenen Ordnerlängen kompensieren kann.
"Ich hoffe jemand von den Batchprofies" kann mir helfen!
Leider muss ich mit einem Spanischem XP arbeiten (bin gerade in Bolivien) und krieg die Infos zu Befehlen schön auf Spanisch angezeigt (meine z.B.: "dir /?")und mein Spanisch ist alles andere als perfekt. Desswegen bitte kurz (falls möglich die Schalterchen erklären) und / oder die gesamte Batch :P
Bedanke mich jetzt schon mal!
Werdemich aber garantiert noch mal melden!
Ich merk gerade:
Es gibt einen sehr ähnlichen Tread! (voher ewig gegoogled und hab gedacht so was wollt noch niemand) Naja meine Frage ist ja noch nicht komplett gelöst und werde mal schauenin wie fern mir dieser Tread hilft:
Batch- Textdatei Zeilenweise auslesen
in so etwas packen:
echo ? ?
soll dann so aussehen
echo ? Ordner1 ?
echo ? Ordner2 ?
echo ? Ordner3 ?
leider werden nicht alle Ordner die gleiche länge haben also wird es eher so sein sollen (Wenn nicht möglich könnte ich zu not auch die Ordner länge fest setzen. Würde ich aber sehr ungehrn tun!)
echo ? Oner1 ?
echo ? Ordner2 ?
echo ? Ordners3 ?
Meine Idee ist jetzt die Ordnerauflistung (eig ja Dateiauflistung aber im Orner werden nur Odner sein) "dir /b" per "dir /b > Liste.txt zu exportieren und dann diese Datei zeile für Zeile auszulesen (weiss nicht wie ich das machen kann) und jeweils eine neue Zeile schreiben mit "? " + Ordner + " ?". Leider hab ich noch keine Idee wie ich die verschiedenen Ordnerlängen kompensieren kann.
"Ich hoffe jemand von den Batchprofies" kann mir helfen!
Leider muss ich mit einem Spanischem XP arbeiten (bin gerade in Bolivien) und krieg die Infos zu Befehlen schön auf Spanisch angezeigt (meine z.B.: "dir /?")und mein Spanisch ist alles andere als perfekt. Desswegen bitte kurz (falls möglich die Schalterchen erklären) und / oder die gesamte Batch :P
Bedanke mich jetzt schon mal!
Werdemich aber garantiert noch mal melden!
Ich merk gerade:
Es gibt einen sehr ähnlichen Tread! (voher ewig gegoogled und hab gedacht so was wollt noch niemand) Naja meine Frage ist ja noch nicht komplett gelöst und werde mal schauenin wie fern mir dieser Tread hilft:
Batch- Textdatei Zeilenweise auslesen
Please also mark the comments that contributed to the solution of the article
Content-Key: 75118
Url: https://administrator.de/contentid/75118
Printed on: April 24, 2024 at 10:04 o'clock
7 Comments
Latest comment
Hier schon mal die Online-Hilfe von dir in Deutsch. Batch folgt (ausser der Biber oder bastla sind wieder schneller als ich)
Listet die Dateien und Unterverzeichnisse eines Verzeichnisses auf.
DIR [Laufwerk:][Pfad][Dateiname] [/A[[:]Attribute]] [/B] [/C] [/D] [/L] [/N]
[/O[[:]Folge]] [/P] [/Q] [/S] [/T[[:]Zeit]] [/W] [/X] [/4]
[Laufwerk:][Pfad][Dateiname]
Bezeichnet Laufwerk, Verzeichnis und/oder Dateien.
/A Listet Dateien mit angegebenen Attributen auf.
Attribute D Verzeichnisse R Schreibgeschützte Dateien
H Versteckte Dateien A Zu archivierende Dateien
S Systemdateien - vorangestellt kehrt die Bedeutung um
/B Einfaches Format (keine Kopfdaten, keine Zusammenfassung).
/C Zeigt das Tausendertrennzeichen bei Dateigrößen an (Standard-
einstellung). Verwenden Sie /-C, um das Tausendertrennzeichen
nicht anzuzeigen.
/D Gleich wie Breitformat, jedoch nach Spalten sortiert.
/L Verwendet Kleinschreibung.
/N Neues, langes Listenformat (Dateinamen auf der rechten Seite).
/O Gibt die Liste sortiert aus.
Folge N Name (alphabetisch) S Größe (kleinere zuerst)
E Erweiterung (alphabetisch) D Datum/Zeit (ältere zuerst)
G Verzeichnisse zuerst - vorangestellt kehrt die
Reihenfolge um
/P Pausiert nach jeder vollen Bildschirmseite.
/Q Gibt den Besitzer der Datei aus.
/S Listet Dateien und alle Unterverzeichnisse auf.
/T Bestimmt welche Zeit verwendet wird (nur für NTFS).
Zeit C Erstellung
A Letzter Zugriff
W Letzter Schreibzugriff
/W Verwendet Breitformat für die Auflistung.
/X Zeigt die Kurznamen für Dateien mit Nicht-8Punkt3-Namen an.
Das Format ist das gleiche wie bei /N, wobei der Kurzname vor
dem Langnamen eingefügt wird. Wenn kein Kurzname vorhanden ist,
werden Leerzeichen angezeigt.
/4 Zeigt das Jahr vierstellig an.
Optionen können in der Umgebungsvariablen DIRCMD voreingestellt werden.
"-" vor einer Option setzt die Voreinstellung außer Kraft, z. B. DIR /-W.
OK, hier mal eine erste Version:
Das Problem hier ist noch, dass aufgrund der unterschiedlichen Dateipfad auf der rechten Seite keine schöne Linie entsteht. Du musst ausserdem noch die Pfade für das Logfile und für den abzufragenden Ordner anpassen.
Wenn du nur Ordner und keine Dateien anzeigen willst, sieht das Script so aus:
Edit:
Coderklärung:
Mit dem Parameter /a:d werden nur Verzeichnisse angezeigt, mit >C:\dirlog.txt wird die Ausgabe des dir-Befehls in das Textfile C:\dirlog.txt umgeleitet. Durch das > wird die TXT-Datei jeweils überschrieben.
Beim FOR-Befehl wird für jede Zeile der Textdatei der Befehl " echo ^|^| Zeileninhalt " abgearbeitet. Die |-Zeichen müssen mit vorangestelltem ^-Zeichen geschrieben werden, da die CMD-Konsole sonst denkt, du willst die Ausgabe des echo-Befehls per Pipe an einen zweiten Befehl weitergeben.
Edit 2:
An Biber und bastla: Hurra, ich war zumindest einmal schneller :D
Edit 3:
@ FlexxxV
Ich persönlich sehe keine andere Möglichkeit, als eine feste Ordnernamenlänge zu verwenden, wenn du auf der rechten Seite auch eine solche Linie haben willst. Ob es sich wirklich lohnt, für das bisschen grafische Spielerei eine ganze Ladung Ordner um zu benennen, musst du entscheiden. Ich würde mir die Mühe nicht machen....
@echo off
dir /b C:\Windows >C:\dirlog.txt
for /f %%a IN (C:\dirlog.txt) do echo ^|^| %%a
Das Problem hier ist noch, dass aufgrund der unterschiedlichen Dateipfad auf der rechten Seite keine schöne Linie entsteht. Du musst ausserdem noch die Pfade für das Logfile und für den abzufragenden Ordner anpassen.
Wenn du nur Ordner und keine Dateien anzeigen willst, sieht das Script so aus:
@echo off
dir /b /a:d C:\Windows >C:\dirlog.txt
for /f %%a IN (C:\dirlog.txt) do echo ^|^| %%a
Edit:
Coderklärung:
Mit dem Parameter /a:d werden nur Verzeichnisse angezeigt, mit >C:\dirlog.txt wird die Ausgabe des dir-Befehls in das Textfile C:\dirlog.txt umgeleitet. Durch das > wird die TXT-Datei jeweils überschrieben.
Beim FOR-Befehl wird für jede Zeile der Textdatei der Befehl " echo ^|^| Zeileninhalt " abgearbeitet. Die |-Zeichen müssen mit vorangestelltem ^-Zeichen geschrieben werden, da die CMD-Konsole sonst denkt, du willst die Ausgabe des echo-Befehls per Pipe an einen zweiten Befehl weitergeben.
Edit 2:
An Biber und bastla: Hurra, ich war zumindest einmal schneller :D
Edit 3:
@ FlexxxV
Ich persönlich sehe keine andere Möglichkeit, als eine feste Ordnernamenlänge zu verwenden, wenn du auf der rechten Seite auch eine solche Linie haben willst. Ob es sich wirklich lohnt, für das bisschen grafische Spielerei eine ganze Ladung Ordner um zu benennen, musst du entscheiden. Ich würde mir die Mühe nicht machen....
Hallo FlexxxV!
Damit es an beiden Seiten Begrenzungen gibt, musst Du natürlich eine fixe Zeilenlänge festlegen. Wenn Du von den Defaulteinstellungen ausgehst, wäre bei einer Fensterbreite von 80 Zeichen eine Zeilenlänge von 79 sinnvoll (da dann noch kein Umbruch erfolgt). Zum Auffüllen zu kurzer Zeilen benötigst Du jede Menge Blanks (zumindest 76, wenn Du je ein Randzeichen und eine Namenslänge von wenigstens 1 Zeichen berücksichtigst).
Damit ließe sich etwa folgender Batch fabrizieren:
Das Unterprogramm ":ProcessLine" ist erforderlich, um die in der "for"-Schleife erstellte Zeile auf die gewünschte Länge zu kürzen, ohne "delayedexpansion" verwenden zu müssen. (Letztere hat die unangenehme Eigenschaft, einzelne in Dateinamen enthaltene "!" zu schlucken und paarweise vorkommende "!" samt dem dazwischen stehenden Teil dem Nirwana zu überantworten.)
Ein echtes "Problemzeichen" ist ein im Namen/Pfad enthaltenes "&" - um es korrekt angezeigt und nicht als "Befehlsverkettungsanweisung" interpretiert zu bekommen, muss es mit "^" maskiert werden (analog zur von TuXHunT3R verwendeten Vorgangsweise für "|"). Die Maskierung wird durch eine Ersetzung ("^&" für "&") bei der Ausgabe vorgenommen.
Grüße
bastla
[Edit] @TuXHunt3R: Freut mich, wenn es Dich freut. [/Edit]
Damit es an beiden Seiten Begrenzungen gibt, musst Du natürlich eine fixe Zeilenlänge festlegen. Wenn Du von den Defaulteinstellungen ausgehst, wäre bei einer Fensterbreite von 80 Zeichen eine Zeilenlänge von 79 sinnvoll (da dann noch kein Umbruch erfolgt). Zum Auffüllen zu kurzer Zeilen benötigst Du jede Menge Blanks (zumindest 76, wenn Du je ein Randzeichen und eine Namenslänge von wenigstens 1 Zeichen berücksichtigst).
Damit ließe sich etwa folgender Batch fabrizieren:
@echo off & setlocal
set "Source=D:\Test"
set "List=D:\DirList.txt"
if exist "%List%" del "%List%"
set "Blanks= "
for /f "delims=" %%i in ('dir /s /b /ad "%Source%"') do set "Line=%%i%Blanks%" & call :ProcessLine
goto :eof
:ProcessLine
set "Line=%Line:~0,77%
echo ?%Line:&=^&%?>>"%List%"
goto :eof
Ein echtes "Problemzeichen" ist ein im Namen/Pfad enthaltenes "&" - um es korrekt angezeigt und nicht als "Befehlsverkettungsanweisung" interpretiert zu bekommen, muss es mit "^" maskiert werden (analog zur von TuXHunT3R verwendeten Vorgangsweise für "|"). Die Maskierung wird durch eine Ersetzung ("^&" für "&") bei der Ausgabe vorgenommen.
Grüße
bastla
[Edit] @TuXHunt3R: Freut mich, wenn es Dich freut. [/Edit]
Moin FlexxxV,
lieber erst noch mal durchdenken vor dem Drauflostippseln..
Ja. Wenn. Da Du aber nach spätestens nach den ersten 20 Dateien auf eine Pfad/Dateiangabe stößt, die 144 Zeichen lang ist, müsstest Du (wenn Du das tatsächlich möchtest) die Zeilenbreite abhängig machen von der "längsten" Pfad/Dateinamenskombination.
Auch kein Problem - aber es wird Einfluss auf die Strategie haben.
Du musst dann definitiv trennen zwischen Ermittlung und Sammlung der Informationen (DIR-Angaben) und dem Anzeige-Teil.
Und Du brauchst einen Zwischenschritt zur Längenermittlung.
Und Du solltest dann vorsehen, dass Du mit dem "mode con cols=xxx"-Befehl das Anzeigefenster passend machst.
Von daher sollten wir die Entscheidung "Rahmen am rechten Rand oder nicht" relativ früh ausdiskutieren.
Grüße
Biber
lieber erst noch mal durchdenken vor dem Drauflostippseln..
Wenn Du von den Defaulteinstellungen ausgehst, wäre bei einer Fensterbreite von 80 Zeichen eine Zeilenlänge von 79 sinnvoll...
Ja. Wenn. Da Du aber nach spätestens nach den ersten 20 Dateien auf eine Pfad/Dateiangabe stößt, die 144 Zeichen lang ist, müsstest Du (wenn Du das tatsächlich möchtest) die Zeilenbreite abhängig machen von der "längsten" Pfad/Dateinamenskombination.
Auch kein Problem - aber es wird Einfluss auf die Strategie haben.
Du musst dann definitiv trennen zwischen Ermittlung und Sammlung der Informationen (DIR-Angaben) und dem Anzeige-Teil.
Und Du brauchst einen Zwischenschritt zur Längenermittlung.
Und Du solltest dann vorsehen, dass Du mit dem "mode con cols=xxx"-Befehl das Anzeigefenster passend machst.
Von daher sollten wir die Entscheidung "Rahmen am rechten Rand oder nicht" relativ früh ausdiskutieren.
Grüße
Biber
Hallo FlexxxV!
Hier findest Du auch noch etwas zum Editieren ...
Grüße
bastla
Das script von bastla hab ich auch mal editiert ...
... und geht nicht :P
Bist Du sehr sparsam, oder aus welchem Grund hast Du "~" weggelassen?... und geht nicht :P
Hier findest Du auch noch etwas zum Editieren ...
Grüße
bastla