Frage zu DOS-Batch: Verzeichnisstruktur mit FOR durchlaufen

dark_rider

Active member
Themenstarter
Registriert
7 Aug. 2008
Beiträge
2.042
Hallo zusammen,

kennt sich hier zufällig jemand besser mit DOS-Batch-Befehlen aus?

Folgender Befehl sollte alle .txt-Dateien im Ordner D:\Archiv und dessen Unterordnern ausgeben:
Code:
for /r "D:\Archiv" %i in ("*.txt") do @echo %i
Beispielergebnis:
Code:
D:\Archiv\datei1.txt
D:\Archiv\datei2.txt
D:\Archiv\Unterarchiv1\datei3.txt
D:\Archiv\Unterarchiv2\datei4.txt
D:\Archiv\Unterarchiv2\Unterarchiv2_1\datei5.txt
Wüsste jemand, wie man in der Schleife auf die Bestandteile des Gesamtpfades zugreifen kann, also z.B.:
Code:
Gesamtpfad: D:\Archiv\Unterarchiv2\Unterarchiv2_1\datei5.txt
Pfad: D:\Archiv\Unterarchiv2\Unterarchiv2_1\
Dateiname: datei5
Extension: .txt
 
Lösung
Puh, Batch ist doch länger her und komplizierter als ich befürchtete (ähnelt fast schon eher regulären Ausdrücken als z.B. PHP). Wäre Folgendes dann korrekt?
Code:
for /r "D:\Archiv" %%i in ("*.txt") do (
     set path=%%~dpi
     set name=%%~ni
     set ext=%%~xi

     echo Pfad: %path%
     echo Dateiname: %name%
     echo Extension: %ext%

     ren "%path%backup.bak" "%name%.bak"
)

- - - Beitrag zusammengeführt - - -

Batch scheint der Horror zu sein, sehr kryptisch.
Dies hier läuft:
Code:
for /R "D:\Archiv\Unterordner" %%f in (*.txt) do (
    echo %%f
)
Wie ich aber nun in ein und derselben Schleife auf die drei Bestandteile Pfad, Dateiname und Extension zugreifen können soll, bleibt schleierhaft und alle bisherigen...
Danke Euch, aber ich befürchte, das bringt mich noch nicht zum Ziel. Konkret möchte ich in der for-Schleife Dateien mit ren umbenennen, die zusätzlich in den Ordnern vorhanden sind.

Beispiel der vorhandenen Dateien:
Code:
D:\Archiv\datei1.txt
D:\Archiv\backup.bak
D:\Archiv\Unterarchiv1\datei3.txt
D:\Archiv\Unterarchiv2\backup.bak
D:\Archiv\Unterarchiv2\Unterarchiv2_1\datei5.txt
D:\Archiv\Unterarchiv2\Unterarchiv2_1\backup.bak
D.h. jedes Verzeichnis bzw. Unterverzeichnis enthält eine individuell benannte .txt-Datei sowie eine Datei, die immer den gleichen Namen hat (backup.bak). backup.bak soll nun jeweils umbenannt werden:
Code:
D:\Archiv\datei1.txt
D:\Archiv\backup.bak -> datei1.bak
D:\Archiv\Unterarchiv1\datei3.txt
D:\Archiv\Unterarchiv2\backup.bak -> datei3.bak
D:\Archiv\Unterarchiv2\Unterarchiv2_1\datei5.txt
D:\Archiv\Unterarchiv2\Unterarchiv2_1\backup.bak -> datei5.bak
 
Zuletzt bearbeitet:
Danke Euch, aber ich befürchte, das bringt mich noch nicht zum Ziel. Konkret möchte ich in der for-Schleife Dateien mit ren umbenennen, die zusätzlich in den Ordnern vorhanden sind.
In meinem Link steht doch, wie du an die Bestandteile kommst. Wenn Dateiname + Pfad in %1 stehen, dann sollte
"name=%%~n1" den Dateinamen ergeben, "ext=%%~x1" die Dateinamenerweiterung, "pfad=%%~dp1" Laufwerksbuchstaben + Pfad.
Also genau das, wonach du gefragt hattest.
 
Puh, Batch ist doch länger her und komplizierter als ich befürchtete (ähnelt fast schon eher regulären Ausdrücken als z.B. PHP). Wäre Folgendes dann korrekt?
Code:
for /r "D:\Archiv" %%i in ("*.txt") do (
     set path=%%~dpi
     set name=%%~ni
     set ext=%%~xi

     echo Pfad: %path%
     echo Dateiname: %name%
     echo Extension: %ext%

     ren "%path%backup.bak" "%name%.bak"
)

- - - Beitrag zusammengeführt - - -

Batch scheint der Horror zu sein, sehr kryptisch.
Dies hier läuft:
Code:
for /R "D:\Archiv\Unterordner" %%f in (*.txt) do (
    echo %%f
)
Wie ich aber nun in ein und derselben Schleife auf die drei Bestandteile Pfad, Dateiname und Extension zugreifen können soll, bleibt schleierhaft und alle bisherigen Versuche scheiterten mit unverständlichen Fehlermeldungen.

Der zitierte Webseiten-Autor lässt nämlich leider etwas aus:
Code:
:: nur der Dateiname (ohne .ext) - die Option "~n" (Name der Datei oder des Ordners) wird angesprochen, %% weil Ausführung aus einem Script heraus, a am Ende ist das Element der for Schleife
for %%a in (%path%) do set 1=%%~na
:: -> test
-> Wie gibt man "test" konkret aus ("echo 1"?), und wie extrahiert man mehrere Teile des Dateistrings in einer Schleife?

- - - Beitrag zusammengeführt - - -

Hier mein neuer Zwischenstand:
Code:
for /R "D:\Archiv\Unterordner" %%i in (*.txt) do (
     set %%p=%%~dpi
     set %%d=%%~ni
     set %%e=%%~xi

     echo %%i
     echo Pfad: %%p
     echo Dateiname: %%d
     echo Extension: %%e
)
Beispielausgabe:
Code:
D:\Archiv\Unterordner\beispiel.txt
Pfad: %p
Dateiname: %d
Extension: %e
D.h. die drei Einzelbestandteile des Dateipfades lassen sich irgendwie einfach nicht extrahieren, statt derer wird nur "%p" usw. ausgegeben (was eigentlich als Variable mit entsprechendem Inhalt gedacht war). Was mache ich als zugegebenermaßen BATCH-Laie falsch, oder geht es doch gar nicht? Liegt es vielleicht an den für mich noch völlig unklaren %-Zeichen, d.h. wann schreibt man zwei vor eine Variable, wann nur eins, und wann eins davor und eins danach?

- - - Beitrag zusammengeführt - - -

PHP ist wirklich ein Traum gegenüber Batch-Programmierung...

So kommen wenigstens keine Syntax-Errors mehr:
Code:
for /R "D:\Archiv\Unterordner" %%i in (*.txt) do (
     echo %%i

     set p=%%~dpi
     echo Pfad:      %p%

     set d=%%~ni
     echo Dateiname: %d%

     set e=%%~xi
     echo Extension: %e%
)
Allerdings werden die Variablen p, d und e erst NACH Ende der Schleife neu belegt (mit den Werten des letzten Durchlaufes). Beim ersten Aufruf des Batch sind sie stets leer, bei einem erneuten Aufruf haben sie in jedem Durchlauf den Wert des letzten Durchlaufes des vorherigen Batch-Aufrufes. Scheinbar können in Batch-Schleifen keine zusätzlichen Variablen belegt werden als die in der FOR-Zeile (%%i ist als einzige stets korrekt und aktuell).

- - - Beitrag zusammengeführt - - -

Jetzt hab ichs: Batch ist wirklich sehr einfach gestrickt und ersetzt Zeichenketten wie %variable1% in Schleifen schon VOR Durchlauf der Schleife durch den dann gültigen Wert, d.h. vor dem ersten Durchlauf ist die Variable dann ohne vorherige Belegung leer, und beim zweiten Aufruf des Batchfiles enthält sie noch den Wert vom letzten Schleifendurchlauf des letzten Batchfile-Aufrufes.

Wie folgt funktioniert es daher (Verzicht auf innerhalb der Schleife neu belegte Variablen):
Code:
for /R "D:\Archiv\Unterordner" %%i in (*.txt) do (
     echo %%i

     echo Pfad:      %%~dpi
     echo Dateiname: %%~ni
     echo Extension: %%~xi
)
 
Zuletzt bearbeitet:
Lösung
  • ok1.de
  • thinkstore24.de
  • ok2.de - Notebook Computer Server
  • Preiswerte-IT - Gebrauchte Lenovo Notebooks kaufen

Werbung

Zurück
Oben