Jump to content

Bilddateien per Powershell-Skript nach Aufnahmedatum sortiert in Ornder verschieben


Direkt zur Lösung Gelöst von xyxy_yx,
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Hallo,

ich möchte alle Fotos (jpg) nach Aufnahmedatum in datumbenannte Ordner verschieben

und eventuell diesen auch erstellen, wenn er nicht vorhanden ist. Die Dateien liegen

im Ordner "c:\Test\sort" und die datumbenannte Ordner sollen in "c:\Test" erstellt

werden.
Beispiel:
aaaaaa.jpg Erstellt am 01.04.2016 soll in den Ordner 2016.04 verschoben werden
bbbbbb.jpg Erstellt am 01.05.2016 soll in den Ordner 2016.05 verschoben werden

mein noch nicht funktionierendes Skript in Powershell:

function Get-ScriptDirectory {

    $Invocation = (Get-Variable MyInvocation -Scope 1).Value

    Split-Path $Invocation.MyCommand.Path

}

function Add-ExtendedFileProperties{

 <#

     .SYNOPSIS

        Fügt erweiterte Eigenschaften von Dateien an das Objekt in der Pipline hinzu

     .DESCRIPTION

        Extrahiert erweiterte Eigenschaften von Dateien wie z.B. Exif-Daten, Musik-
bzw. Filmdetails

     .EXAMPLE

            Get-ChildItem "C:\Temp" | Add-ExtendedFileProperties -PropertyExtended
"Bildhöhe","Bildbreite","Datenrate" | ft Name,Bildhöhe,Bildbreite,Datenrate

            Fügt alle nur die Eigenschaften "Bildhöhe","Bildbreite","Datenrate" als
zusätzliche Spalten dem Objekt in der Pipline hinzu

     .EXAMPLE

            Get-ChildItem "C:\Temp" | Add-ExtendedFileProperties | fl *

            Fügt alle verfügbaren erweiterten Eigenschaften dem Objekt in der Pipline
hinzu

     .PARAMETER PropertyExtended

        Mit diesem Parameter geben sie eine Komma-Separierte Liste von Eigenschaften
an welche sie erhalten möchten.

            -PropertyExtended "Bildhöhe","Bildbreite","Bitrate"

#>

    param(

        [Parameter(Mandatory=$true,ValueFromPipeline=
$True,ValueFromPipelineByPropertyName=$True)]

        $fileItem,

        [String[]] $PropertyExtended = "ALL"

    )

    begin

    {

        $shellObject = New-Object -Com Shell.Application

        $itemProperties = $null

    }

    process

    {

        if($fileItem.PsIsContainer)

        {

            $fileItem

            return

        }

        $directoryName = $fileItem.DirectoryName

        $filename = $fileItem.Name
        $folderObject = $shellObject.NameSpace($directoryName)

        $item = $folderObject.ParseName($filename)
        if(-not $itemProperties)

        {

            $itemProperties = @{}

            $counter = 0

            $columnName = ""

            if ($PropertyExtended -eq "ALL"){

                 #get all properties

                do {

                    $columnName = $folderObject.GetDetailsOf($folderObject.Items,
$counter)

                    if($columnName) { $itemProperties[$counter] = $columnName }

                    $counter++

                }while($columnName)

            }else{

                #get user defined properties

                do {

                    $columnName = $folderObject.GetDetailsOf($folderObject.Items,
$counter)

                    foreach($name in $PropertyExtended){

                        if ($columnName.toLower() -eq $name.toLower()){

                            $itemProperties[$counter] = $columnName

                        }

                    }

                    $counter++

                }while($columnName)

            }

        }
        foreach($itemProperty in $itemProperties.Keys)

        {

            $fileItem | Add-Member NoteProperty $itemProperties[$itemProperty] `

                $folderObject.GetDetailsOf($item, $itemProperty) -ErrorAction `

                SilentlyContinue

        }

        $fileItem

    }

}
$ordner = Get-ScriptDirectory

$fileordner = "$ordner\sort"
dir $fileordner -File |Add-ExtendedFileProperties -PropertyExtended "Aufnahmedatum" |
group {$_.Aufnahmedatum.Substring(0,10)} | group {Get-Date $_.Aufnahmedatum -format
yyyy.MM} | %{

    $ziel = "$ordner\$($_.Name)"

    if (!(test-path $ziel)){md $ziel -Force}

    $_.Group | move-item -Destination $ziel -EA Ignore

    }

Wenn ich an dieser Stelle


...

dir $fileordner -File |Add-ExtendedFileProperties -PropertyExtended "Aufnahmedatum" |
group {$_.Aufnahmedatum.Substring(0,10)} | group {Get-Date $_.Aufnahmedatum -format
yyyy.MM} | %{ ...
group {$_.Aufnahmedatum.Substring(0,10)}

weglasse gibt es folgendenFehler bei Get-Date:

group : Cannot bind parameter 'Date'. Cannot convert value "‎17.‎05.‎2015 ‏‎12:54" to
type

"System.DateTime". Error: "Die Zeichenfolge wurde nicht als gültiges DateTime
erkannt."

At C:\Test\DatumSortieren.ps1:82 char:88

+ ... nahmedatum"  | group {Get-Date $_.Aufnahmedatum -format yyyy.MM} | %{

+                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    + CategoryInfo          : InvalidResult: (aaaaaa.JPG:PSObject) [Group-Object],
ParameterBindingE

   xception

    + FullyQualifiedErrorId :
ExpressionEvaluation,Microsoft.PowerShell.Commands.GroupObjectCommand

hoffe jemand kann mir weiterhelfen
schon mal danke im Voraus

Link zu diesem Kommentar
  • Beste Lösung

Habe die Lösung schon gefunden. Hier nochmal der Code, falls ihn wer benötigt:
function Get-ScriptDirectory siehe oben
function Add-ExtendedFileProperties siehe oben

 

$ordner = Get-ScriptDirectory
$fileordner = "$ordner\sort"
$Dateien = dir $fileordner -File | Add-ExtendedFileProperties -PropertyExtended "Aufnahmedatum"
 foreach ( $Datei in $Dateien){
  $datum=$Datei.Aufnahmedatum -replace '([^0-9.: ])',''
 
  try{
    $Verz=[DateTime]::ParseExact($datum,'dd.MM.yyyy HH:mm', [System.Globalization.CultureInfo]::InvariantCulture).ToString("yyyy.MM")
    if (!(test-path "$ordner\$Verz")){md "$ordner\$Verz" -Force}
    move-item $Datei.FullName -Destination "$ordner\$Verz" -EA Ignore
    }
   catch{}
}
Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...