dralcome
Goto Top

Umstrukturieren von Ordnernamen per Script

Das Aufbauschema von Ordnernamen soll geändert werden (Reihenfolge)

Mahlzeit zusammen!

Wir haben auf der Arbeit einen Netzwerkordner in dem zu jedem Kunden Daten gespeichert werden. Die sind wiederum in Unterordnern drin.

Die Namen der Unterordner sind nach folgendem Schema aufgebaut:
"Zweigstelle1 - Mustermann, Max - Kundennummer"

Die Reihenfolge soll so geändert werden, dass die Kundennummer nach der Zweigstelle kommt, also:
"Zweigstelle1 - Kundennummer - Mustermann, Max"

Das Ganze soll so übersichtlicher gestaltet werden, denn auch bei uns ist leider mancher Kollege damit überfordert den Namen VOR den Vornamen zu setzen, oder überhaupt den ganzen Namen rein zu schreiben. Die Sortierung nach der Kundennummer ist dann sinnvoller.
Sind mehrere Hundert Einträge, also keine Arbeit die man von Hand machen sollte face-wink

Es gab schon einige Einträge zu ähnlichen Fällen, allerdings wurden da immer nur Satzzeichen oder Datumsangaben hinzugefügt, oder so. Hier will ich ja die vorhandenen Daten in eine andere Reihenfolge bringen. Es gibt auch ein schönes Tool "RenameMaster", aber auch der scheint für dieses Vorhaben leider ungeeignet zu sein, hab's jedenfalls nicht hinbekommen.

Keine Angst, ich verlange nicht dass man mir jetzt ein komplettes Script dazu schreibt, sinnvoller ist wenn ich das Konstrukt selber verstehe! face-wink

Wie wäre das am einfachsten/sinnvollsten zu bewerkstelligen? Kann ich die einzelnen Teile aus dem Namen (z.B. alles was nach dem zweiten Bindestrich kommt) als Variable abgreifen und dann VOR den ersten Bindestrich stellen?
Ist das per Batch-Script möglich oder besser als VB-Script?

Würde mich über den einen oder anderen Tipp freuen!
Danke schonmal!

Content-Key: 128704

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

Ausgedruckt am: 19.03.2024 um 10:03 Uhr

Mitglied: 60730
60730 05.11.2009 um 11:56:54 Uhr
Goto Top
Servus,

bevor ich mir das komplett durchgelesen habe schon ein Veto...
"Zweigstelle1 - Kundennummer - Mustermann, Max"
Komma kommt ma am besten gar nicht in Ordner Namen vor - bringt nur Ärger....

Ansonsten lese ich gerne weiter...

Gruß

ps:
Keine Angst, ich verlange nicht dass man mir jetzt ein komplettes Script dazu schreibt, sinnvoller ist wenn ich das Konstrukt selber verstehe! face-wink

for /?
speziell tokens & delims

bedeutet im Klartext %I ist vorgegeben und %J % K ergibt sich - nun nur z.b move %I - %J -%k % %k - %J -%i
Mitglied: Biber
Biber 05.11.2009 um 13:00:54 Uhr
Goto Top
Moin DrAlcome,

du kannst es - wenn wider Erwarten keine Ausnahmen von der o.a. Ordnernamens-Konvention vorhanden sein sollten-
mit zwei FOR-Anweisungen vorgehen:
1. FOR /D Anweisung zum Ermitteln aller Unterordner "Zweigstelle*"
2. direkt auf diesen "Resultset" aufbauend eine weiter FOR /F -Anweisung zum Zerlegen.

Etwas anschaulicher unter der Annahme, du stehst am CMD-Prompt UND im Wurzelverzeichnis aller Zweigstellen.

>For /d %a in ("zweig*") do @for /f "tokens=1-4 delims=- " %i in ("%a") do @echo i[%i] j[%j] k[%k] l[%l]  
i[Zweigstelle1] j[Mustermann,] k[Max] l[Kundennummer]
Hier, im ersten Schritt des proof-of-concept solltest do überprüfen, ob tatsächlich ALLE Ordnernamen sauber in die Schubladen %i, %j, %k und %l fallen.

Und /oder alle %i-%k mal neu umsortieren.
>For /d %a in ("zweig*") do @for /f "tokens=1-4 delims=- " %i in ("%a") do @echo [%i -%l - %j %k]  
[Zweigstelle1 -Kundennummer - Mustermann, Max]

Danach kannst du auch statt des ECHOs irgendein sinnvolleres Kommando einsetzten (MD oder REN oder MOVE). der "alte" Ordnername steht ja in %a,
der zerlegte String in %i bis %l

P.S. ich als ängstlicher Admin würde sogar erst von diesem CMD-Prompt-Oneliner einen kompletten "umbenams.bat" schreiben lassen.
in dieser "umbenams.bat" stehen dann eben die vielen Zeilen mit
Ren "Zweigstelle1 - Mustermann, Max - Kundennummer" "Zweigstelle1 -Kundennummer - Mustermann, Max"

hat zweieinhalb Vorteile:
  • Doku vorher/nachher
  • du kannst vor dem Starten noch eingreifen (falls eben doch ein Ordner NICHT den Konventionen entsprach)
  • der Oneliner/der Oneline-Batch kann nicht durcheinanderkommen, weil der über eine "FOR /D in (zweig*)"-Liste schrapelt, die du ihm während der Laufzeit änderst.

Grüße
Biber

P.S.
Sorry, ich neige zu rhetorischen Ausschweifungen
Na ja, ich kann auch besser kochen als mich kürzer fassen...*g
Mitglied: DrAlcome
DrAlcome 05.11.2009 um 13:00:56 Uhr
Goto Top
Zitat von @60730:
Servus,

bevor ich mir das komplett durchgelesen habe [...]

Sorry, ich neige zu rhetorischen Ausschweifungen face-wink
Mitglied: DrAlcome
DrAlcome 05.11.2009 um 14:09:17 Uhr
Goto Top
Danke schonmal an euch beide!
Mit der FOR-Schleife tu ich mich etwas schwer, hab die Anleitung hier vor mir liegen, aber ist ziemlich komplex...

@Biber: Verstehe ich das richtig, dass ich beide FOR-Schleifen brauche?
Also die erste zum auslesen der Namen-Teile und setzen in die Variablen und die zweite zum einsetzen der Variablen in den neuen Namen...?
Mitglied: Biber
Biber 05.11.2009 um 14:19:35 Uhr
Goto Top
Moin DrAlcome,
Zitat von @DrAlcome:
@Biber: Verstehe ich das richtig, dass ich beide FOR-Schleifen brauche?
Ja. Teste genau die beiden Schritte, die ich oben als POC vom CMD-Prompt aus angegeben habe.
D.h. öffne einen CMD-Prompt, wechsele in das Wurzelverzeichnis eurer "Zweigstelle*"-Ordner, und Copy & Paste jeweils die Zeile, die oben mit einem ">" beginnt.

Das Größer-Zeichen soll nur meine "Eingabeaufforderung", meinen Prompt kennzeichnen, also das ">" NICHT mit eingeben.
Die zweite Zeile ist jeweils die Ausgabezeile.... bei mir jedenfalls nur eine, weil ich bei mir EINEN Spielordner "Zweigstelle usw" angelegt habe.
Bei dir werden ein paar Zeilen mehr ausgegibst.

Also die erste zum auslesen der Namen-Teile und setzen in die Variablen und die zweite zum einsetzen der Variablen in den neuen Namen...?
Die erste zum Auslesen und Prüfen, ob die unterstellten "delims=bla"-Regeln wirklich ALLE Ordnernamen zerlegen wie gewünscht
oder ob es halt nur works as designed.

Bevor das erste Ergebnis nicht vorliegt, brauchen wir uns eigentlich mit Step 2 noch nicht befassen... Geduld.

Grüße
Biber
Mitglied: DrAlcome
DrAlcome 05.11.2009 um 15:45:13 Uhr
Goto Top
OK, danke, so langsam steige ich dahinter was der Befehl macht, bzw. wie er tickt face-smile

For /d %a in ("zweig*") do @for /f "tokens=1-4 delims=- " %i in ("%a") do @echo [%i - %l - %j %k]
For /d %a in ("zweig*") = Suche Verzeichnisse im Verzeichnis "Zweigblabla" und schreibe die Ergebnisse in die Variable a%
do @for /f "tokens=1-4 delims=- " = Suche in allen Ergebnissen nach 4 Teilen und prüfe ob sie durch "- " getrennt sind
%i in ("%a") = Suche nach %i (Zweigstelle)
do @echo [%i - %l - %j %k] = Schreibe den neuen Namen und lasse i% (Zweigstelle) wo es ist, sortiere den Rest neu

So ungefähr interpretiere ich das jetzt face-wink

Wenn ich den Befehl so ausführe (hab's natürlich erstmal in nem Test-Ordner probiert), listet er mir den neu aufgebauten Inhalt richtig auf:

[Zweigstelle1 - 97135 - Montalvo Oxnard]
[Zweigstelle1 - 12345 - Mustermann Max]
[Zweigstelle2 - 23456 - McNugget Rotzi]
[Zweigstelle2 - 85214 - Simpson Homer]

Sobald ich aber "@echo" gegen ein "@ren" (bzw. @rename) austausche, kriege ich einen Syntaxfehler face-sad
Irgendwo hab ich also doch noch nen Denkfehler.
Mitglied: 60730
60730 05.11.2009 um 15:53:13 Uhr
Goto Top
Servus,

auch auf die Gefahr, dass Biber bereits dran ist...

ren / rename will einen alten Ordnernamen und einen neuen - du hast aber nur den neuen...

For /d %a in ("zweig*") do @for /f "tokens=1-4 delims=- " %i in ("%a") do @echo ren  "%i -%j - %k %l"  "%i -%l - %j %k" >> meinetest.cmd  

Und dann meinetest.cmd "editieren/ansehen und "nachprüfen" - erst dann - laufen lassen..

Ps: Du fährst am besten, wenn du dir den ganzen kladderadatsch auf einen extra Rechner kopierst und dort testest face-wink

Gruß
Mitglied: Biber
Biber 05.11.2009 um 16:00:11 Uhr
Goto Top
Nicht aufgeben jetzt... ist alles, wie es sein soll.

Jetzt die nächsten 2 Hürden:

1.) wenn Datei- oder Ordnernamen Leerzeichen enthalten, dann muss der String in Anführungszeichen.
Ich hatte oben zur String-Anzeige die eckigen Klammer verwendet; für die REN/MOVE/Whatever-Befehle brauchst du die "-Zeichen.

2) Zweite Hürde: Jetzt mit der Logik aufpassen.
Du willst nur die Ordner mit der ALTEN Namenskonvention anfassen--- irgendwann sind aber "bereits umbenannte" im selben Ordner.
Frühzeitig damit rechnen, dass du möglicherweise das Skript/die CMD-Zeile mehrmals zum Umbenamsen aufrufst und das möglicherweise das Szenario ein anderes ist.

[Hilfe steht bereit, aber ich denke, du bekommst es hin..]

Grüße
Biber
Mitglied: DrAlcome
DrAlcome 05.11.2009 um 16:40:44 Uhr
Goto Top
Jaharrrr, jetzt läuft es (fast) perfekt! face-smile
Ich habe es mit dem "Zwischenschritt" von TimoBeil gemacht, also das Ergebnis in eine CMD schreiben und dann ausführen. Den Befehl musste ich etwas abändern (Leerzeichen versetzen und die Echo-Anweisungen in Anführungszeichen - wie Biber geschrieben hat).

Die Zauberformel lautet nun also:

For /d %a in ("zweig*") do @for /f "tokens=1-4 delims=- " %i in ("%a") do @echo ren "%i - %j %k - %l" "%i - %l - %j %k" >> meinetest.cmd

Die sieht dann so aus:
ren "Zweigstelle1 - Montalvo Oxnard - 97135" "Zweigstelle1 - 97135 - Montalvo Oxnard"
ren "Zweigstelle1 - Mustermann Max - 12345" "Zweigstelle1 - 12345 - Mustermann Max"
ren "Zweigstelle2 - McNugget Rotzi - 23456" "Zweigstelle2 - 23456 - McNugget Rotzi"
ren "Zweigstelle2 - Simpson Homer - 85214" "Zweigstelle2 - 85214 - Simpson Homer"


Jetzt wäre es noch optimal wenn ich sozusagen dynamisch abfangen kann, wenn ein Name nicht aus 4 Teilen besteht, wenn also z.B. der Vorname fehlt. Momentan kommt dann alles durcheinander, da er ja stur nach 4 Teilen im Namen sucht.
Dazu bräuchte ich dann bestimmt eine IF-Abfrage nehme ich mal an. Oder kann ich dem Script sagen "Such nach dem zweiten Bindestrich und zieh alles was danach kommt vor den ersten Bindestrich"?

P.S.: Biber, danke für den 2. Logik-Tipp, wäre nämlich grade fast drauf reingefallen face-wink
Mitglied: Biber
Biber 05.11.2009 um 16:53:48 Uhr
Goto Top
Moin DrAlcome,

wusste ich doch, dass du es auch (fast) allein hinbekommst...

Zu den IF-Abfragen:
Ja, das wäre eine der Möglichkeiten (eine andere wäre, die "alten passenden" Ordner mit einer "DIR plus passende Wildcards" zu ermitteln).

Aber bleiben wir bei der eingeschlagenen Mimik.
Da du ja die 4 rausgedröselten Tokens %i bis %l einzeln prüfen kannst, prüfe doch einfach, ob das 4. Token leer ist (=ein Feld zuwenig vorhanden)

Als Skizze:

For /d %a in ("zweig*") do @for /f "tokens=1-4 delims=- " %i in ("%a") do @if not [%l]== echo ren "%i - %j %k - %l" "%i - %l - %j %k"

Ebenso könntest du das ZWEITE Token (%j) daraufhin prüfen, ob es größer (numerisch) 0 ist.
Bei den bereits umbenamsten Ordnern steht da ja schon eine Kundennummer drin.
Also "IF %j EQU 0 ". Denn alle reinen Strings in der Variablen %j werden als numerischer Wert 0 interpretiert.

Grüße
Biber
Mitglied: DrAlcome
DrAlcome 06.11.2009 um 12:01:58 Uhr
Goto Top
Danke Biber!

Mit dem Script wie du es geschrieben hast, ändere ich die Ordner die 4 Einträge haben (also Zweigstelle, Name, Vorname und Kundennummer). Wenn das durchgelaufen ist, ignoriert er alle Ordner mit 3 Einträgen. Diese kann ich dann in einen temporären Ordner verschieben und nachträglich umbenennen indem ich das Script so umschreibe dass nur die mit 3 Einträgen geändert werden sollen. Hab's jetzt zumindest so gemacht.

Vielen Dank für eure Hilfe!! face-smile