2021年10月21日
PowerShellを使って自動化
重要なファイルをアップデートしたら、バックアップを取得しておきたい。
今回はパスワード管理をしている「KeePass Password Safe」のDB。同じPC内のSSDに保存していたのでは心もとないので、外部(USB、クラウド)に保存するのがベターだろう。
ファイルの操作をした後で、エクスプローラを開き、ファイルの操作をするのを忘れるし、少し手間がかかる。
これを一連の流れで、必ず終了するようにしたい。
バッチ(CMD.exe)でも出来そうだが、ここは勉強・研究も兼ねてPowerShellを使って構築することにした。
PowerShellも最新のバージョン 7.1.5 にアップデートする。
まずは、プログラムの起動から。
これは「Start-Process」で「start」と略せる。
start 起動ファイルの場所¥keepass.exe
このままでは、起動させたらコマンドは次の行に移ってしまうので、保存・終了してから次の行に移りたい。
start 起動ファイルの場所¥keepass.exe -wait
-waitパラメータを入れると、プログラムが終了するまで、コマンドは次の行に移らない。
しかし、この -wait を起動するプログラムが自分のパラメータだと思い、処理しようとしてしまう。
それで -wait パラメータの位置を後方ではなく、startの次に置くことにより、起動するプログラムの影響を受けないようにする。
start -wait 起動ファイルの場所¥keepass.exe
これで -wait は正しく機能する。
保存するDBには、ファイル名の前に日付を付けて保存したい。そうするとエクスプローラで日付順に並ぶ。取得する日付はYYYYMMDDとする。
$date = (Get-Date).ToString("yyyyMMdd")
$dateの変数に、日付を取得し、そのフォーマットはYYYYMMDDとして格納する。その日付をコピー先のファイル名の頭に付加する。
copy-item ファイルの場所¥AAAA.kdbx 格納場所¥$date-AAAA.kdbx
copy-itemはcopyと略せる。
バッチ作成と同じ様に、行毎にCMD.exeのpauseの機能の「$host.UI.RawUI.ReadKey()」を入れて、テストしてみる。
思ったように動くことを確認したので、コマンドファイルのショートカットをデスクトップに置き、一連の流れを確認するが、PowerShellファイル(PS1拡張子)はダブルクリックでは起動しない。右クリックで「PowerShellで実行」を選ばなければならない。「規定のアプリ」の選択でも出来ない。
ショートカットのダブルクリックから起動するには「実行ポリシー」を変更しなければならないらしい。
そこで、ショートカットの「プロパティ」→「ショートカット」のリンク先の内容の最初に
powershell -ExecutionPolicy RemoteSigned -File を付加する。「Program Files」にある場合は「”~~”」が必要。
自動化ファイルの内容は
start -wait 起動ファイルの場所¥keepass.exe
$date = (Get-Date).ToString("yyyyMMdd")
copy-item ファイルの場所¥AAAA.kdbx 格納場所¥$date-AAAA.kdbx
そして、ショートカットのリンク先に
powershell -ExecutionPolicy RemoteSigned -File これを追加する。
これで、同一PC内ではあるが、ほぼ自動的にパックアップが取得できるようになった。格納場所の保存先をGoogle DriveやOne Driveに変更すればクラウド上に分散保存される。
パスワード管理のDBなので、容量は小さい。気付いた時点で保存時期の古い累積バックアップは、サクッと削除すれば、空き容量を逼迫しないだろう。
これからはバッチを作成する時には、CMD.exe対応ではなく、PowerShell対応のスクリプトファイルに変更しよう(時間があれば)。
投稿者 owner : 2021年10月21日