DateTime Ошибка при чтении метаданных файла - PullRequest
1 голос
/ 16 апреля 2019

Я пытаюсь написать код PowerShell для сортировки фотографий и других медиафайлов.Дата изменения / создания файла не всегда точна, поэтому я читаю метаданные файла.Это я успешно сделал и извлек дату создания.НО я не могу заставить PowerShell распознать строку как дату.

Я ХОЧУ, чтобы иметь возможность переупорядочить дату в формате год-месяц-дата, таким образом:

$metaDate.ToString("yyyy-MM-dd")

Но я не верю, что metaDate относится ктип даты, это строка.

Поэтому я пытаюсь использовать этот код для преобразования строки в дату:

$date = [datetime]::ParseExact($metaDate,"dd/MM/yyyy HH:mm",$null)

Однако он продолжает возвращать эту ошибку:

Исключительная ситуация, вызывающая "ParseExact" с аргументом (ами) "3": "Строка не была распознана как допустимый DateTime."

Дата 'представляется' нормальной строкой, когдапеременная записывается в консоль:

26/‎10/‎2017 ‏‎18:23

Но проверка длины возвращает 21 - я вижу только 16 символов (если считать пробел)

gettype () возвращает:

IsPublic IsSerial Name                                     BaseType                                                                                                      
-------- -------- ----                                     --------                                                                                                      
True     True     String                                   System.Object 

Тримминг не имеет значения

У кого-нибудь есть идеи или опыт работы с PowerShell и метаданными файлов?В этой строке могут быть скрытые символы?

Обратите внимание, что ручной ввод одной и той же строки символов в команду ParseExact РАБОТАЕТ (а длина возвращает 16), поэтому в строке / переменной, которую я получаю из файла, есть кое-что сомнительное.

большое спасибо Daz

1 Ответ

2 голосов
/ 16 апреля 2019

В этой строке могут быть скрытые символы?

Действительно, ваша строка даты, хранящаяся в $metaDate, содержит невидимых управляющих символов , а именно (U+200E ( ВЛЕВО-ВПРАВО * MARK )) и (U+200F ( ПРАВО ПРАВА НА ЛЕВУЮ )).
Используйте -replace '\p{Cf}', чтобы удалить их:

 $date=[datetime]::ParseExact($metaDate -replace '\p{Cf}', 'dd/MM/yyyy HH:mm', $null)

Чтобы увидеть все символы в строке, см. этот ответ .

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