Application data下のフォルダをWindows PowerShellでZIPファイルにしてバックアップ取る

はてなダイアリーからHatena Blogに移ったらアクセス解析の通知が来るようになりまして、2017/12/5時点でPVが100を超えたとかなんとか

5年も休眠していたのにそんなにPVがあるのかと思って解析内容を見たら殆どの方は検索サイトからの流入Application Dataフォルダについてのごく簡単な解説が全体の74%を占めているそうです

と言う訳で「セーブデータはAppdataにあります」「Appdataって何だよ」みたいな人がまだまだ結構いるんだなあと思ってAppdata内のフォルダを自動でZIP化してバックアップを取るWindows PowerShellの記事を書いてみます

ちなみにPowerShellって何って人は "PowerShell 入門" 辺りで検索してください

つまり以下の記事はApplication Dataフォルダは詳しくないけどPowerShellは知っている人向けの記事です (もしかして: 空集合)


まず、必要なのはバックアップ元のフォルダ名でこれがApplication Dataフォルダ下にあるので、まずApplication Dataフォルダのパスを取得します Windows PowerShellで実行端末のAppdataフォルダのPathは以下の通り取得できます

[Environment]::GetFolderPath('ApplicationData');

他にも[Environment]::GetFolderPathを使うと DesktopMyDocumentのフォルダなども取得できます

[Environment]::GetFolderPathについて詳細を知りたい人はMSDNの該当記事を読んでください

Application Dataフォルダ内のバックアップ対象のフォルダ名は、例えばJava EditionのMineCraftなら .MinecraftFirefoxなら Mozilla で、ここは各自で変更してください (この記事では Mozilla をサンプルにして話を進めます)

[String] $sourceDirectoryName = 'Mozilla'; # バックアップ対象のフォルダ名; 適宜書き換えて使う
[String] $sourceDirectoryFullName = [Environment]::GetFolderPath('ApplicationData') |
    join-Path -ChildPath $sourceDirectoryName;

バックアップ先のZIPファイル名はバックアップ元のフォルダ名にバックアップ実行時の年月日時分を足したファイル名にでもしておきます

また、バックアップファイルの出力先はどこでもよいのですが、今回はDesktopにしてみます

[String] $zipFileFullName = [Environment]::GetFolderPath('Desktop') |
    join-Path -ChildPath ($sourceDirectoryName + [Datetime]::Now.ToString('yyyy-MM-ddTHHmm') + '.zip');

後はこれを実際にZipファイルにしてやればよいのですが、.NETのZipFile クラス (System.IO.Compression).aspx)がWindows PowerShellでは標準で使えないのでAdd-Typeで System.IO.Compression.FileSystem.dll を読み込んでから使います

Add-Type -AssemblyName "System.IO.Compression.FileSystem";
[System.IO.Compression.ZipFile]::CreateFromDirectory($sourceDirectoryName, $zipFileFullName);

Codeを通しで書くと以下の通りになります

[String] $sourceDirectoryName = 'Mozilla'; # バックアップ対象のフォルダ名; 適宜書き換えて使う
[String] $sourceDirectoryFullName = [Environment]::GetFolderPath('ApplicationData') |
    join-Path -ChildPath $sourceDirectoryName;

[String] $zipFileFullName = [Environment]::GetFolderPath('Desktop') |
    join-Path -ChildPath ($sourceDirectoryName + [Datetime]::Now.ToString('yyyy-MM-ddTHHmm') + '.zip');

Add-Type -AssemblyName "System.IO.Compression.FileSystem";
[System.IO.Compression.ZipFile]::CreateFromDirectory($sourceDirectoryFullName, $zipFileFullName);

あとは例えばバックアップ対象のファイルが現時点で占有されていないかGet-Processで先に調べておくとか、バックアップ先のZIPファイルが既に存在していないかTest-Pathであらかじめ調べておくとかして、Checkpoint-Applicationdataみたいな関数にすると実用度が増すと思います