Я оцифровал свои старые VHS-кассеты, и теперь там довольно много отдельных файлов. Я хочу установить даты файлов на «исходные» даты событий, чтобы иметь возможность сортировать их в хронологическом порядке.
Это можно сделать с помощью PowerShell, используя CreationTime
и LastWriteTime
, но есть кое-что, чего я не понимаю. Мой системный формат даты — европейский, поэтому ДД-ММ-ГГГГ, но CreationTime
принимает только американский формат даты, поэтому ММ/ДД/ГГГГ (то же самое касается и LastWriteTime
). Смотрите код ниже, это PS v4.0, кстати.
# This gives error message: Cannot convert value "31-12-1998" to type "System.DateTime"
(Get-ChildItem oud_en_nieuw_beijum.mpg).CreationTime = '31-12-1998'
# This works correctly
(Get-ChildItem oud_en_nieuw_beijum.mpg).CreationTime = '12/31/1998'
# This gives error message: Cannot convert value "12/31/1998" to type "System.DateTime"
Get-Date -Date '12/31/1998'
# This works correctly
Get-Date -Date '31-12-1998'
Кажется, что CreationTime
и Get-Date
используют противоположные форматы дат? Есть ли в этом какая-то логика, или я что-то упускаю?
решение1
То, что вы сейчас пытаетесь сделать, это преобразовать строку (дату) непосредственно в datetime
объект ( CreationTime
свойство).
Если вы преобразуете строку в datetime
, вы можете использовать только два формата: en-US Culture или формат ISO 8601 (также известный как японский формат даты и времени). Подробнее об этом читайте здесь:https://stackoverflow.com/questions/14359053/why-does-powershell-always-use-us-culture-when-casting-to-datetime
Итак, теперь у вас есть три варианта:
- Использовать формат ISO:
(Get-ChildItem oud_en_nieuw_beijum.mpg).CreationTime = "1998-12-31"
- Использовать en-US:
(Get-ChildItem oud_en_nieuw_beijum.mpg).CreationTime = "12/31/1998"
- Анализ:
(gci oud_en_nieuw_beijum.mpg).CreationTime = ([datetime]::Parse("31.12.1998"))
если вы parse()
это сделаете, PowerShell проанализирует строку с информацией о вашей местной культуре, так что она сможет обрабатывать «европейский формат»
Если вы хотите проанализировать информацию о культуре, которая отличается от вашей локальной культуры, вы можете просто создать [cultureinfo]
объект и проанализировать дату. Например:
$dateString = '10.12.2018'
$frenchCulture = [cultureinfo]::GetCultureInfo('fr-FR')
# Parsing with French Culture
[datetime]::Parse($dateString, $frenchCulture)
решение2
Я использовал (Get-Item Filename.extension).CreationTime=("6 октября 2020 17:47:22"), и это полностью работает.
То же самое, если вы используете его для LastWriteTime и LastAccessTime.