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
を使うと Desktop
やMyDocument
のフォルダなども取得できます
[Environment]::GetFolderPath
について詳細を知りたい人はMSDNの該当記事を読んでください
- Environment.GetFolderPath メソッド (Environment.SpecialFolder) (System)
- Environment.SpecialFolder 列挙型 (System)
Application Dataフォルダ内のバックアップ対象のフォルダ名は、例えばJava EditionのMineCraftなら .Minecraft、Firefoxなら 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みたいな関数にすると実用度が増すと思います