littleflame
Goto Top

Powershell - Ein Ordner mit tausenden Bildern - Ordnerstruktur gemäß CSV Datei erstellen

Hola liebe Admingemeinde face-smile

Lange nicht mehr hier gewesen, aber jetzt habe ich ein Problem, das hier eventuell perfekt aufgehoben ist.

Geplant ist ein Website Relaunch.
Auf der alten Website wurden alle Bilder in einem Ordner gespeichert. Anhand der Dateinamen lassen sie sich nicht zuordnen.

Anhand der Datenbank hinter der alten Website, kann ich zu jedem "Objekt" die verlinkten Bilder auflisten lassen.

Habe also folgende Ausgangssituation:

OBJEKT-ID / ZUGEHÖRIGE BILDER
1 / kajigh4.jpg, jdudgrj5.jpg, jsdfhkfu.jpg
2 / okidfgh.jpg, kjsdu58,jpg, kjsdvure.jpg

Ich möchte ein Script schreiben, das folgendes tut:

Für die gesamte CSV Datei je einen Ordner mit namens "OBJEKT-ID" anlegt und alle Bilder, die zum Objekt gehören in den Ordner legt.
Das soll dann natürlich automatisch für alles "OBJEKT-IDS" passieren.
Ausgangsposition ist: Alle Bilder liegen in chaotisch in einem Ordner.

Ich hab schonmal große Dateimengen per Powershell sortiert und hoffe, dass ich dies nun mit der CSV Datei verknüpfen kann.

Kann jemand helfen?

Mit besten Grüßen,
LF

Content-Key: 501566

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

Printed on: April 20, 2024 at 07:04 o'clock

Member: H41mSh1C0R
H41mSh1C0R Oct 04, 2019 updated at 12:03:27 (UTC)
Goto Top
Zitat von @LittleFlame:
Ich möchte ein Script schreiben...

Dann ran an die Tastatur und angefangen!

Für die gesamte CSV Datei je einen Ordner mit namens "OBJEKT-ID" anlegt und alle Bilder, die zum Objekt gehören in den Ordner legt.
Das soll dann natürlich automatisch für alles "OBJEKT-IDS" passieren.
Ausgangsposition ist: Alle Bilder liegen in chaotisch in einem Ordner.

Kann jemand helfen?

Wo liegt das Problem?

- CSV einlesen
- mit Schleife durch die Datensätze laufen
- Ordner erstellen mit Objekt-id als Namen
- Feld mit Bilderliste hernehmen
- Bilderliste auftrennen als Delemiter ","
- mit Schleife Copyjob für die einzelnen Bilder

VG
Mitglied: 141320
Solution 141320 Oct 04, 2019 updated at 12:13:32 (UTC)
Goto Top
$basefolder = 'd:\Bilder'  
$csvpath = 'd:\daten.csv'  
$csv = Import-CSV $csvpath -Delimiter ";"  
$csv | %{
   $ziel = "$basefolder\$($_.'Objekt-Id')"  
   md $ziel -Force | out-null
   $_.'Zugehörige Bilder' -split '\s*,\s*' | ?{Test-Path "$Basefolder\$_"} | %{move-item "$Basefolder\$_" -Destination $ziel -verbose}  
}
Ordner, CSV-Pfad, Delimiter und Spaltennamen anpassen, fertig.
Member: H41mSh1C0R
H41mSh1C0R Oct 04, 2019 at 12:14:43 (UTC)
Goto Top
Danke für den 8 Zeiler. Wie immer schön kompakt. ^^

Hoffe der TO lernt trotzdem was und nutzt das nicht rein für Copy&Paste. =)
Member: LittleFlame
LittleFlame Oct 04, 2019 at 12:22:04 (UTC)
Goto Top
Hola an alle,

danke erstmal. Wie so oft im Internet, natürlich nicht ganz ohne Seitenhieb.
Ich habe den Thread erstellt, bevor ich angefangen habe das Script zu schreiben - wohlwissend, dass ich nicht sehr fit in PS bin und mich bei der Syntax schwertun werde.
Und auch, weil ich mich gefreut hab, mal wieder was hier im Forum zu posten.
Man mag es gerne "faul" nennen, aber so wars nicht gemeint.

Danke trotzdem an alle.

Grüße ins Wochenende,
LF
Member: LittleFlame
LittleFlame Oct 17, 2019 at 12:51:42 (UTC)
Goto Top
Hola nochmal liebe Gemeinde,

ich habe noch ein Problem mit dem Script und würde es gern verstehen:

Die Zeile:

$_.'Zugehörige Bilder' -split '\s*,\s*' | ?{Test-Path "$Basefolder\$_"} | %{move-item "$basefolder\$_" -Destination $ziel -verbose}

macht mir Probleme.

move-item "$basefolder\$_" sollte ja eigentlich den Dateinamen Spalte "Objekt-ID" nach "," gesplittet ergeben.

Jedoch ergibt "$basefolder\$_" hier ..\\@{Objekt-ID=1063; Zugehörige Bilder=web1_1337606407,web2_1337606408,web3_133760
6409,web4_1337606410,web5_1337606410,web6_1337606411,web7_1337606411,web8_1337606412,web9_1337606413,web10_1337606413,w
eb11_1337606440,web12_1337606440,web13_1337606441}\

Wenn ich das richtig verstehe, bin ich also mit "$basefolder\$_" noch nicht bei der gesplitteten Spalte, sondern bei allen Infos aus der Zeile der CSV.
Ich dachte, es geht, wenn ich .'Zugehörige Bilder' anfüge, aber dem ist nicht so.

Ich will auch nicht, dass wieder gemeckert wird, weil ich nur nach der Lösung frage. Deshalb bin ich auch für eine Art Tipp dankbar, der mich verstehen lässt, was mein Problem ist.

Vielen Dank im Voraus!

LF
Mitglied: 141320
141320 Oct 17, 2019 updated at 13:41:59 (UTC)
Goto Top
macht mir Probleme.
Weil deine CSV nicht den Vorgaben entspricht.
Die CSV sollte für den PS-Code folgendermaßen formatiert sein
"OBJEKT-ID";"ZUGEHÖRIGE BILDER"  
"1";"kajigh4.jpg,jdudgrj5.jpg,jsdfhkfu.jpg"  
"2";"okidfgh.jpg,kjsdu58,jpg,kjsdvure.jpg"  


Hier der Kommentierte Code für dein Verständnis:
# Ordner in dem die Bilder liegen
$basefolder = 'd:\Bilder'  
# Pfad zur CSV-Datei in der die Daten stehen in folgendem Format
<#
"OBJEKT-ID";"ZUGEHÖRIGE BILDER"  
"1";"kajigh4.jpg, jdudgrj5.jpg, jsdfhkfu.jpg"  
"2";"okidfgh.jpg, kjsdu58,jpg, kjsdvure.jpg"  
#>
$csvpath = 'd:\daten.csv'  
# Importiere CSV Datei als Object
$csv = Import-CSV $csvpath -Delimiter ";"  
# For-Each Schleife für jede Zeile der CSV
$csv | %{
    # setze den Zielordnernamen aus Basisordner und der Spalte "Object-ID" der aktuellen Zeile zusammen  
    $ziel = "$basefolder\$($_.'Objekt-Id')"  
    # erstelle den Ordner
    md $ziel -Force | out-null
    # Nehme die Spalte mit dem Namen "Zugehörige Bilder" und splitte den Inhalt anhand des Kommas und eventuell  
    # vorhandener Leerzeichen vor und nach dem Komma, checke mit Where-Object (?{}) für jedes Bild ob es im Basisordner vorhanden ist.
    # Die abschließende ForEach Schleife (%{}) verschiebt die zutreffenden Bilder in den Zielordner.
    $_.'Zugehörige Bilder' -split '\s*,\s*' | ?{Test-Path "$Basefolder\$_"} | %{move-item "$Basefolder\$_" -Destination $ziel -verbose}  
}

ACHTUNG
Wenn die CSV eine bestimmte Kodierung hat musst du das beim Import mit dem Parameter -Encoding beim Import-CSV Befehl festlegen sonst findet er die Spalten nicht weil die bei dir ja einen Umlaut enthalten!

Beispiel wenn die CSV im ANSI vorliegen würde
$csv = Import-CSV $csvpath -Delimiter ";" -Encoding Default  
mit UTF-8
$csv = Import-CSV $csvpath -Delimiter ";" -Encoding UTF8  
usw.

back-to-topDemonstration:


Ordner mit Bildern und CSV:

screenshot

CSV
"OBJEKT-ID";"ZUGEHÖRIGE BILDER"  
"1";"kajigh4.jpg, jdudgrj5.jpg, jsdfhkfu.jpg"  

Ordner nach dem Ausführen des Skripts:

screenshot

Inhalt von Ordner "1"

screenshot