PowerAutomateDesktopで暗号化ZIPを解凍してみた
2021/03/02にPowerAutomateDesktopが発表されたことで、早速触ってみました。せっかくなんで実業務に使えそうなサンプルを作ってみたいと思います。
前提
この記事の内容に不備や誤解を招く表現があっても、一切の責任を負いません。読者自身の判断で参考にしてください。また、記載した情報は2021/03/03時点の内容になります。
やりたいこと
1.ダウンロードフォルダから対象ファイル(TETS*.zip)を検出
2.固定文字+'yyyyMMdd'なパスワードが設定されている。今回は'PASS20210303'が設定されているとします。
3.解凍する
フロー作成
こんな感じでテストフローという名称で作成。
現在日時を保管
「アクション>日時>現在の日時を取得します」を選び、マウスでドラッグアンドドロップすると下記の画面になります。
保存するだけで、変数 CurrentDateTimeに現在日時が保存される処理が完成します。
10日前の日付を保管
「アクション>日時>日付の減算」を選び、マウスでドラッグすると下記の画面になります。「アクション>日時>日付の減算」では無いので注意してください。「日付の減算」の処理結果はTimeDifferenceとなり、TimeSpan型に相当する戻りになるためです。
ここでは日時に先程取得した、フロー変数CurrentDateTimeの値を使用したいのですが、%CurrentDateTime%というように変数名の前後に%をつけてください。これが変数を指定する方法のようです。
標準でResultedDateという変数に格納されますので、頭の片隅で覚えておいてください。
ダウンロードフォルダのTEST*.zipを取得
「アクション>フォルダー>フォルダ内のファイルを取得」をマウスでドラッグアンドドロップしてください。ここでダウンロードフォルダ内のTEST*.zipのファイル一覧を取得するよう設定します。複数のファイルが対象になる可能性があるため、あくまで該当ファイルの一覧を取得するだけです。
今回はサブフォルダは含めないことにします。また、ファイルの一覧情報を格納する変数はわかりやすいようにFilesからZipFilesに変更しました。今変更は変数名Filesをクリックすると下記のようになり変更できます。
ここまでのフローはこんな感じになります。
ファイル一覧を1つずつ解凍する
続いて、ファイルの一覧からファイルごとの処理を組み込みます。「アクション>ループ>For each」をマウスでドラッグアンドドロップします。
続いて、反復処理を行う値の欄に、先程のZipFilesを指定します。%ZipFiles%とパーセントを忘れずに。また生成された変数の部分も後ほどわかり易いように%CurrentItem%から%CurrentFile%に変えました。
for eachという部分はプログラミング経験のあった方には馴染みがあると思いますが、未経験の方に向けて説明すると「Excelで複数のセルを選択した状態でタブキーを押している」状態です。いくつかあるうちのどれか一つのセルを選んでいることになります。今回のケースだと、対象ファイルが10ファイル合った場合、その中のどれか1つを選んだものが入っているのが、%CurrentFile%になります。また、それぞれ一回しか処理されません。10ファイルあったら、foreach内の処理は取得したファイルを1つずつ10回処理します。
解凍用のパスワードを生成
次に、Zipファイルを回答するためのパスワードを生成します。「アクション>テキスト>datetimeをテキストに変換」をマウスでドラッグアンドドロップしてください。
10日前の日付を保管している変換ResultedDateを使って、パスワード解凍用の文字列を作ります。ここでは、"PASS20210303"というパスワードが設定されていると仮定します。
ここが悩みどころだったのですが、カスタム形式はExcelの書式設定に近い形になります。今回の場合、'PASS'yyyyMMdd と指定することで期待する文字列になりました。'PASS' + yyyyMMdd とか試すと下記のようにそのまま変数に格納さるので注意してください。
実行中の変数を確認する(ブレークポイント)
下記のようにフローのアクションごとに振られている連番部分をクリックすると赤丸が付きます。この状態で実行すると、その処理前で中断できます。
Zipファイルを解凍する
では圧縮ファイルを解凍しますので、「アクション>圧縮>ファイルの解凍」をマウスでドラッグアンドドロップしてください。
アーカイブパスには %CurrentFile% を指定してください。宛先フォルダは、Downloadsと同じ階層に、Testフォルダを作成しそこに解凍します。パスワードの指定箇所については、下の図のように「変数としてのパスワード入力」を指定してください。
変数のスペルミスするとどうなるか?
変数のスペルミスをすると、下記のようになります。変数が存在しない事を教えてくれますので、都度修正してください。
Zipファイルのパスワードが違うとどうなるか?
下記のように「有効なZIPアーカイブではないか、パラメータが設定されていません」エラーになります。
過去10日間に遡ってパスワードを試したいのでこれでは困ります。
ラベルを使って再実行する処理の位置を設定する
「アクション>フローコントロール>ラベル」をマウスでドラッグアンドドロップしてください。
ラベル名にはわかり易く、 RetryUnzip としました。これでプログラムをここへ飛ばす目印ができました。そうそう、ラベルを設置する位置には気をつけてください。
解凍時のエラーから飛ばす
では、解凍時のアクション7「ファイルの解凍」をダブルクリックしてください。この画面で左下のエラー発生時をクリックしてください。
それから、「フロー実行を続行する」をクリックし、その下にあるコンボボックスから「ラベルに移動」を選んでください。すると、右側のコンボボックで先程設定した RetryUnzip が選べるはずです。
日付を増やす処理を組み込む
これで解凍に失敗すると再度処理しようとします。が、パスワードが変わっていません。そこで、「アクション>日時>加算する日時」をマウスでドラッグアンドドロップし、下記のように %ResultDate% に1日加算するように指定します。
アクションの流れは下記のイメージです。
加算する日時とラベルの設置位置などは、非常に重要なので注意してください。おかしいと思ったらブレークポイントを設定して、アクションごとに進めて変数の変化をたどってください。
無限ループを防止する
このままでも処理できそうですが、想定しているパスワードが設定されていない場合、永久に処理が終わりません。そこで、「アクション>日時>日付の減算」をマウスでドラッグアンドドロップします。
上記のように %CurrentDateTime% から %ResultedDate% を引きます。その結果を、%TimeDifference% に格納します。
日時の差が0日になったら解凍を諦める
先ほど求めた %TimeDifference% が0になったら解凍を諦めます。「アクション>条件>If」をマウスでドラッグアンドドロップしてください。
ただ、念の為0以下になったら処理を抜けるようにしておきます。
ループを抜けるアクションは、「アクション>ループ>ループを抜ける」です。これをマウスでドラッグアンドドロップし、IfとEndの間に入れてください。
こんな感じになっているはずです。
実行してみると・・・
解凍できませんね。アクション8「ループを抜ける」にブレークポイントを設定してみます。
ZipPassが PASS20210302 なのにループ抜けてます。 動かしてみると解かるのですが、これは日付を加算するタイミングと判定のタイミングがずれています。本来、もっときれいに治す方法を考えたいのですが、この記事を早く公開するためにスピードを優先しますw
上記のようにアクション7の If条件の判定条件を 0 から -1 に変更してください。これで無事解凍できましたか?できない場合は、管理者権限が無いとファイルを作成でいない場所に解凍しようとしていないかあたりを確認してみてください。
日本語ファイル名はまだ扱えない
まだまだ、日本語は正しく扱えないようです。今後のバージョナップに期待しています。
モチベーションが上がったら、現時点の取れる対策について投稿したいと思います。
注意事項
この記事の内容に間違いや、誤解を招く表現があっても、著者かわはらは一切責任を負いません。各個人の責任においてこの記事を参考にしてください。
また、自動化ツールは誤った使い方をすると、職場で利用するに当たり、ネットワークフォルダに対して実行すると、ファイル全削除といった大事故につながる可能性があります。
重要な業務を作り込んでも、Microsoftアカウントに対してフローは保存されています。無償利用時はフローを他の人に渡す方法がありませんので、理解した上でお使いください。
個人のMicrosoftアカウントを職場のPCで利用すると、職務規定やPC利用規定などに抵触する可能性があります。システム部門、なければ総務部門などに確認の上でご利用ください。
この記事が気に入ったらサポートをしてみませんか?