Shell.Application getDetailsOf jpg Exif DateTaken недействительно DateTime - PullRequest
0 голосов
/ 05 мая 2018

Я использую PowerShell для получения EXIF-данных с фотографий Jpg и ищу поле Date Taken, затем перевернем его, чтобы прочитать yyyy-MM-dd, которое станет именем папки. Источник скрипта указан ниже, для полной проверки скрипта там.

Сценарий ниже работает, но я получаю папки с форматом даты MM-dd-yyyy, и у меня возникает ощущение, что я упускаю что-то очень простое. Любая помощь будет принята с благодарностью!

Этот вопрос Метаданные даты файла не отображаются должным образом - это именно то поведение, которое я наблюдал, возвращаемая строка даты и времени - 22 символа, я пытался заменить [char]8206 and [char]8207 на '', но это возвращает ошибка:

Исключение вызывает "ParseExact" с аргументом (ами) "3": "Строка не была
распознан как действительный DateTime. "
$ NewDateFormat = [datetime] :: ParseExact ($ DateTaken2, 'гггг-мм-дд', $ ноль)

#script source:
http://superwidgets.wordpress.com/category/powershell/
http://superwidgets.wordpress.com/2014/08/15/powershell-script-to-get-detailed-image-file-information-such-as-datetaken/

Сценарий Сэма Бутроса
v1.0 - 1/11 / 2015

$Images | ForEach-Object { $DateTaken = $_.DateTaken.Split(' ')[0].Replace('/','-')


    $DateTaken2 = ($DateTaken -replace [char]8206) -Replace([char]8207)

    $NewDateFormat = [datetime]::ParseExact($DateTaken2, 'yyyy-MM-dd',$null)

    IF (-not (Test-Path $Source\$DateTaken2)){"Create $Source\$DateTaken2"

    New-Item -Path "$Source\$DateTaken2" -ItemType Directory -Confirm:$false}

    Move-Item -Path $_.FullName -Destination "$Source\$DateTaken2" -Confirm:$false

    }

1 Ответ

0 голосов
/ 05 мая 2018

Я бы сказал, что проблема в вашей логике в том, что вы даете 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:).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...