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
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!
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!
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
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!
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!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 128704
Url: https://administrator.de/contentid/128704
Ausgedruckt am: 22.11.2024 um 03:11 Uhr
11 Kommentare
Neuester Kommentar
Servus,
bevor ich mir das komplett durchgelesen habe schon ein Veto...
Ansonsten lese ich gerne weiter...
Gruß
ps:
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
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
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.
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.
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:
Grüße
Biber
P.S.
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]
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
Moin DrAlcome,
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.
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
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ünschtoder 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
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...
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
Gruß
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
Gruß
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
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
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
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