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