Dateien mit Hilfe von Batch nach ID-Liste in unterschiedliche Ordner einsortieren
Ein wunderschönen Guten Tag wünsche ich euch,
ich bin neu in diesem Forum. Also Hallo erst einmal.
Folgende Herausforderung habe ich zu bewältigen:
-info-kurz-:
viele Dateien aufgrund 6-stelliger Identifikations-Nummer (ID) in Ordner kopieren.
-info-lang-:
Ich möchte gerne anhand einer Liste (auswahl.txt) mit vielen 6 stelligen Nummern (untereinander stehend), eine Auswahl an Dateien aus einen angegebenen Quellpfad (Ordner, der Unterordner enthält) in ein ZielPfad kopieren.
Dabei soll das Batch-Skript die IDs aus der Liste auslesen und nach Dateien im Quellordner such die diese ID enthalten. Unabhängig von Dateityp oder Position der ID.
Dann soll das Batch-Skript die ausgesuchten Dateien kopieren, in einen Ordner mit dem Namen der ID, dieser ist dann ein Unterordner im Zielpfad.
Es ist sichergestellt, dass außer der ID keine weitere 6-stellige Nummer in der Dateibenennung auftaucht.
Es kann sein, dass der ein oder andere ID-Ordner schon unter den Zielpfad besteht. Und auch schon Dateien enthält. Diese können überschrieben werden, wenn die zu kopierende Datei neuer ist (Änderungs-Datum).
Beispiel-1:
Quellpfad:
../Datei-OrdnerX:
123456_neues bild.jpg
654321-altes Bild.jpg
UXd-123456-web2020.png
infoblatt-123456_21-10-10.pdf
../Datei-OrdnerX/Unterordner-2023:
654321-webgrafik2023.webP
123456_neues-Design_RGB-roh.ai
123456-shooting-Datei_ROH.psd
-> click the .bat = scripti dos it like a pro -> : so erscheint im ..
.. ZielPfad: ../IDs:
..
../IDs/123456/123456_neues bild.jpg
../IDs/123456/123456_neues-Design_RGB-roh.ai
../IDs/123456/123456-shooting-Datei_ROH.psd
../IDs/123456/infoblatt-123456_21-10-10.pdf
../IDs/123456/UXd-123456-web2020.png
..
../IDs/654321/654321-altes Bild.jpg
../IDs/654321/654321-webgrafik2023.webP
Soweit dürfte das mit einer Batch umsetzbar sein, leider habe ich noch nichts gefunden, dass dabei auch gleich noch ein ID-Ordner mit angesteuert/angelegt wird.
Das mit dem Datei nur überschreiben, (wenn zu kopierende Datei neuer ist) dürfte knifflig werden.
Jetzt zum Optimal-Fall (info-lang-upgrade):
Gut wäre wenn dabei auch gleich noch anhand von vordefinierten Parametern (z.B.: web; ROH) zusätzliche Unterordner in den ID-Ordnern angesteuert/angelegt werden.
Die Parameter könnten auch in einer weiteren Liste (parameter.txt) untereinander geschrieben werden. Groß und Kleinschreibung sollte bei der Auswahl keine Rolle spielen.
Sodass dann beim Ausführen der Batch die ganze Sache so ansehen würde:
.. ZielPfad: ../IDs:
..
../IDs/123456/123456_neues bild.jpg
../IDs/123456/infoblatt-123456_21-10-10.pdf
../IDs/123456/roh/123456_neues-Design_RGB-roh.ai
../IDs/123456/roh/123456-shooting-Datei_ROH.psd
../IDs/123456/web/UXd-123456-web2020.png
..
../IDs/654321/654321-altes Bild.jpg
../IDs/654321/web/654321-webgrafik2023.webP
Ist das machbar auch für ein Leihen wie mich?, ohne dass ich nun eine Programmiersprache lernen muss. Denn Sprachen liegen mir leider so gar nicht.
Möglichst als Batch, da ich glaube zumindest darin noch die ein oder andere Anpassung hinzubekommen. (z.B. Quellordner ändern; move statt xcopy)
Vielleicht hat jemand Zeit und Lust mein Rätsel zu knacken.
Ich würde mich jedenfalls Mega freuen und es würde mir zudem einige Tage Arbeit ersparen, um die ganzen Alt-Datenbestände endlich mal an Ort und Stelle zu bringen.
Im diesem Sinne schon einmal vielen Dank fürs Durchlesen und vorab auch schon mal ein riesen großes Danke an Denjenigen/Diejenige der/die mir hilft mein Problem zu lösen.
Euer
Alex alias LxKZero5
ich bin neu in diesem Forum. Also Hallo erst einmal.
Folgende Herausforderung habe ich zu bewältigen:
-info-kurz-:
viele Dateien aufgrund 6-stelliger Identifikations-Nummer (ID) in Ordner kopieren.
-info-lang-:
Ich möchte gerne anhand einer Liste (auswahl.txt) mit vielen 6 stelligen Nummern (untereinander stehend), eine Auswahl an Dateien aus einen angegebenen Quellpfad (Ordner, der Unterordner enthält) in ein ZielPfad kopieren.
Dabei soll das Batch-Skript die IDs aus der Liste auslesen und nach Dateien im Quellordner such die diese ID enthalten. Unabhängig von Dateityp oder Position der ID.
Dann soll das Batch-Skript die ausgesuchten Dateien kopieren, in einen Ordner mit dem Namen der ID, dieser ist dann ein Unterordner im Zielpfad.
Es ist sichergestellt, dass außer der ID keine weitere 6-stellige Nummer in der Dateibenennung auftaucht.
Es kann sein, dass der ein oder andere ID-Ordner schon unter den Zielpfad besteht. Und auch schon Dateien enthält. Diese können überschrieben werden, wenn die zu kopierende Datei neuer ist (Änderungs-Datum).
Beispiel-1:
Quellpfad:
../Datei-OrdnerX:
123456_neues bild.jpg
654321-altes Bild.jpg
UXd-123456-web2020.png
infoblatt-123456_21-10-10.pdf
../Datei-OrdnerX/Unterordner-2023:
654321-webgrafik2023.webP
123456_neues-Design_RGB-roh.ai
123456-shooting-Datei_ROH.psd
-> click the .bat = scripti dos it like a pro -> : so erscheint im ..
.. ZielPfad: ../IDs:
..
../IDs/123456/123456_neues bild.jpg
../IDs/123456/123456_neues-Design_RGB-roh.ai
../IDs/123456/123456-shooting-Datei_ROH.psd
../IDs/123456/infoblatt-123456_21-10-10.pdf
../IDs/123456/UXd-123456-web2020.png
..
../IDs/654321/654321-altes Bild.jpg
../IDs/654321/654321-webgrafik2023.webP
Soweit dürfte das mit einer Batch umsetzbar sein, leider habe ich noch nichts gefunden, dass dabei auch gleich noch ein ID-Ordner mit angesteuert/angelegt wird.
Das mit dem Datei nur überschreiben, (wenn zu kopierende Datei neuer ist) dürfte knifflig werden.
Jetzt zum Optimal-Fall (info-lang-upgrade):
Gut wäre wenn dabei auch gleich noch anhand von vordefinierten Parametern (z.B.: web; ROH) zusätzliche Unterordner in den ID-Ordnern angesteuert/angelegt werden.
Die Parameter könnten auch in einer weiteren Liste (parameter.txt) untereinander geschrieben werden. Groß und Kleinschreibung sollte bei der Auswahl keine Rolle spielen.
Sodass dann beim Ausführen der Batch die ganze Sache so ansehen würde:
.. ZielPfad: ../IDs:
..
../IDs/123456/123456_neues bild.jpg
../IDs/123456/infoblatt-123456_21-10-10.pdf
../IDs/123456/roh/123456_neues-Design_RGB-roh.ai
../IDs/123456/roh/123456-shooting-Datei_ROH.psd
../IDs/123456/web/UXd-123456-web2020.png
..
../IDs/654321/654321-altes Bild.jpg
../IDs/654321/web/654321-webgrafik2023.webP
Ist das machbar auch für ein Leihen wie mich?, ohne dass ich nun eine Programmiersprache lernen muss. Denn Sprachen liegen mir leider so gar nicht.
Möglichst als Batch, da ich glaube zumindest darin noch die ein oder andere Anpassung hinzubekommen. (z.B. Quellordner ändern; move statt xcopy)
Vielleicht hat jemand Zeit und Lust mein Rätsel zu knacken.
Ich würde mich jedenfalls Mega freuen und es würde mir zudem einige Tage Arbeit ersparen, um die ganzen Alt-Datenbestände endlich mal an Ort und Stelle zu bringen.
Im diesem Sinne schon einmal vielen Dank fürs Durchlesen und vorab auch schon mal ein riesen großes Danke an Denjenigen/Diejenige der/die mir hilft mein Problem zu lösen.
Euer
Alex alias LxKZero5
Please also mark the comments that contributed to the solution of the article
Content-Key: 4539758470
Url: https://administrator.de/contentid/4539758470
Printed on: May 6, 2024 at 10:05 o'clock
6 Comments
Latest comment
Morsche Alex.
Kommt hier ja gefühlt jede Woche mindestens einmal, wenn man mal die Suchfunktion bemüht .
Ich würde stattdessen gleich zur Powershell unter Windows greifen. Batch ist nun echt anno dazumal und nicht mehr zeitgemäß ...
Format der "Nummernliste.txt"
Format der "subfolderdefinition.txt"
(Key = Value), Key ist der Begriff nachdem gesucht wird und "Value" ist der Name des Unterordners der erstellt wird.
Skript
Done.
Gruß sid.
Kommt hier ja gefühlt jede Woche mindestens einmal, wenn man mal die Suchfunktion bemüht .
Ich würde stattdessen gleich zur Powershell unter Windows greifen. Batch ist nun echt anno dazumal und nicht mehr zeitgemäß ...
Format der "Nummernliste.txt"
111111
222222
333333
Format der "subfolderdefinition.txt"
(Key = Value), Key ist der Begriff nachdem gesucht wird und "Value" ist der Name des Unterordners der erstellt wird.
web = web
roh = roh
Skript
# ==============================
# Quellordner
$source = "D:\quelle"
# Zielordner
$destination = "D:\ziel"
# Nummernliste
$list = "D:\nummernliste.txt"
# Unterordne-Defintion
$subfolderlist = "D:\subfolderdefinition.txt"
# ==============================
# Nummern-Regex erstellen
$numbers = (Get-Content $list) -join '|'
# Unterordner-Defintion als Hashtable einlesen
$subfolderdefinition = Get-Content $subfolderlist -Raw | ConvertFrom-StringData
# Suche zutreffende Dateien und gruppiere sie anhand der Nummer
foreach ($group in Get-ChildItem $source -File -Recurse | ?{$_.Basename -match $numbers} | group {$matches[0]}){
# Basiszielordner festlegen
$dest = join-path $destination $group.Name
# für jede Datei der Nummern-Gruppe
foreach ($file in $group.Group){
# Durchlaufe jede Unterordner-Defintion
foreach ($definition in $subfolderdefinition.GetEnumerator()){
# wenn Begriff gefunden wurde
if($file.Basename -like "*$($definition.Key)*"){
# ergänze den Pfad um den Unterordner
$dest = join-path $dest $definition.Value
break
}
}
# wenn Zielordner nicht existiert erstelle ihn
if (!(Test-Path $dest)){new-item -ItemType Dir -Path $dest -Force | out-null}
# teste ob es die Datei bereits gibt und überschreibe sie nur wenn Datei neuer ist
$existingfile = join-path $dest $file.Name
if (Test-Path $existingfile){
if((get-Item $existingfile).LastWriteTime -lt $file.LastWriteTime){
move-item $file.Fullname -Destination $dest -Force -Verbose
}
}else{
# Datei noch nicht vorhanden, verschiebe sie ins Ziel
move-item $file.Fullname -Destination $dest -Force -Verbose
}
}
}
Done.
Gruß sid.
Du hast ja auch Dateinamen in denen mehrere deiner Begriffe in der Liste vorkommen, z.B "kd" und "web" da muss du dann schon definieren sagen in welchen Ordner die rein sollen . Du hattest ja geschrieben das Groß-und Kleinschreibung egal sein sollen. Sollte das nicht der Fall sein und du Groß- und Kleinschreibung bei der Begriffssuche unterscheiden willst kannst du das leicht ändern, in dem du in Zeile 24 das -like auf -clike änderst.
Und Achtung: Ich hatte nach dem Posten noch eine Kleinigkeit nachträglich eingefügt welche die Verschachtelung verhindert, die Änderung hast du wohl nicht mit übernommen.
Und Achtung: Ich hatte nach dem Posten noch eine Kleinigkeit nachträglich eingefügt welche die Verschachtelung verhindert, die Änderung hast du wohl nicht mit übernommen.
Nein tut er definitiv nicht mehr, klappt hier im Test einwandfrei, keine Verschachtelung, das macht der Code ja auch nicht wie man selbst an ihm sehen kann.
Natürlich sollte man den Inhalt des Ziels vor der alten Version löschen das hast du wohl vergessen zu tun...
Nun denn, den Grundaufbau hast du ja jetzt, damit kannst du dann auch selbst weiterarbeiten und an deinen Gusto anpassen.
Ciao 🖖
Natürlich sollte man den Inhalt des Ziels vor der alten Version löschen das hast du wohl vergessen zu tun...
Nun denn, den Grundaufbau hast du ja jetzt, damit kannst du dann auch selbst weiterarbeiten und an deinen Gusto anpassen.
Ciao 🖖