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

Wie kann ich eine Textdatei Zeile für Zeile Auslesen?

Frage Entwicklung Batch & Shell

Mitglied: 58378

58378 (Level 1)

03.12.2007, aktualisiert 18.10.2012, 5094 Aufrufe, 7 Kommentare

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:

01.
echo  ?                                                                                               ?
soll dann so aussehen

01.
echo  ?      Ordner1                                                                                  ? 
02.
echo  ?      Ordner2                                                                                  ? 
03.
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!)

01.
echo  ?      Oner1                                                                                    ? 
02.
echo  ?      Ordner2                                                                                  ? 
03.
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:
http://www.administrator.de/frage/batch-textdatei-zeilenweise-auslesen- ...
Mitglied: TuXHunt3R
03.12.2007 um 21:35 Uhr
Hier schon mal die Online-Hilfe von dir in Deutsch. Batch folgt (ausser der Biber oder bastla sind wieder schneller als ich)

01.
Listet die Dateien und Unterverzeichnisse eines Verzeichnisses auf. 
02.
 
03.
DIR [Laufwerk:][Pfad][Dateiname] [/A[[:]Attribute]] [/B] [/C] [/D] [/L] [/N] 
04.
  [/O[[:]Folge]] [/P] [/Q] [/S] [/T[[:]Zeit]] [/W] [/X] [/4] 
05.
 
06.
  [Laufwerk:][Pfad][Dateiname] 
07.
             Bezeichnet Laufwerk, Verzeichnis und/oder Dateien. 
08.
 
09.
  /A         Listet Dateien mit angegebenen Attributen auf. 
10.
  Attribute   D Verzeichnisse        R Schreibgeschützte Dateien 
11.
              H Versteckte Dateien   A Zu archivierende Dateien 
12.
              S Systemdateien        - vorangestellt kehrt die Bedeutung um 
13.
  /B         Einfaches Format (keine Kopfdaten, keine Zusammenfassung). 
14.
  /C         Zeigt das Tausendertrennzeichen bei Dateigrößen an (Standard- 
15.
             einstellung). Verwenden Sie /-C, um das Tausendertrennzeichen 
16.
             nicht anzuzeigen. 
17.
  /D         Gleich wie Breitformat, jedoch nach Spalten sortiert. 
18.
  /L         Verwendet Kleinschreibung. 
19.
  /N         Neues, langes Listenformat (Dateinamen auf der rechten Seite). 
20.
  /O         Gibt die Liste sortiert aus. 
21.
  Folge       N Name (alphabetisch)           S Größe (kleinere zuerst) 
22.
              E Erweiterung (alphabetisch)    D Datum/Zeit (ältere zuerst) 
23.
              G Verzeichnisse zuerst          - vorangestellt kehrt die 
24.
                                                Reihenfolge um 
25.
  /P         Pausiert nach jeder vollen Bildschirmseite. 
26.
  /Q         Gibt den Besitzer der Datei aus. 
27.
  /S         Listet Dateien und alle Unterverzeichnisse auf. 
28.
  /T         Bestimmt welche Zeit verwendet wird (nur für NTFS). 
29.
  Zeit        C  Erstellung 
30.
              A  Letzter Zugriff 
31.
              W  Letzter Schreibzugriff 
32.
  /W         Verwendet Breitformat für die Auflistung. 
33.
  /X         Zeigt die Kurznamen für Dateien mit Nicht-8Punkt3-Namen an. 
34.
             Das Format ist das gleiche wie bei /N, wobei der Kurzname vor 
35.
             dem Langnamen eingefügt wird. Wenn kein Kurzname vorhanden ist, 
36.
             werden Leerzeichen angezeigt. 
37.
  /4         Zeigt das Jahr vierstellig an. 
38.
 
39.
Optionen können in der Umgebungsvariablen DIRCMD voreingestellt werden. 
40.
"-" vor einer Option setzt die Voreinstellung außer Kraft, z. B. DIR /-W.
Bitte warten ..
Mitglied: TuXHunt3R
03.12.2007 um 21:44 Uhr
OK, hier mal eine erste Version:

01.
@echo off 
02.
 
03.
dir /b C:\Windows >C:\dirlog.txt 
04.
 
05.
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:
01.
@echo off 
02.
 
03.
dir /b /a:d C:\Windows >C:\dirlog.txt 
04.
 
05.
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....
Bitte warten ..
Mitglied: bastla
03.12.2007 um 23:20 Uhr
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:
01.
@echo off & setlocal 
02.
set "Source=D:\Test" 
03.
set "List=D:\DirList.txt" 
04.
 
05.
if exist "%List%" del "%List%" 
06.
set "Blanks=                                                                               " 
07.
 
08.
for /f "delims=" %%i in ('dir /s /b /ad "%Source%"') do set "Line=%%i%Blanks%" & call :ProcessLine 
09.
goto :eof 
10.
 
11.
:ProcessLine 
12.
set "Line=%Line:~0,77% 
13.
echo ?%Line:&=^&%?>>"%List%" 
14.
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. [/Edit]
Bitte warten ..
Mitglied: Biber
04.12.2007 um 09:24 Uhr
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
Bitte warten ..
Mitglied: 58378
04.12.2007 um 17:41 Uhr
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?
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:
01.
@echo off & setlocal 
02.
mode con: Cols=100 Lines=50 && Color f1 
03.
 
04.
dir /b /a:d .\skins >.\dir.txt 
05.
 
06.
for /f %%a IN (.\dir.txt) do echo  º      %%a                                                                                º 
07.
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

Idee 1:
01.
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 ?
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

01.
@echo off & setlocal 
02.
mode con: Cols=100 Lines=50 && Color f1 
03.
set "Source=.\Skins" 
04.
set "List=.\DirList.txt" 
05.
 
06.
if exist "%List%" del "%List%" 
07.
set "Blanks=                                                                                " 
08.
 
09.
for /f "delims=" %%i in ('dir /s /b /ad "%Source%"') do set "Line=%%i%Blanks%" & call :ProcessLine 
10.
goto :eof 
11.
 
12.
:ProcessLine 
13.
set "Line=%Line:0,77% 
14.
echo º%Line:&=^&%º>>"%List%" 
15.
goto :eof 
16.
 
17.
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

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

edit:
<zitat> geht ja nicht Hab mir zu helfen gewusst!
Bitte warten ..
Mitglied: bastla
04.12.2007, aktualisiert 18.10.2012
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
Bitte warten ..
Mitglied: 58378
04.12.2007 um 19:54 Uhr
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!
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Installation
gelöst Mit Powershell in einer Datei eine Zeile auslesen (6)

Frage von Bommi1961 zum Thema Installation ...

Batch & Shell
Per Batch Textdatei Spaltenweise auslesen nochmal weil ich dumm bin (9)

Frage von PinkFLuffyUnicorn zum Thema Batch & Shell ...

Batch & Shell
Batch Textdatei Spaltenweise auslesen (7)

Frage von PinkFLuffyUnicorn zum Thema Batch & Shell ...

Batch & Shell
gelöst BATCH: Daten aus Textdatei auslesen und in neue Textdatei separieren (9)

Frage von Manuel1234 zum Thema Batch & Shell ...

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