none
Bilder in Ordner sortieren RRS feed

  • Frage

  • Hallo erstmal,

    ich hoffe mir kann jemand helfen.

    ich habe seitdem ich mit meiner Frau zusammen bin eine ganze menge an fotos gemacht. 

    Nachdem meine Frau sich versucht hat diese zu sortieren, findet man nun gar nichts mehr an den orten wo sie sein sollen.

    Eigentlich soll es ganz simple sein. 

    Ich gebe eine Source an in dem Bilder sind zum wegsortieren und dann soll das Script das Erstellungsdatum lesen und dieses Bild in den richtigen Jahres Ordner schieben. ich brauch ja nicht mal Monate. Das Jahr würde mir reichen.

    Und falls der Ordner nicht existiert, dann den Ordner erstellen.

    Falls jemand sowas schon hat oder mir helfen kann, dann wäre mir sehr geholfen damit :D 

    vielen dank im voraus. und das nächste Bier geht auf mich.



    Sonntag, 17. Februar 2019 21:02

Antworten

  • Ich hab da mal was auf die Schnelle zusammengebastelt.

    Es sollte den gewünschten Zweck erfüllen.

    Du muss Source und Destinationpfad anpassen und vorzugsweise das Script als Admin ausführen.

    #by J.Kühnis /  techblog.jere.ch
    $source = "C:\temp\Beispielpfad"
    $Destination = "C:\temp"
    
    
    $Files = Get-ChildItem $source
    
    
    Foreach ($file in $files){
    $DestinationPath = Get-ChildItem $Destination
        
        $fileyear = $file.CreationTime.Date.ToString('yyyy')
        
        IF(!($DestinationPath.name -contains $fileyear)){
            
            write-host $file -ForegroundColor Green
            New-Item -Path $Destination\$fileyear -ItemType Directory
    
        }
    
        Copy-Item -Path $file.FullName -Destination $Destination\$fileyear
        
    
    }

    Gib mir bescheid, falls du doch noch das ganze in "Monaten" unterteilt haben möchtest.

    Es werden übrigens alle Dateien des Sourceordner in die neue Struktur kopiert ( kein Filter auf Bilddateien) und es wird nur der Hauptordner kopiert...falls es Bilder in einem Unterordner vorhanden sind, kann dies mittels "-Recurse" beim Get-ChildItem aufruf ergänz werden.

    Grüsse Jere

    PS: Erstellungsdatum =! Änderungsdatum  ;-)
    Dienstag, 19. Februar 2019 15:06

Alle Antworten

  • Caninho86,

    hallo erstmal und willkommen im deutschen Microsoft Powershell Forum.

    Wie Du bestimmt in den Forenregeln und den anderen hilfreichen Tipps in den Beiträgen am Anfang dieses Forums gelesen haben wirst, schreiben wir keine Scripte auf Anfrage. Wenn Du nach gebrauchsfertigem Code suchst, kannst Du es gern mal hier: PowerShell Gallery oder hier: TechNet Gallery - resources for IT professionals probieren. Oder Du schaust hier mal vorbei .... Microsoft Technet Script Center - Requests ... wenn jemand Deine Aufgabe interessant genug findet, erstellt er vielleicht etwas Passendes für Dich.

    Solltest Du selbst schon ein Powershell-Script haben, aber damit nicht weiterkommen, kannst Du dieses hier gern posten und wir können gern versuchen, Dir zu helfen (Code bitte als Code formattieren).

    Wenn das eine einmalige Aufgabe sein soll, kannst Du es auch gern mal mit darauf spezialisierten Tools wie IrfanView oder so probieren, die werten dann auch die in den Bildern enthaltenen EXIF-Daten aus und Du musst Dich nicht auf die potenziell unzuverlässigen Datei-Zeit-Stempel verlassen.

    Beim Bier hätt' ich dann gern ein Dunkles, wenn ich es mit aussuchen darf.  ;-) :-)


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''



    • Bearbeitet BOfH-666 Sonntag, 17. Februar 2019 23:35
    Sonntag, 17. Februar 2019 23:34
  • Ich hab da mal was auf die Schnelle zusammengebastelt.

    Es sollte den gewünschten Zweck erfüllen.

    Du muss Source und Destinationpfad anpassen und vorzugsweise das Script als Admin ausführen.

    #by J.Kühnis /  techblog.jere.ch
    $source = "C:\temp\Beispielpfad"
    $Destination = "C:\temp"
    
    
    $Files = Get-ChildItem $source
    
    
    Foreach ($file in $files){
    $DestinationPath = Get-ChildItem $Destination
        
        $fileyear = $file.CreationTime.Date.ToString('yyyy')
        
        IF(!($DestinationPath.name -contains $fileyear)){
            
            write-host $file -ForegroundColor Green
            New-Item -Path $Destination\$fileyear -ItemType Directory
    
        }
    
        Copy-Item -Path $file.FullName -Destination $Destination\$fileyear
        
    
    }

    Gib mir bescheid, falls du doch noch das ganze in "Monaten" unterteilt haben möchtest.

    Es werden übrigens alle Dateien des Sourceordner in die neue Struktur kopiert ( kein Filter auf Bilddateien) und es wird nur der Hauptordner kopiert...falls es Bilder in einem Unterordner vorhanden sind, kann dies mittels "-Recurse" beim Get-ChildItem aufruf ergänz werden.

    Grüsse Jere

    PS: Erstellungsdatum =! Änderungsdatum  ;-)
    Dienstag, 19. Februar 2019 15:06
  • Ich hab da mal was auf die Schnelle zusammengebastelt.

    Dafür gibt's eigentlich einen Punktabzug von mir.  ;-) So lernt Caninho86 genau gar nix, wenn wir ihm die Lösung auf dem Silbertablett servieren.

    Noch ein Tipp von mir - gerade hier für's Forum - Dein Code ist deutlich einfacher zu lesen und zu verstehen - gerade auch von Anfängern - wenn er so deklarativ und ausführlich wie möglich ist. Nicht jeder kennt jedes cmdlet und weiß sofort welcher Parameter bedient wird ... und ein bissl Form und Stil macht den Code auch aufgeräumter. Vielleicht magst Du mal hier reinlesen: The PowerShell Best Practices and Style Guide.

    Und wo wir jetzt sowieso schon einmal dabei sind ....

    $Source = 'C:\temp\Beispielpfad'
    $DestinationRoot = 'C:\temp'
    
    Get-ChildItem -Path $Source -Recurse -File -ErrorAction SilentlyContinue |
        ForEach-Object {
            $DestinationPath = Join-Path -Path $DestinationRoot -ChildPath $_.CreationTime.Year
            if (-not( Test-Path -Path $DestinationPath )) {
                New-Item -Path $DestinationPath -ItemType Directory | Out-Null
            }
            Copy-Item -Path $_.FullName -Destination $DestinationPath
        }
    ... und wenn ich noch eine persönlich Bitte äußern dürfte ... ein bissl weniger Whitspace wäre schön.  ;-) Danke.


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''




    • Bearbeitet BOfH-666 Dienstag, 19. Februar 2019 15:46
    Dienstag, 19. Februar 2019 15:43
  • Es gibt da massenhaft Skripte dieser Art im Netz wenn man mal auf englisch sucht: LINK

    Da lässt sich sicher was finden, was du dann mit unserer Hilfe anpassen kannst.



    Blog: http://www.bytecookie.de

    Powershell Code Manager v6: Link
    (u.a. Codesnippets verwalten + komplexe Scripte graphisch darstellen)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.

    Freitag, 22. Februar 2019 12:58
    Moderator