58378
Goto Top

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:

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

Content-Key: 75118

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

Printed on: April 16, 2024 at 17:04 o'clock

Member: TuXHunt3R
TuXHunt3R Dec 03, 2007 at 20:35:28 (UTC)
Goto Top
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.  
Member: TuXHunt3R
TuXHunt3R Dec 03, 2007 at 20:44:04 (UTC)
Goto Top
OK, hier mal eine erste Version:

@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....
Member: bastla
bastla Dec 03, 2007 at 22:20:08 (UTC)
Goto Top
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:
@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
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. face-wink [/Edit]
Member: Biber
Biber Dec 04, 2007 at 08:24:23 (UTC)
Goto Top
Moin FlexxxV,

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
Mitglied: 58378
58378 Dec 04, 2007 at 16:41:38 (UTC)
Goto Top
Neeein!
Jetzt tipp ich über 30 min an meiner antwort herum und dann um sicher zugehen dass sie nicht verloren geht will ich alles makieren und kopieren (Strg + a, Strg + C) Drück aber Strg + E (Spanisches XP und normalerwise makiert man so hier benutze jedoch den Feuer Fuchs und da kommt man mit Strg + A auf die Startseite... Antwort adee!

Nochmal alles: (wahrscheinlich kürzer):
Als erstes:
Hab ich was irgendwo von Unterordnern geschrieben? face-wink
Nicht das ich wüsste!
Ich möchte nur "dir /b" oder die Idiotensichere Variante "dir /b /a:d" (falls irgendwer meint in den Skin Ordner Dateien Reinzu packen statt ordner!)

Jetzt meine erklärung was ich warum brauch:
Ich bastele ne Batch um Ceedo mitneuen skins zu belegen.
Das "Skin Format" ist ein Ordner mit Bilddateien.
man soll verschiedene skins an hand der Ordnerauflistung auswählen können. (meine Idee war/ist man tippt den Ordnernamen ein und der wird dann an das programm zum patchen der DLL weitergegeben (kein problem). Anzeigeplatz ist für 20 Skins (also 20 Ordner)(Mehr dürft man nicht brauchen!).

Ich hab mir mal das folgende zusammen gebastelt:
@echo off & setlocal
mode con: Cols=100 Lines=50 && Color f1

dir /b /a:d .\skins >.\dir.txt

for /f %%a IN (.\dir.txt) do echo  º      %%a                                                                                º
pause
nicht wegen den º wundern die werden in dr kommandozeile als ? angezeigt. (Hab erst in notepad++ getippt und dann das in edit.com eingefügt (zur konvertierung))

Das ganze funktioniert ja super!
Nur leider müssen die Dateinamen exact 10 Zeichen haben face-sad

Idee 1:
kurz      
also man füllt den Ordnernamen mit MS Dos Leerzeichen (oder wie heisst das?) auf. ich meine das Strg + 255 Zeichen. Das würde man ja nicht sehen.
Problem 1:
Weiss nicht ob ich zu doof bin aber ich komm nicht in diese Ordner per cd rein! (auch mit ""nicht...)
Problem2:
Ich wollte eigentlich dass der Benutzer den Namen eintippt (wird dann an eine Variable gegeben) das geht ja dann nicht mehr (soll der arme user en etwa abzählen? Nein! nicht zumutbar!)
Idee 2:
Vorweg kommt 1), 2) usw und der Benutzer muss die Zahl eintippten
Problem 1:
dynamisches anzeigen von 1), 2)
eigeschränkte Lösung:
nicht dynamisch sondern einfach immer von 1-20 anzeigen lassen (mehr platz hat mein prgramm nicht)
problem 2 wie krieg ich es hin, dass im falle von eins Ordner1 in meine Variable geschrieben wird?

Also gaaanz viele Fragenagen :P

So jetzt kümmere ich mich um Fragen im den Posts:


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.


Ich will gar nicht | sondern ? face-wink
Maskieren muss ich ja nur |<> usw aber trotzdem Danke!

& Zeichen kommt dann einfach nicht vor in den Ordnernamen! :D

Das script von bastla hab ich auch mal editiert ab das geht einfach nicht face-sad

@echo off & setlocal
mode con: Cols=100 Lines=50 && Color f1
set "Source=.\Skins"  
set "List=.\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

pause

ist irgenwie umständlicher! und geht nicht :P

Biber du verwirsst mich :D


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.


Da ich das nicht verstanden hab, habe ich gaaanz viele Ordner angelegtund hab irgendwie nicht so dass problem nach 20 gesehen... (endlich weiss ich wo für %random% gut zu gebrauchen ist!)

ausserdem passen bei mir nur 20 Ordner hin (keine Unterordner hab ich nie was von geschrieben!)


Und Du brauchst einen Zwischenschritt zur Längenermittlung.

wie es geht jetzt doch mit verschiedenen langen ordnernamen?
oder welche Länge willst du?

die grösse ist wie folgt fest:
mode con: Cols=100 Lines=50

und halt nur 20 Skins das reicht! (wer mehr reinpackt ruiniert dann eben mein "Design"9
und keine unterordner face-wink

Daanke schon mal!
Ach kann mir jemand die ausgabe von "for /?" posten?

edit:
<zitat> geht ja nicht face-sad Hab mir zu helfen gewusst!
Member: bastla
bastla Dec 04, 2007, updated at Oct 18, 2012 at 16:32:45 (UTC)
Goto Top
Hallo FlexxxV!

Das script von bastla hab ich auch mal editiert ...
... und geht nicht :P
Bist Du sehr sparsam, oder aus welchem Grund hast Du "~" weggelassen?

Hier findest Du auch noch etwas zum Editieren ...

Grüße
bastla
Mitglied: 58378
58378 Dec 04, 2007 at 18:54:12 (UTC)
Goto Top
Uups!
das ist doch ein wenig länger als gedacht! (For /?)
@Biber Danke für die PM!

Das andere Scrpt schau ich mir mal an!

Ich finde dieses Forum ist fast ein Chat! face-wink