Невозможно преобразовать строку в целочисленную переменную из атрибута DateTaken в файле JPG - PullRequest
0 голосов
/ 01 октября 2018

У меня есть скрипт, который использует данные EXIF ​​из файла JPG, чтобы найти значение DateTaken.Найдя данные, поместите данные в переменные $Year и $Month.

$objShell  = New-Object -ComObject Shell.Application
$folders = (Get-ChildItem G:\ServerFolders\Photos\UnSorted\ -Directory -Recurse -force).FullName

foreach ($Folder in $folders) {
    $objfolder = $objShell.Namespace($folder)

    foreach ($file in $objFolder.Items()) {
        if ($objfolder.GetDetailsOf($file, 156) -eq ".jpg") {
            $yeartaken = ($objFolder.GetDetailsOf($File, 12)).Split("/")[2].Split(" ")[0]
            $month = $objFolder.GetDetailsOf($File, 12).Split("/")[1]
            $monthname = (Get-Culture).DateTimeFormat.GetMonthName($month)

            Write-Host $file.Name
        }
    }
}

Таким образом, если для файла задано DateTaken как 06/10/2016, $yeartaken равно 2016 и $month is 10

I, затем Get-Culture, чтобы преобразовать 10 в октябрь.Это не работает, потому что он видит $month в виде строки.

Cannot convert argument "month", with value: "‎10", for "GetMonthName" to
type "System.Int32": "Cannot convert value "‎10" to type "System.Int32".
Error: "Input string was not in a correct format.""
At line:1 char:3
+   (Get-Culture).DateTimeFormat.GetMonthName($month)
+   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodException
    + FullyQualifiedErrorId : MethodArgumentConversionInvalidCastArgument

Я пытался преобразовать его в целочисленное значение, используя приведение или преобразование, но по какой-то причине он не будет преобразован.

PS> [int]$Test = $month

Cannot convert value "‎10" to type "System.Int32". Error: "Input string was
not in a correct format."
At line:1 char:1
+ [int]$Test = $month
+ ~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : MetadataError: (:) [], ArgumentTransformationMetadataException
    + FullyQualifiedErrorId : RuntimeException

Ответы [ 2 ]

0 голосов
/ 01 октября 2018

Строка даты и времени, возвращаемая $objFolder.GetDetailsOf($File, 12), содержит невидимых управляющих символов [1] по неизвестным мне причинам.

Вы можете лишить их следующим образом, после чего ваш код должен работать:

# Remove the formatting control characters from the string, by replacing
# all instances of Unicode character category \p{Cf} with the empty string.
# For more info on Unicode categories, see http://www.regular-expressions.info/unicode.html
$dateTimeStr = $objFolder.GetDetailsOf($File, 12) -replace '\p{Cf}'

[int] $yeartaken = $dateTimeStr.Split("/")[2].Split(" ")[0]
[int] $month = $dateTimeStr.Split("/")[1]
$monthname = (Get-Culture).DateTimeFormat.GetMonthName($month)

В качестве отступления, на общей ноте: Ответ Ансгара Вихера показывает более надежные методы анализа строки даты и времени.


[1] В метаданных моего тестового файла я обнаружил экземпляры управляющих символов Unicode U + 200E (ЛЕВАЯ-ПРАВОВАЯ МАРКА) и U + 200F (С ПРАВОЙ КЛЕВОЙ)

0 голосов
/ 01 октября 2018

Лучшим подходом к работе с датами является преобразование строки даты в фактический DateTime объект, который предоставляет всю информацию, которую вы ищете:

$culture = [Globalization.CultureInfo]::InvariantCulture
$pattern = 'dd\/MM\/yyyy'

$datestring = $objFolder.GetDetailsOf($File, 12).Split(' ')[0]
$datetaken  = [DateTime]::ParseExact($datestring, $pattern, $culture)

$year      = $datetaken.Year
$month     = $datetaken.Month              # month (numeric)
$monthname = $datetaken.ToString('MMMM')   # month name

Предполагая, что дата соблюдаетсяко времени в формате HH:mm:ss вы также можете расширить код для обработки времени:

$culture = [Globalization.CultureInfo]::InvariantCulture
$pattern = 'dd\/MM\/yyyy HH:mm:ss'

$datestring = $objFolder.GetDetailsOf($File, 12)
$timestamp  = [DateTime]::ParseExact($datestring, $pattern, $culture)

$year      = $timestamp.Year
$month     = $timestamp.Month              # month (numeric)
$monthname = $timestamp.ToString('MMMM')   # month name
$hour      = $timestamp.Hour
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...