エンジニアの技術と直接関係のある記事ではないのですが、途中でPoiwershellを使ったりするので備忘録として残します。
今回の手順
おそらくいろいろやり方があるのでしょうが、今回は単純にバックアップリストアをする方法です。
今回のバックアップは以下の手順で行いました。
- 旧アカウントのGoogleフォトからデータをエクスポート
- エクスポートした画像があるフォルダを新アカウントのGoogleフォトに紐づけて同期させる
本題は注意点なので、手順の説明はしません。
注意点
どういうわけか、2. エクスポートした画像を新アカウントのGoogleフォトに紐づけて同期させる
を行うと画像の日時がすべてエクスポートした日時
になります。
解決方法
これでは不便なのでPowershellで解決します。
Adjust.ps1
function GPhoto-Adjust ([Switch]$HideDetails = $false) {
# カレンとディレクトリのjsonファイルを再帰的に探索
forEach($file in (Get-ChildItem -Recurse | Where-Object {$_.Extension -eq '.json'})){
# jsonに対応する画像(動画)ファイルの有無を確認
$picPath = $file.FullName.Substring(0, $file.FullName.Length - 5)
if (-not (Test-Path $picPath -PathType Leaf)) {
continue
}
# jsonに対応する画像(動画)ファイルを取得
$pic = Get-Item $picPath
# jsonをパース
$json = Get-Content $file.FullName -Raw -Encoding UTF8 | ConvertFrom-Json
# 画面に変更前の作成日時を出力
if (-not $HideDetails) {
Write-Host -NoNewline "$($pic.FullName)`t"
Write-Host -NoNewline -ForegroundColor Yellow "$($pic.CreationTime)"
Write-Host -NoNewline ' -> '
}
# 作成日時と更新日時をメタデータから変更する
$pic.CreationTimeUtc = $json.creationTime.formatted.Replace(' UTC', '')
$pic.LastWriteTimeUtc = $json.creationTime.formatted.Replace(' UTC', '')
# 画面に変更後の作成日時を出力
if (-not $HideDetails) {
Write-Host -ForegroundColor Cyan "$($pic.CreationTime)"
}
}
}
使い方
- スクリプトを読み込みます。
- バックアップした画像ファイルがある親フォルダに移動します。
-
GPhoto-Adjust
コマンドレットを実行します。
. ./Adjustor.ps1
cd C:\Photo
GPhoto-Adjust
結果
実行すると作成日時や更新日時が撮影日時で上書きされます。
この画像ファイルをGoogleフォトと同期すればしっかり日時を分けて表示できます。
公式が提供する機能だけで簡単に移行できるといいんですけどね・・・
有料契約してるユーザーだけでも機能を提供してほしいです。
リポジトリ
GitHubにソースコードと使い方をアップロードしました。
MITライセンスです。ご自由にご活用ください。