Powershell - Ein Ordner mit tausenden Bildern - Ordnerstruktur gemäß CSV Datei erstellen
Hola liebe Admingemeinde
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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 501566
Url: https://administrator.de/contentid/501566
Ausgedruckt am: 25.11.2024 um 07:11 Uhr
6 Kommentare
Neuester Kommentar
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?
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
$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}
}
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
$csv = Import-CSV $csvpath -Delimiter ";" -Encoding UTF8
Demonstration:
Ordner mit Bildern und CSV:
CSV
"OBJEKT-ID";"ZUGEHÖRIGE BILDER"
"1";"kajigh4.jpg, jdudgrj5.jpg, jsdfhkfu.jpg"
Ordner nach dem Ausführen des Skripts:
Inhalt von Ordner "1"