我已经将旧的 VHS 录像带数字化,现在有相当多的独立文件。我想将文件日期设置为事件的“原始”日期,这样我就可以按时间顺序对它们进行排序。
这可以通过 PowerShell 使用CreationTime
和 来完成LastWriteTime
,但有些事情我不明白。我的系统日期格式是欧洲的,所以是 DD-MM-YYYY,但CreationTime
只接受美国日期格式,所以是 MM/DD/YYYY( 也是如此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 October 2020 17:47:22") 并且它完全有效。
如果将其用于 LastWriteTime 和 LastAccessTime,则会发生同样的事情。