He digitalizado mis viejas cintas VHS y ahora hay bastantes archivos separados. Quiero establecer las fechas de archivo en las fechas "originales" de los eventos, para poder ordenarlos cronológicamente.
Esto se puede hacer con PowerShell usando CreationTime
y LastWriteTime
, pero hay algo que no entiendo. El formato de fecha de mi sistema es europeo, por lo que DD-MM-AAAA, pero CreationTime
solo acepta el formato de fecha de EE. UU., por lo que MM/DD/AAAA (lo mismo ocurre con LastWriteTime
). Vea el código a continuación, es PS v4.0 por cierto.
# 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'
¿Parece eso CreationTime
y Get-Date
usa los formatos de fecha opuestos? ¿Hay alguna lógica detrás de esto o me estoy perdiendo algo?
Respuesta1
Lo que estás intentando hacer ahora es transmitir una cadena (la fecha) directamente a un datetime
objeto (La CreationTime
propiedad).
Si envía una cadena a datetime
, solo puede usar dos formatos: formato en-US Culture o ISO 8601 (también conocido como formato de fecha y hora japonés). Lea mas sobre eso, aqui:https://stackoverflow.com/questions/14359053/why-does-powershell-always-use-us-culture-when-casting-to-datetime
Entonces tienes tres opciones ahora:
- Utilice formato ISO:
(Get-ChildItem oud_en_nieuw_beijum.mpg).CreationTime = "1998-12-31"
- Usar en-US:
(Get-ChildItem oud_en_nieuw_beijum.mpg).CreationTime = "12/31/1998"
- Analizar gramaticalmente:
(gci oud_en_nieuw_beijum.mpg).CreationTime = ([datetime]::Parse("31.12.1998"))
Si lo parse()
hace, PowerShell analizará la cadena con la información de su cultura local, de modo que pueda manejar el "formato europeo".
Si desea analizar información cultural que sea diferente de su cultura local, puede simplemente crear un [cultureinfo]
objeto y analizar la fecha. p.ej:
$dateString = '10.12.2018'
$frenchCulture = [cultureinfo]::GetCultureInfo('fr-FR')
# Parsing with French Culture
[datetime]::Parse($dateString, $frenchCulture)
Respuesta2
Utilicé (Get-Item Filename.extension).CreationTime=("6 de octubre de 2020 17:47:22") y funciona totalmente.
Lo mismo si lo usas para LastWriteTime y LastAccessTime.