philosoph
Goto Top

Dateinamen auslesen und in Textdatei ausgeben

Hallo liebes Forum,

der Tommy ist wieder da und hat eine Frage. Ich bin ja mal gespannt, ob jemand tatsächlich schneller ist als Bastler, der Shell-Gott im Forum. face-wink
Ich möchte eine Ordnerstruktur auslesen und jeden gefunden Dateinamen aus der Ordnerstruktur A mit allen Dateinamen der Ordnerstruktur B kombinieren. Das Ergebnis soll in einer TXT ausgegeben werden.
Jetzt die Details: Meine Ordnerstruktur sieht so aus

-Ordnerstruktur A:
|-Ordner3 (Inhalt: M1.jpeg)
|-Ordner6
|-Ordner4
|-Ordner2
|-Ordner5
|-Ordner8


-Ordnerstruktur B:
|-Ordner3 (Inhalt: G2.jpeg, G3.jpg, G6.tiff, G8tif)
|-Ordner6
|-Ordner4
|-Ordner2
|-Ordner5
|-Ordner7

Am Beispiel was das Skript genau macht:
Skript holt sich die Dateienamen aus der Verzeichnisstruktur A und kombiniert die gefundenen Dateinamen jeweils mit den Dateinamen aus Ordnerstruktur B.
Das Ergebnis sollte dann so aussehen:

M1-G2
M1-G3
M1-G6
M1-G8

User Bastla hat mir so etwas ähnliches mal gemacht, aber ich schaffe es leider nicht alleine das Skript für diesen Zweck umzubiegen. face-sad
Hat jemand eine Idee oder Ansätze für mich? Ist das überhaupt über die Shell zu lösen?
Eigentlich muss "nur" die Dateiliste von "Ordner 3" mit der gesamten Dateiliste von Verzeichnisstruktur B kombiniert werden. face-wink
Danach der Inhalt von Ordner6 mit der gesamten "Ordnerstruktur B"...
So, jetzt bin ich gespannt was das alte gute DOS so drauf hat - bzw. der Nachfolger. face-wink

LG
Tommy

Content-Key: 146802

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

Printed on: April 25, 2024 at 10:04 o'clock

Mitglied: 77559
77559 Jul 13, 2010 at 11:18:26 (UTC)
Goto Top
Hallo tommy,

bastla war vor 4 Tagen das letzte Mal aktiv,
fraglich ob er das so schnell mitbekommt.

Aber so ganz klar ist das noch nicht,
  • Ist deine Ordnerstruktur B immer spiegelbildlich zu A?
  • gibt es jeweils nur eine Ordner Ebene oder mehrere?
  • gilt das für alle Dateien oder sind nur betsimmte Extensions zu berücksichtigen?

Gruß
LotPings
Member: Philosoph
Philosoph Jul 13, 2010 at 11:33:06 (UTC)
Goto Top
Hallo LotPings.

Na dann hoffe ich, dass bastla bald wieder online ist. Er war war und ist eine Bereicherung für das Forum!
Und ich denke, mit seinen Erfahrungen kann er hier so einigen weiterhelfen!

Nun zu deinen Fragen:

  • Ist deine Ordnerstruktur B immer spiegelbildlich zu A?
Nein. Die Verzeichnisstruktur ist eine andere. Die beiden Strukturen haben natürlich auch verschiedene Inhalte:
einmal Gerätetemplates (G1.jpeg, G2.JPG, G3.tiff ...) und die zweite Struktur Motive-Templates (M1.jpeg, M2.TIF ...).
Nun soll das Skript sich von jeder Datei aus Verzeichnisstruktur A den Dateinamen M1 schnappen und mit G1, G2, G3... kombieren:
M1-G1
M1-G2
M1-G3
...
...

Wenn das mit dem M1 Dateinamen abgeschlossen ist, soll das Skript mit der nächsten M Datei das selbe fortführen:
M1-G1
M1-G2
M1-G3
M2-G1
M2-G2
M2-G3

  • gibt es jeweils nur eine Ordner Ebene oder mehrere?
Die Ordnerstruktur kann sich tatsächlich in die Tiefe verschachteln.

  • gilt das für alle Dateien oder sind nur betsimmte Extensions zu berücksichtigen?
Es befinden sich tatsächlich verschiedene Formate im Ordner. Es sollen aber nur JPEG, JPG, TIF, TIFF Dateien indexiert und miteinander kombiniert werden.

Danke für deine konkreten Fragen!
LG
Tommy
Member: Philosoph
Philosoph Jul 13, 2010 at 13:43:44 (UTC)
Goto Top
Noch eine Anregung meinerseits:

Das Skript kann auch so arbeiten, dass je Verzeichnisstruktur eine Text-Datei mit dem Verzeichnisbaum-Inhalt angelegt wird.
So können später beide Textdateien (bzw. Dateinamen) je Zeile miteinander kombiniert werden werden.
Das kann dann so aussehen:

Textdatei1:
M1
M2
M3
M4

Textdatei2:
G1
G2
G3
G4

Ergebnis.txt:
M1-G1
M1-G2
M1-G3
M1-G3
Mitglied: 77559
77559 Jul 13, 2010 at 15:00:22 (UTC)
Goto Top
Nö,
die direkte Version ist eigentlich einfacher.
Dieser erste Batch war auch vorhin schon fast fertig, aber dann kam halt was (für mich) wichtigeres dazwischen....

Only braintested (kann man sich nicht immer drauf verlassen face-wink )
@Echo off
Setlocal EnableDelayedExpansion
Set BasisA=D:\Test\projekt\geraete\
Set BasisB=D:\Test\projekt\motive\
Pushd "%BasisA%"  
For /f "delims=" %%A in ('Dir /B /AD') Do Call :CheckFold "%%~fA"  
Echo Habe fertig.
Pause
Popd
Goto :Eof
:CheckFold
Set "GeraeteTemplates=%~1"  
Set "MotiveTemplate=!GeraeteTemplates:%BasisA%=%BasisB%!"  
If Not Exist "%MotiveTemplate%" Goto :Eof  
Pushd "%MotiveTemplate%  
For /F "delims=" %%B in ('Dir /B "%GeraeteTemplates%\*.jpeg"'  
 ) Do For /F "Delims=" %%C in ('Dir /B *.JPEG *.JPG *.TIF *.TIFF' ) Do Echo.%%~nB-%%~nC  
PopD

Gruß
LotPings

Version überarbeitet und getestet, sollte jetzt funktionieren
Member: Philosoph
Philosoph Jul 13, 2010 at 15:06:56 (UTC)
Goto Top
Ahoi!

Was muss ich noch machen, damit mir das Ergebnis ausgegeben wird?
Ich kann zwar deinem Code teilweise folgen, sehe aber hier keine Anweisung für die Ausgabe in einer TXT Datei.

Oder habe ich da etwas übersehen im Code?


LG
Tommy
Mitglied: 77559
77559 Jul 13, 2010 at 15:16:54 (UTC)
Goto Top
Hallo Tommy,

dazu müsstest du in Zeile 19 noch eine Ausgabeumleitung in eine Datei einbauen,
aber hey wir testen das doch gerade erst - hast du denn eine korrekte Ausgabe auf dem Bildschirm?

Gruß
LotPings
Member: Philosoph
Philosoph Jul 13, 2010 at 15:28:46 (UTC)
Goto Top
Hi LotPings!!

Also die Ausgabe auf dem Monitor (cmd) sieht wie folgt aus (@Echo off deaktiviert)

C:\test\Projekt>Setlocal EnableDelayedExpansion
C:\test\Projekt>Set BasisA=c:\test\projekt\geraete\
C:\test\Projekt>Set BasisB=c:\test\projekt\motive\
C:\test\Projekt>Pushd "c:\test\projekt\geraete\"
C:\test\Projekt\geraete>For /F "delims=" %A in ('Dir /B /AD') Do Call :CheckFold
"%~fA"

C:\test\Projekt\geraete>Echo Habe fertig.
Habe fertig.

C:\test\Projekt\geraete>Pause
Drücken Sie eine beliebige Taste . . .
Alle Pfade und Befehle scheinen zu greifen. Fehlt mir also tatsächlich nur noch die Ausgabe der Kombinationen der Dateinamen in einer Textdatei.
Hilft dir das weiter?
Übrigens, du hast die Variable GeraeteTemplates einmal mit ae und einmal mit ä geschrieben. Wurde bereits verbessert. face-smile
Mitglied: 77559
77559 Jul 13, 2010 at 16:14:24 (UTC)
Goto Top
Habe die Batch jetzt bei mir getestet (in LW D:\ ) und etwas überarbeitet - hier klappt es soweit.
Änderungen siehe oben.

Gruß
LotPings
Member: Philosoph
Philosoph Jul 13, 2010 at 19:36:47 (UTC)
Goto Top
Ahoi!

So, nun bin ich auch mal daheim. Aber kann es dann doch nicht lassen weiter zu probieren.
Denn auch nachdem du dein Skript geändert hast, wird bei mir keine neue Textdatei mit den Kombinationen angelegt.

Ich sehe auch im Skript keine Anweisung, die das Ergebnis in eine Text-Datei umleitet.
die Pfade habe ich so übernommen. Mache ich da was falsch?


LG
Tommy
Mitglied: 77559
77559 Jul 13, 2010 at 19:45:02 (UTC)
Goto Top
Zitat von @Philosoph:
So, nun bin ich auch mal daheim. Aber kann es dann doch nicht lassen weiter zu probieren.
Denn auch nachdem du dein Skript geändert hast, wird bei mir keine neue Textdatei mit den Kombinationen angelegt.

Philosohen sind doch eigentlich Denker, da passt was nicht.
Solange du nicht gehen kannst - versuchen wir wir gar nicht erst zu laufen.

Ich sehe auch im Skript keine Anweisung, die das Ergebnis in eine Text-Datei umleitet.
die Pfade habe ich so übernommen. Mache ich da was falsch?

HAST DU DENN INZWISCHEN EINE PASSENE BILDSCHIRMAUSGABE ?????????

Ich bin eigentlich diese Woche sehr zurückhaltend,aber du schaffts es bald das zu ändern face-sad

Gruß
LotPings
Member: Philosoph
Philosoph Jul 13, 2010 at 19:53:47 (UTC)
Goto Top
Hmmmm,

dann musst du mir erklären was für dich "eine passende Bildschirmausgabe ist". Ich bin davon ausgegangen, dass du damit die Rückmeldung der cmd.exe haben willst. Also was erscheint, wenn ich das Skript ausführe. Aber das habe ich dir ja oben bereits gepostet.

Das ist meine aktuelle Bildschirmausgabe, was ich dir aber bereits oben gepostet habe.
Habe fertig.
Drücken Sie eine beliebige Taste . . .

Falls du jedoch meine Wunsch-Formatierung der Text-Datei meinst:
Motivdateinameohneendung-Gerätedateiname(ohneendung)
Beispiel:
M454564-Gerät454654
M454564-Gerät448
M454564-Gerät6684

Aber wenn ich auch damit falsch liege:
Was verstehst du nun unter einer Bildschirmausgabe? Ich bin mir sicher, dass ich dir dann dienen kann. face-wink
Und immer locker bleiben, ich kenne selbst das Problem mit den blöden Fragen (dann aber aus dem Photoshop und Illustrator Bereich). face-wink Und ich habe früher selbst programmiert, in Profan und C. Aber ich werde mich bessern - versprochen. face-wink

Grüße aus Bad Kreuznach
Tommy
Mitglied: 77559
77559 Jul 13, 2010 at 20:12:35 (UTC)
Goto Top
Ich habe mir nach deinen obigen Angaben eine Testumgebung zusammengestellt:

18:03:27 +D:\Test\Projekt____________________
>dir /B/S/A
D:\Test\Projekt\geraete
D:\Test\Projekt\motive
D:\Test\Projekt\Philosoph.cmd
D:\Test\Projekt\geraete\Ordner3
D:\Test\Projekt\geraete\Ordner3\M1.jpeg
D:\Test\Projekt\motive\Ordner3
D:\Test\Projekt\motive\Ordner3\G2.jpeg
D:\Test\Projekt\motive\Ordner3\G3.jpg
D:\Test\Projekt\motive\Ordner3\G6.tif
D:\Test\Projekt\motive\Ordner3\G8.tif

Mit der aktuellen obigen Batchversion erhalte ich diese Ausgabe:
18:10:25 +D:\Test\Projekt____________________
>Philosoph.cmd
M1-G2
M1-G3
M1-G6
M1-G8
Habe fertig.
Drücken Sie eine beliebige Taste . . .
Und wenn ICH dich richtig verstanden habe, entspricht das deinen Wünschen.

Um diese Ausgabe in eine Datei umzuleiten muss jetzt nur noch
Echo.%%~nB-%%~nC
gegen
>>"X:\Pfad\Datei.ext" Echo.%%~nB-%%~nC
getauscht werden.

Gruß
LotPings
Member: Philosoph
Philosoph Jul 13, 2010 at 20:39:32 (UTC)
Goto Top
Super, ich danke dir sehr!
Damit hast du mir viele schlaflose Nächte genommen. face-wink Ich habe das Skript bzw den Befehl "dir" mit dem Parameter /s erweiter: For /F "delims=" %%B in ('Dir /B /S "%GeraeteTemplates%\*.jpg"'
Nun werden auch Verzeichnisse inklusive Unterordner abgearbeitet. Dadurch entsteht folgendes Problem:

Beispiel:
Im Motive-Ordner "123" liegt die Datei M1.jpeg.
In einem anderen Motive-Ordner (z.B. ein Unterordner) liegt die selbe Datei: M1.jpeg.
Und genau diese Datei (Zeichenfolge) soll das Skript überspringen da sie bereits einmal abgearbeitet/kombiniert wurde.


Bietet diese Skriptsprache eine Funktion die ich dafür anwenden kann?
In einem anderen Forum wurde bereits danach gefragt, leider ohne Erfolg und Ergebnis.


Bis morgen in alter Frische
Tommy
Mitglied: 77559
77559 Jul 13, 2010 at 21:22:20 (UTC)
Goto Top
Wenn ich dich da jetzt richtig verstehe sind mir da M G durcheinander geraten?

Grundsätzlich kannst du alle bereits ausgegebenen Motive in einer tempDatei festhalten und bei jedem erneuten Versuch checken ob bereits in der Temp enthalten.
Das verlangt einige Umstzellungen und verlangsamt das ganze auch, aber machbar.

Falls ich wieder Zeit und Lust habe .... jetzt wirds mir zu spät und zuviel.

Gruß
LotPings
Member: Philosoph
Philosoph Jul 14, 2010 at 06:48:16 (UTC)
Goto Top
Hallo LotPings,

das Problem bzw. die Fragestellung hier ist gelöst. Ich bin gerade dabei das Skript genau zu testen und anzupassen.
Das Problem mit mehrfach vorhandenen Einträgen fange ich am Ende so ab:
Die doppelten Einträge werden mit einem kleinen Tool gesucht und entfernt.

C:\Programme\GnuWin32\bin\sort.exe -u D:\test\vorlaeufige_artikelliste.txt > D:\test\endgueltige_artikelliste.txt

Ein Problem sehe ich noch, aber dazu melde ich mich gleich nochmal.


LG
Tommy