flo7689
Goto Top

Mehrere Verzeichnisse umbennen

Hey Leute,

bisher habe ich immer eine Antwort auf meine Fragen in dem Forum hier gefunden. Ja... bisher! Denn jetzt finde ich keine Lösung für mein Problem. Aber ich hoffe (und weiß), ihr könnt mir helfen! face-wink

Also, hier mein "Problemchen":
In meinem Verzeichnis (H:\test\) sind etliche Order von Typ (12345_abc, 01234_xyz, ...). Jeder dieser Ordner hat wieder eine feste Unterorder-Struktur. Nun möchte ich nahezu jeden dieser Unterorder (in jedem Ordner) umbennenen. Ich habe auch schon eine kleine Batch geschrieben, aber irgendwie will die nicht so ganz, wie ich es gerne hätte. Hier mein Entwurf:

@ECHO OFF
SET verzeichnis=H:\test
FOR /D %a in ('DIR %verzeichnis% /AD /S /B') DO (  

IF EXIST %verzeichnis%\*\*010*\020_test REN %verzeichnis%\*\010*\umbenannt
:: hier würden jetzt noch mehr IF-EXIST-Anweisungen zum Umbennen kommen... ::
)

Wo liegt das Problem bei dem Batch-File?
Schon mal vielen Dank für Eure Hilfe! face-smile

Gruß
Flo
Kommentar vom Moderator Biber am Jan 19, 2010 um 18:52:47 Uhr
Mehrere Verzeichnisse umbennen
Set /a rgc+=1
643

Content-Key: 133847

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

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

Member: bastla
bastla Jan 19, 2010 at 17:45:38 (UTC)
Goto Top
Hallo flo7689 und willkommen im Forum!
Wo liegt das Problem bei dem Batch-File?
Zunächst musst Du Dich entscheiden, ob Du eine "for /d"-Schleife (= nur für eine Unterverzeichnisebene) oder eine "for /f"-Schleife verwenden willst - derzeit ist es eine (wie Du schon bemerkt hast) unbrauchbare Mischung ...

Übrigens: Damit wir dann alle Varianten durch hätten face-wink:
for /r "%verzeichnis%" %a in (.) do ...
Weiters kann "if exist" für den letzten Pfadbestandteil Platzhalterzeichen ("*" oder "?") verarbeiten, aber nicht für mehrere Verzeichnisebenen - Abhilfe schaffen könnte hier eine stufenweise Bearbeitung mit mehreren "for /d" oder ein passendes "findstr" ...

Grüße
bastla
Member: flo7689
flo7689 Jan 19, 2010 at 18:10:17 (UTC)
Goto Top
Hi Bastla,

danke für deine schnelle Antwort! face-smile
Ach du schreck... verschachtelte FOR-Anweisungen!?!? Wie soll das denn dann aussehen?

Mit FINDSTR kann ich aber keinen Befehl danach ausführen. So wie ich das momentan sehe... Oder etwa doch!?

Am besten wäre natürlich eine kleine Batch, in der ich die Verzeichnistiefe angeben kann (mit 1, 2, 3, ...) und händich dann einen (mehrere) Befehl(e) hinzufügen könnte. Geht das überhaupt?

Greetz
Flo
Member: bastla
bastla Jan 19, 2010 at 19:34:34 (UTC)
Goto Top
Hallo flo7689!
Ach du schreck... verschachtelte FOR-Anweisungen!?!? Wie soll das denn dann aussehen?
Die Verschachtelung ist relativ einfach durchzuführen:
for /d %a in ("%verzeichnis%\*.*") do @for /d %b in ("%a\*010*.*") @do for /d %c in ("%b\*.*") do @echo %~fc  
Mit FINDSTR kann ich aber keinen Befehl danach ausführen. So wie ich das momentan sehe... Oder etwa doch!?
Lässt sich einfach verknüpfen:
... echo %c|findstr /e "020_test">nul && ren ...
Falls das nicht genügt, solltest Du Dein Vorhaben etwas genauer (insbes hinsichtlich konstanter / variabler Pfadbestandteile) beschreiben ...

Grüße
bastla
Member: flo7689
flo7689 Jan 19, 2010 at 20:10:04 (UTC)
Goto Top
Nabend bastla!

Ich habe die deine Bestandteile nun mal in meine Batch eingefügt, aber irgendwie tut sich gar nix... face-sad

Hier mal meine Ordnerstruktur, wie ich sie habe (normal noch etwas ausführlicher, aber zur Vereinfachung, habe ich es mal einiges gelöscht):
http://weigelmail.de/struktur.PNG

Die roten Ordner sollen die ersten 5 Zeichen des übergeordneten Ordner aufgreiffen und voral stellen (also: 01234_020_Besuch (das kann ich aber hinterher auch selber machen)).
Die blauen Ordner dürfen nicht verändert werden...

Wäre echt klasse, wenn du mir da mal ein bisschen auf die Sprünge helfen könntest! face-smile

Greetz
Flo (kannst die Zahlen ruhig weglassen)
Member: bastla
bastla Jan 19, 2010 at 20:25:39 (UTC)
Goto Top
Hallo FloohneZahlen face-wink

Das Schema könnte etwa so aussehen:
@echo off & setlocal
set "Basis=D:\Dies und Das\test"  
set "Besuch=020_Besuch"  

for /d %%a in ("%Basis%\*.*") do (  
    for /d %%b in ("%%a\*_*_Allgemein") do (  
        for /f "delims=_" %%i in ("%%~nxb") do (  
            if exist "%%b\%Besuch%" ren "%%b\%Besuch%" "%%i_%Besuch%"  
        )
    )
)
Die Unterscheidung zwischen "rot" und "blau" habe ich (da Du dafür keine Kriterien angegeben hattest) anhand des Namensbestandteiles "Allgemein" getroffen ...

Grüße
bastla
Member: flo7689
flo7689 Jan 19, 2010 at 20:34:41 (UTC)
Goto Top
Wow, super. Danke, funktioniert! face-smile

Nun bräuchte ich nur noch eine Anleitung dazu, damit ich auch verstehe was da gemacht wird! ;-P
Wenn ich nun mehr ändern will, dann muss ich mehrere for-Verschachtelungen machen (und anpassen), oder?

Schönen Abend noch! face-smile
Member: bastla
bastla Jan 19, 2010 at 21:16:13 (UTC)
Goto Top
Hallo flo!

Die Schleife in Zeile 5 geht alle Unterordner des Basis-Ordners durch (in Deinem Beispiel demnach "01234tester" und "12345test") - die stehen dann jeweils in "%%a".

Zeile 6 macht das selbe für jeden der Unterordner aus Zeile 5, allerdings mit der Einschränkung auf den Namensbestandteil "*_*_Allgemein (daher: "01234tester\01234_000_Allgemein" und "12345test\12345_000_Allgemein")

Die Zeile 7 sorgt für das Entnehmen des ersten Teiles (anhand des Trennzeichens "_") aus dem Ordnernamen von "%%b" - in "%%i" steht dann demnach "01234" bzw "12345"

Zeile 8 überprüft, ob es im Ordner "%%b" einen Unterordner "020_Besuch" (da diese Bezeichnung mehrfach benötigt wird, verwende ich dafür eine Variable) gibt und führt ggf die Umbenennung unter Verwendung der schon bekannten Variablen durch
BTW: Genauer wäre die Zeile 8 mit einem zusätzlichen "\", damit tatsächlich nach einem Ordner gesucht wird:
if exist "%%b\%Besuch%\" ren "%%b\%Besuch%" "%%i_%Besuch%"
Leichter nachvollziehbar wird das Ganze, wenn Du zwischen die einzelnen "for"-Zeilen jeweils ein "echo" einbaust - also zB zwischen Zeile 5 und 6 ein "echo %%a", oder während der Testphase "echo on" anstelle von "echo off" verwendest (und den Batch von der Kommandozeile startest) ...
Wenn ich nun mehr ändern will, dann muss ich mehrere for-Verschachtelungen machen (und anpassen), oder?
Ja; für jede weitere Ebene kannst Du eine weitere "for /d"-Schleife hinzufügen.

Grüße
bastla