古い VHS テープをデジタル化したので、今ではかなり多くの別々のファイルになっています。ファイルの日付をイベントの「元の」日付に設定して、時系列で並べ替えられるようにしたいです。
CreationTime
これは PowerShell でと を使用して実行できます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 形式 (日本語の日時形式とも呼ばれます) の 2 つだけです。詳細については、次を参照してください。https://stackoverflow.com/questions/14359053/why-does-powershell-always-use-us-culture-when-casting-to-datetime
つまり、次の 3 つの選択肢があります。
- 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 に使用する場合も同様です。