Ordnerstruktur rekursiv auflisten
Ziel:
Ausgehend von der Position der Batchdatei selbst sollen rekursiv alle Unterordner relativ aufgelistet werden. Nach einem Abgleich mit einer "negativliste.txt" soll die Ausgabe in eine "ausgabe.txt" geschrieben werden. Das Format ist zwingend "unterordner\unterunterordner".
Erst einmal ein "HALLO" an alle die sich die Mühe gemacht haben meinen 1. Beitrag anzukilcken! ;)
Da ich selbst kein Informatiker bin, und auch noch nicht wirklich mit den Untiefen der CMD Verkettungen, String Manipulationen usw. vertraut bin, hoffe ich auf Eure Unterstützung! Ich bin nähmlich schon beim Auflisten der relativen Pfade gescheitert! Aber schaut selbst:
Was habe ich schon versucht:
1. Versuch "DIR"
dir /s /a:d /b >ausgabe.txt
Schreibt schon einmal alle Unterverzeichnisse in die Ausgabedatei. Leider aber mit ABSOLUTEN Pfadangaben! Ich habe keinen Schalter gefunden der mir die RELATIVEN Pfadangaben ausgibt.
2. Versuch "FOR"
for /R /D %%f in (*.*) do (echo %%f)) >ausgabe.txt
Auch hier zunächst die Ausgabe mit ABSOLUTEN Pfadangaben. Da hier aber Variablen zum Einsatz kommen zielt der Versuch darauf ab die Ausgabe über Stringoperation(?) zu manipulieren.
In der "Befehlszeilenreferenz" sind unter "Verwenden von Batchparametern" etliche Erweiterungen benannt (kleiner Auszug):
%~d1 Erweitert %1 zu einem Laufwerkbuchstaben.
%~p1 Erweitert %1 zu einem Pfad.
%~n1 Erweitert %1 zu einem Dateinamen.
%~x1 Erweitert %1 zu einer Dateinamenerweiterung.
Leider auch hier keine Lösung für mein Problem mit den RELATIVEN Pfadangaben! ;(
Nach weiterem Suchen kommen weitere Möglichkeiten zu Tage --> Ersetzen und Indizieren von Strings:
%X:A=B% Sucht in Variable %X nach A und ersetzt es durch B.
%X:~A,B% (A und B sind Ganzzahlen) Sucht in Variable %X nach der Position (in) A und gibt von dort aus B Zeichen zurück.
%X:~A,-B% Wie zuvor nur wird B nicht von Position A aus sondern vom Ende der Variable %X aus gesetzt.
Soweit so gut, aber geht nicht (bei mir!?) wenn A und B wiederum Variablen sein sollen.
Geht auch nicht (bei mir!?) in Verbindung mit den Variablen im FOR Beispiel von oben.
Mein letzter Stand vor und Grund für diesem Beitrag --> meine Idee funktioniert NICHT
(for /R /D %%f in (*.*) do (echo %%f:%cd%=%)) >ausgabe.txt
Die Zeile sollte doch eigentlich die Verzeichnisse auflisten und die Variable %%f abzüglich des Batch Pfades ausgeben?
Also dann, jetzt seit Ihr gefragt! Bitte um ein "wenig" Details! Also so nicht einfach "mach so, dann gehts", sondern "mach es so, weil es dann aufgrund von ... funktioniert.
Gruß
ismiregal
Ausgehend von der Position der Batchdatei selbst sollen rekursiv alle Unterordner relativ aufgelistet werden. Nach einem Abgleich mit einer "negativliste.txt" soll die Ausgabe in eine "ausgabe.txt" geschrieben werden. Das Format ist zwingend "unterordner\unterunterordner".
Erst einmal ein "HALLO" an alle die sich die Mühe gemacht haben meinen 1. Beitrag anzukilcken! ;)
Da ich selbst kein Informatiker bin, und auch noch nicht wirklich mit den Untiefen der CMD Verkettungen, String Manipulationen usw. vertraut bin, hoffe ich auf Eure Unterstützung! Ich bin nähmlich schon beim Auflisten der relativen Pfade gescheitert! Aber schaut selbst:
Was habe ich schon versucht:
1. Versuch "DIR"
dir /s /a:d /b >ausgabe.txt
Schreibt schon einmal alle Unterverzeichnisse in die Ausgabedatei. Leider aber mit ABSOLUTEN Pfadangaben! Ich habe keinen Schalter gefunden der mir die RELATIVEN Pfadangaben ausgibt.
2. Versuch "FOR"
for /R /D %%f in (*.*) do (echo %%f)) >ausgabe.txt
Auch hier zunächst die Ausgabe mit ABSOLUTEN Pfadangaben. Da hier aber Variablen zum Einsatz kommen zielt der Versuch darauf ab die Ausgabe über Stringoperation(?) zu manipulieren.
In der "Befehlszeilenreferenz" sind unter "Verwenden von Batchparametern" etliche Erweiterungen benannt (kleiner Auszug):
%~d1 Erweitert %1 zu einem Laufwerkbuchstaben.
%~p1 Erweitert %1 zu einem Pfad.
%~n1 Erweitert %1 zu einem Dateinamen.
%~x1 Erweitert %1 zu einer Dateinamenerweiterung.
Leider auch hier keine Lösung für mein Problem mit den RELATIVEN Pfadangaben! ;(
Nach weiterem Suchen kommen weitere Möglichkeiten zu Tage --> Ersetzen und Indizieren von Strings:
%X:A=B% Sucht in Variable %X nach A und ersetzt es durch B.
%X:~A,B% (A und B sind Ganzzahlen) Sucht in Variable %X nach der Position (in) A und gibt von dort aus B Zeichen zurück.
%X:~A,-B% Wie zuvor nur wird B nicht von Position A aus sondern vom Ende der Variable %X aus gesetzt.
Soweit so gut, aber geht nicht (bei mir!?) wenn A und B wiederum Variablen sein sollen.
Geht auch nicht (bei mir!?) in Verbindung mit den Variablen im FOR Beispiel von oben.
Mein letzter Stand vor und Grund für diesem Beitrag --> meine Idee funktioniert NICHT
(for /R /D %%f in (*.*) do (echo %%f:%cd%=%)) >ausgabe.txt
Die Zeile sollte doch eigentlich die Verzeichnisse auflisten und die Variable %%f abzüglich des Batch Pfades ausgeben?
Also dann, jetzt seit Ihr gefragt! Bitte um ein "wenig" Details! Also so nicht einfach "mach so, dann gehts", sondern "mach es so, weil es dann aufgrund von ... funktioniert.
Gruß
ismiregal
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 53137
Url: https://administrator.de/contentid/53137
Ausgedruckt am: 24.11.2024 um 08:11 Uhr
5 Kommentare
Neuester Kommentar
Soweit so gut, aber geht nicht (bei mir!?) wenn A und B wiederum Variablen sein sollen.
Du muss Variablen natürlich auch immer als Variable definieren; Bsp:
für A
set A=irgendwas
echo "%A%"
für %~dp1 (Kombination von "%~d1" und "%~p1")
set pfad=%~dp1
::schreibe in die Datei "meine_log.txt" den Text "BEGINN - Login-Daten <aktuelles Datum> <aktuelle Zeit>"
echo BEGINN - Login-Daten %date% %time% > "%pfad%meine_log.txt"
onegase59
Hallo ismiregal und willkommen im Forum!
Und zu Deiner angestrebten Lösung:
Wenn Du dann noch "%cd%\" schreibst, bist Du auch den führenden "\" los.
Grüße
bastla
aber geht nicht (bei mir!?) wenn A und B wiederum Variablen sein sollen.
Falls es Dir hilft:setlocal enabledelayedexpansion
...
...
echo %X:~!A!,!B!%
Und zu Deiner angestrebten Lösung:
@echo off & setlocal enabledelayedexpansion
for /R /D %%f in (*.*) do (set "Vz=%%f") & (echo !Vz:%cd%=!) > ausgabe.txt
Grüße
bastla
Hallo ismiregal!
Zu "enabledelayedexpansion" findest Du hier im Forum jede Menge Info, daher nur ganz kurz:
Der "for"-Befehl wertet Variablen nur einmal (am Beginn aus) - ändern sich daher während des Ablaufens der "for"-Schleife Variablenwerte, wird die "delayedexpansion" benötigt, um die Aktualisierung der Variablen durchzuführen. Dies gilt auch für Variable, die bereits vor dem "for"-Befehl definiert wurden, deren Inhalt sich aber während des Ablaufs der Schleife ändert.
Soferne ich Dich richtig verstehe, enthält die "negativlist.txt" auszufilternde Verzeichnisse (je eines pro Zeile). In diesem Fall könntest Du es so versuchen:
Grüße
bastla
Zu "enabledelayedexpansion" findest Du hier im Forum jede Menge Info, daher nur ganz kurz:
Der "for"-Befehl wertet Variablen nur einmal (am Beginn aus) - ändern sich daher während des Ablaufens der "for"-Schleife Variablenwerte, wird die "delayedexpansion" benötigt, um die Aktualisierung der Variablen durchzuführen. Dies gilt auch für Variable, die bereits vor dem "for"-Befehl definiert wurden, deren Inhalt sich aber während des Ablaufs der Schleife ändert.
Soferne ich Dich richtig verstehe, enthält die "negativlist.txt" auszufilternde Verzeichnisse (je eines pro Zeile). In diesem Fall könntest Du es so versuchen:
findstr /i /v /G:negativlist.txt ausgabe.txt > gefiltert.txt
Grüße
bastla