lxkzero5
Goto Top

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

Content-Key: 4539758470

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

Printed on: May 6, 2024 at 10:05 o'clock

Mitglied: 7907292512
Solution 7907292512 Oct 10, 2023 updated at 15:26:53 (UTC)
Goto Top
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"

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.
Member: LxKZero5
LxKZero5 Oct 10, 2023 at 15:12:34 (UTC)
Goto Top
Hallo Siddius,

vielen Dank schon einmal für deine schnelle Antwort. Ja die Suchfunktion hatte ich auch schon bemüht und viele Beiträge durchstöbert nur leider keine passende Lösung gefunden. Sorry fürs Batch-Anfragen, habe schon oft gelesen ist Oldschool, aber scheint ja noch immer für das ein oder andere zu funktionieren.

Im ersten Durchlauf (musste mich erst mal einlesen wie Powershell läuft, und Dummy-Daten erstellen) lief es noch nicht so ganz rund.

Die Ordner mit den IDs erstellt er einwandfrei, legt auch die Dateien richtig nach ID sortiert darin ab.

Mit den Unterordnern hatte der Durchlauf und weitere Durchläufe etwas Probleme.
Da Probiere ich noch etwas rum.

Zuerst hatte er keine Unterordner mit Parametern erstellt. Dies lies sich aber später von mir leider auch nicht mehr rekonstruieren.

Ich hatte noch Parameter in der subfolderdefinition.txt ergänzt, nun erstellt er Unterordern, aber auf zu vielen Ebenen:

screenshot 2023-10-10 165333

Gewünscht ist nur eine Unterordner-Ebene:
screenshot 2023-10-10 170333

subfolderdefinition.txt sieht bei mir nun so aus:
web = web
roh = roh
KD = kd
Arbeitsdatei = Arbeitsdatei

Hier mal zur Ansicht meiner Testdaten:
screenshot 2023-10-10 163816

Werde da heute nicht mehr schlau draus. Mein Kopf glüht auch schon und ich muss mal Feierabend machen, sonst gibt's daheim Ärger.
Werde mich morgen wieder an das Thema wagen, wenn ich wieder am Arbeitsplatz sitze.

Also vielen Dank schon einmal bis hierhin.

Gruß Alex
Mitglied: 7907292512
7907292512 Oct 10, 2023 updated at 15:39:14 (UTC)
Goto Top
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 face-wink. 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.
Member: LxKZero5
LxKZero5 Oct 11, 2023 at 07:17:11 (UTC)
Goto Top
Guten Morgen Siddius,

ja, dass du das Skript in der Zeile 27 um ein break ergänzt hast ist mir in der Tat untergegangen.

Ich habe dies nun ergänzt, leider erzeugt er mir immer noch die verschachtelte Ordner-Struktur. Ich habe auch die Daten mit doppeltem Key -Elemeten aus dem source-Ordner genommen. Leider auch das gleiche Ergebnis.

Zudem existieren leider viele Dateien mit dem selben Key-Element.
Kann man da ein Ranking definieren?
Sozusagen erst alle aus Zeile 1 aus der subfolderdefinition.txt behandeln, dann erst Zeile 2, dann 3.

Ich hatte übrigens das move mit copy ersetzt, da ich die Daten nicht verschieben wollte.

Oder wäre es dann sinnvoller in mehreren Schritten zu arbeiten. Dann müsste ich das Move wieder einbauen.
Ok, dass kann ich heute Mittag mal probieren. Aktuell hat nun ein anderes Projekt Vorrang bekommen.

Eine Info noch, das erkennen der älteren Daten und nicht verschieben hatte auch gut funktioniert.

Vielen Dank an dieser Stelle noch einmal.
Mitglied: 7907292512
7907292512 Oct 11, 2023 updated at 07:49:51 (UTC)
Goto Top
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 🖖
Member: LxKZero5
LxKZero5 Oct 11, 2023 at 08:17:45 (UTC)
Goto Top
Ja den Grundaufbau habe ich und kann damit rumprobieren.

Danke und Ciao 🖖