Я бы сказал, что проблема в вашей логике в том, что вы даете ParseExact
формат
что вы хотите, а не формат, который у вас есть в метаданных. Этот метод направлен на создание объекта DateTime
из строки (на основе предоставленного вами формата), а не форматирования объекта DateTime
.
Вы можете попробовать это вместо этого (проверено на папке с 500 фото - удалите -WhatIf
для действия):
$folderPath = "C:\UnsortedPics"
$newRootFolderPath = "C:\SortedPics"
# create root folder if does not exist
New-Item $newRootFolderPath -ItemType Directory -Force -WhatIf | Out-Null
# create shell object
$shell = New-Object -ComObject Shell.Application
# create folder object
$folder = $shell.NameSpace($folderPath)
foreach ($file in $folder.Items()) {
# get raw date from file metadata
$rawDate = ($folder.GetDetailsOf($file, 12) -replace [char]8206) -replace [char]8207
if ($rawDate) {
try {
# parse to date object
$date = [DateTime]::ParseExact($rawDate, "g", $null)
# you could also use this without try/catch:
#$date = New-Object Datetime
#$parseSuccess = [DateTime]::TryParseExact($rawDate, "g", (Get-Culture), [System.Globalization.DateTimeStyles]::None, [ref]$date)
# get wanted format
$dateString = Get-Date $date -Format "yyyy-MM-dd"
# create path
$newFolderPath = Join-Path $newRootFolderPath $dateString
# create folder if does not exist
New-Item $newFolderPath -ItemType Directory -Force -WhatIf | Out-Null
# move file
Move-Item $file.Path -Destination $newFolderPath -Confirm:$false -WhatIf
} catch {
# ParseExact failed (would also catch New-Item errors)
}
} else {
# no value for "Date Taken" property
}
}
При таком подходе вам больше не нужен скрипт TechNet:).