xsto123
Goto Top

Anhand einer Excelliste nach Dateien auf Server suchen und verschieben

Hallo,

ich habe ein etwas verzwicktes Problem. Und zwar suche ich nach einer Möglichkeit, Dateien anhand einer Excelliste auf einer Festplatte zu suchen und in einen Ordner zu kopieren. Ich weiß nicht, ob so etwas überhaupt möglich ist, daher erst mal grundsätzlich die Frage.

Konkret geht es darum, dass ich in einer Excelliste ca. 5.000 Artikelnummern habe (z.B. "123456"). Auf unserem Server wiederrum liegen Bilder mit diesen Artikelnummern als Dateiname (allerdings verstreut in hunderten Ordnern und leider hängt an der Artikelnummer auch manchmal noch ein Zusatz (z.B. "123456-blabla.psd").

Ich suche nun nach einer einfachen Möglichkeit, die Festplatte anhand der Excelliste zu durchsuchen und wenn ein entsprechendes Bild gefunden wird, soll es in einen Ordner kopiert werden, sodass ich alle Bilder zusammen habe. Außerdem müsste dann natürlich noch in der Excelliste ein "OK" hinter die entsprechende Artikelnr. geschrieben werden, wenn ein Bild gefunden wurde.

Erschwerend kommt hinzu, dass es sowohl "123456.psd" als auch "123456.tiff" oder "123456.jpg" geben kann, wobei ich genau in dieser Reihenfolge die Priorität hätte. Heißt also, wenn ein psd gefunden wird, soll er dieses kopieren, wenn nicht dann das tiff und wenn das auch nicht, dann das jpg.

Ist sowas überhaupt machbar?

Vielen Dank bereits im Voraus und ein schönes Wochenende!

(sorry falls die Frage im falschen Unterforum ist, bitte ggf. verschieben)

Content-ID: 301285

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

Ausgedruckt am: 22.11.2024 um 19:11 Uhr

114757
114757 08.04.2016 aktualisiert um 17:59:34 Uhr
Goto Top
Ist sowas überhaupt machbar?
Ja das ist es.

Gruß jodel
xsto123
xsto123 08.04.2016 um 17:15:35 Uhr
Goto Top
Wäre super, wenn noch jemand etwas Konstruktives beizutragen hätte. Ich habe bewusst (noch) nach keinem "fertigen Script" für mein Problem gefragt, aber ein wenig mehr Infos als "Ja" hätte ich mir schon erhofft, denn sehr viel schlauer als zuvor bin ich jetzt auch nicht.

Daher danke an alle, die konstruktiv helfen können.
114757
114757 08.04.2016 aktualisiert um 17:47:08 Uhr
Goto Top
Naja wenn du oben schreibst
Ich weiß nicht, ob so etwas überhaupt möglich ist, daher erst mal grundsätzlich die Frage.
habe ich diese von dir "grundsätzliche" Frage eindeutig beantwortet!

Wenn du Code sehen willst dann schreib das doch gleich face-wink
Daher danke an alle, die konstruktiv helfen können.
Ich kann konstruktiv helfen wie du an meiner Vielzahl an Codebeispielen hier im Forum sehen kannst, aber hier weiß ja man ja noch nicht mal in welcher Programmier- bzw. Scriptsprache du arbeiten willst oder überhaupt Erfahrung hast face-sad wenn du das in der allgemeinen Kategorie Entwicklung postest.
Wen ich dir hier jetzt bspw. was in C++ poste ist das bestimmt nicht nach deinem "Gusto".
xsto123
xsto123 08.04.2016 aktualisiert um 17:47:37 Uhr
Goto Top
Wenn du mir direkt Code liefern magst, dann gerne ;) Ich persönlich hätte das allerdings zu aufdringlich gefunden - ist aber vielleicht einfach meine Art zu fragen bzw. um etwas zu bitten.

Aber mal ernsthaft: Magst du mir nun konstruktiv weiterhelfen, gerne auch direkt mit einer handfesten Lösung? Ansonsten würde ich darum bitten, dass wir das Kommentieren in diesem Thread bitte lassen, bis mir jemand bei meinem Problem weiterhelfen kann. Ich bin nämlich immer noch nicht schlauer. Danke.
114757
114757 08.04.2016 aktualisiert um 17:53:17 Uhr
Goto Top
Les doch mal bitte meinen letzten Kommentar zu Ende.

Ich kann helfen wenn ich weiß womit du programmieren/arbeiten willst.

Wenn ich hier jetzt was fertiges in Powershell poste und dann kommst, nö ich will das in Batch ... dann wäre das für die Tonne gewesen.

Zudem wäre interessant ob deine Excel-Liste eventuell eine CSV-Datei ist.

Gruß jodel32
114757
Lösung 114757 08.04.2016, aktualisiert am 11.04.2016 um 10:14:34 Uhr
Goto Top
Hier mal ein Beispiel mit Powershell:

Wenn du eine CSV-Datei in folgendem Format anlegst:
Artikelnummer
11111
22222
33333
44444
55555
Kannst du mit diesem Powershell-Code deine Such und Kopieraktion durchführen:
# ------
# Zielordner für die Bilder
$targetfolder = 'C:\Ziel'  
# Suchordner
$searchfolder = 'D:\'  
# Pfad zur CSV-Liste
$listpath = 'C:\liste.csv'  
# ------

if ($PSVersionTable.PSVersion.Major -lt 3){write-host "ERROR: Minimum Powershell Version 3.0 is required to run this script!" -ForeGroundColor Yellow; return}   

# Zielordner erstellen wenn er nicht existiert
if (!(Test-Path $targetfolder)){md $targetfolder -Force | out-null}

# CSV-Datei importieren
$liste = Import-CSV $listpath -Delimiter ";"  
# Spalte für den Suchstatus hinzufügen
$liste | Add-Member -MemberType NoteProperty -Name 'Status' -Value ''  

write-host "Einlesen der Dateien ..." -ForegroundColor Green  
# Alle Bilder in eine Variable einlesen
$files = gci $searchfolder -Recurse -Force -File -EA Ignore | ?{$_.Extension -in @('.psd','.tiff','.jpg','.jpeg')}  

# Für jede Artikelnummer in der CSV-Datei
$liste | %{
    # Artikelnummer steht in der Spalte 'Artikelnummer' 
    $artnr = $_.Artikelnummer
    
    # Status ausgeben
    write-host "Suche Bilder zur Artikelnummer $artnr ..." -ForegroundColor Green -NoNewline  

    # passende Dateien finden
    $foundfiles = $files | ?{$_.Name -like "$artnr*"}  
    # wenn Dateien gefunden wurden ...
    if($foundfiles){
        write-host "$($foundfiles.Count) Bilder gefunden"  
        # setze Status auf OK
        $_.Status = "OK"  
        $subtarget = "$targetfolder\$artnr"  
        # erstelle einen Unterordner für die Artikelnummer im Zielordner
        md $subtarget -Force -EA SilentlyContinue | out-null
        # Kopiere die Dateien in den Zielordner
        $foundfiles | copy-item -Destination $subtarget
    }else{
        write-host "Keine Bilder gefunden"  
        $_.Status = "Keine Bilder"  
    }
}

# Schreibe den Listenstatus zurück in das CSV-File
$liste | export-csv $listpath -Delimiter ";" -NoType -Encoding utf8  
Die CSV-Datei wird dann um eine Status-Spalte ergänzt so dass das CSV-File am Ende so aussieht
"Artikelnummer";"Status"
"11111";"OK"
"22222";"OK"
"33333";"Keine Bilder"
"44444";"OK"
"55555";"OK"
"66666";"Keine Bilder"

Gruß jodel32
xsto123
xsto123 08.04.2016 um 18:59:56 Uhr
Goto Top
Wollen will ich wie gesagt nichts. Ich kann nur fragen und darauf hoffen, dass mir jemand netterweise weiterhelfen kann/möchte. Ich stelle also keine Forderung. Falls du dich meinem Problem annimmst, bedanke ich mich natürlich recht herzlich bereits im Voraus.

Wirklich viel Erfahrung im Programmieren habe ich nicht, daher wäre eine relativ "simple" Lösung nicht schlecht. Ein Batch, dass ich rudimentär auf meine Bedürfnisse anpassen und dann einfach ausführen kann wäre natürlich nicht schlecht - wenn das funktioniert, was ich ja leider immer noch nicht genau weiß.

Ansonsten kann ich mit PHP noch am besten etwas anfangen. Ein XMPP Server läuft bereits auf einem lokalen PC, der auf den Server mit den Bildern zugreift. Ein PHP Script könnte ich also ausführen.

Das mit der Excel ist eine gute Frage. Da müsste ich am Montag am Arbeitsplatz nachschauen, falls das einen großen Unterschied macht.
xsto123
xsto123 08.04.2016 um 19:11:17 Uhr
Goto Top
Jetzt haben sich unsere Beiträge zeitlich überschnitten.
--
Vielen Dank, das sieht ziemlich gut und gar nicht so kompliziert aus. Mit Powershell habe ich zwar absolut keine Erfahrung, aber um das Script auszuführen werden wohl ein paar Minuten Google reichen. ;) (Außer du magst mir die Basics noch kurz dazu erläutern, was benötige ich, wie führe ich das Script aus?)

Ich werde das direkt am Montag ausprobieren und mich ggf. nochmals melden.

Danke
xsto123
xsto123 11.04.2016 um 08:30:15 Uhr
Goto Top
Hallo,

also ich habe das heute morgen direkt ausprobiert, leider funktioniert das Script nicht.
Ich kenne mich mit Powershell nicht aus, daher gehe ich davon aus, dass der Fehler bei mir liegt. Als erstes habe ich die Pfade angepasst und die CSV-Datei erstellt (Testdateien). Danach habe ich das Script als .ps1 Datei abgespeichert und die ExecutionPolicy auf "Unrestricted" gesetzt. Wenn ich das Script jetzt allerdings per PowerShell ISE ausführen will, erscheint einfach nur "Fehler" links unten.

Habe ich etwas falsch gemacht?
114757
114757 11.04.2016 aktualisiert um 09:23:27 Uhr
Goto Top
Zitat von @xsto123:
also ich habe das heute morgen direkt ausprobiert, leider funktioniert das Script nicht.
Doch face-smile
Ich kenne mich mit Powershell nicht aus, daher gehe ich davon aus, dass der Fehler bei mir liegt.
Jupp.
Als erstes habe ich die Pfade angepasst und die CSV-Datei erstellt (Testdateien). Danach habe ich das Script als .ps1 Datei abgespeichert und die ExecutionPolicy auf "Unrestricted" gesetzt. Wenn ich das Script jetzt allerdings per PowerShell ISE ausführen will, erscheint einfach nur "Fehler" links unten.
Und welche Fehlermeldung genau ????
Habe ich etwas falsch gemacht?
Meine Glaskugel sagt: Wahrscheinlich einfach eine zu alte Powershellversion benutzt! Mindestens PS3.0 solltest du haben.
Ein $psversiontable in der Konsole sagts dir ...
Dafür habe ich ja extra Zeile 10 eingebaut die das überprüft und es dir ausgibt wenn es so ist.
xsto123
xsto123 11.04.2016 um 09:51:28 Uhr
Goto Top
Meine Glaskugel sagt: Wahrscheinlich einfach eine zu alte Powershellversion benutzt! Mindestens PS3.0 solltest du haben.

Eine Fehlermeldung wurde zwar nicht ausgegeben, aber daran lag es. Danke.
simon253
simon253 24.01.2024 um 09:39:29 Uhr
Goto Top
Hallo,

ich habe ein ähnliches Problem und bin auf diese Lösung gestoßen.

An sich funktioniert es, jedoch sind meine Dateien mit einem Präfix ausgestatten: good_123456789.bmp oder bad_123456789.bmp

Ich habe aber in der csv datei nur 123456789.

@114757: kannst du mir sagen, wie ich deinen Skript ändern muss, damit ich die richtigen Bilder finde?

Danke schon mal