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対応のスクリプトファイルに変更しよう(時間があれば)。


https://www.ktservices3.com/

投稿者 owner : 2021年10月21日