PowerShell で、後で取得できるように DateTime 変数をファイルに保存するにはどうすればよいですか?

PowerShell で、後で取得できるように DateTime 変数をファイルに保存するにはどうすればよいですか?

特定の行が実行されたときにタイムスタンプをログに記録して、スクリプトが途中で停止し、変数として保存されたタイムスタンプが失われた場合でも、その行の最後の実行からどれだけ経過したかをスクリプトが認識できるようにしたいと考えています。

タイムスタンプを保存してみました

(Get-Date) | ConvertTo-Json | Out-File "$($env:TEMP)\LastTimeChecked.json"

タイムスタンプを読み取る

[DateTime]$LastTimeChecked=(Get-Content "$($env:TEMP)\LastTimeChecked.json" | ConvertFrom-Json)

しかし、PowerShall は Json に保存されたデータを DateTime 形式に戻すことはできません。ファイルは次のように保存されます。

"value":  "\/Date(1656291839853)\/",
"DisplayHint":  2,
"DateTime":  "Monday, 27. June 2022 00:03:59"

この Json ファイルからタイムスタンプを取得するにはどうすればいいですか?

答え1

同じマシン (またはファイルを保存したマシンと同じ地域設定でインストールされているマシン) 上でその日付文字列を DateTime オブジェクトに解析する必要がある場合は、次を使用できます。

$date = (Get-Content "$($env:TEMP)\LastTimeChecked.json" -Raw | ConvertFrom-Json).DateTime
$LastTimeChecked = [datetime]::ParseExact($date, 'dddd, dd. MMMM yyyy HH:mm:ss', $null)  # or [cultureinfo]::CurrentCulture instead of $null

リーダーマシンの地域別の日付時刻設定が不明な場合は、

$date = (Get-Content "$($env:TEMP)\LastTimeChecked.json" -Raw | ConvertFrom-Json).DateTime
$LastTimeChecked = [datetime]::ParseExact($date, 'dddd, dd. MMMM yyyy HH:mm:ss', [cultureinfo]::InvariantCulture)

関連情報