前回の記事でクラウドフローとデスクトップフローの連携について紹介しました。
前回はPower Automate Desktop(PAD)の入出力変数を介して文字列の受け渡しを行いましたが、今回はファイルの受け渡し方法を考えてみます。
受け渡し方法としてはOneDriveアプリを使った同期等が考えられますが、今回は下図のようにファイルをBase64エンコードして、前回も使用した入出力変数での受け渡しを行います。
- OneDriveにあるテキストファイルをBase64エンコードしてPADに渡します。
- PAD側ではデコードしたファイルに文字列を追加した後、再度エンコードしてPower Automateに返します。
- デコードしたファイルを新しいテキストファイルとしてOneDriveに保存します。
Power Automate Desktopのフロー作成
まずはPAD側の処理です。
入出力変数
Power AutomateからBase64エンコードされた文字列を受け取る入力変数です。
- 変数の種類:入力
- 変数名:Base64In
- 外部名:Base64In
Power Automateからテキストファイルの名前を受け取る入力変数です。
- 変数の種類:入力
- 変数名:FileName
- 外部名:FileName
テキストファイルをBase64エンコードしてPower Automateに渡す出力変数です。
- 変数の種類:出力
- 変数名:Base64Out
- 外部名:Base64Out
フロー全体
Display.ShowMessageWithTimeout Title: $'''確認用''' Message: $'''ファイル名:%FileName% エンコードされた文字列:%Base64In%''' Icon: Display.Icon.Information Buttons: Display.Buttons.OK DefaultButton: Display.DefaultButton.Button1 IsTopMost: True Timeout: 3 ButtonPressed=> ButtonPressed SET FilePath TO $'''C:\\Test\\%FileName%''' # Power Automateから受け取ったBase64エンコードされた文字列をデコードしてテキストファイルとして保存 System.RunPowershellScript Script: $'''[System.IO.File]::WriteAllBytes(\"%FilePath%\", [System.Convert]::FromBase64String(\"%Base64In%\"))''' ScriptOutput=> PowershellOutput ScriptError=> ScriptError WAIT (File.Created File: FilePath) SET Contents TO $'''たちつてと なにぬねの はひふへほ''' File.WriteText File: FilePath TextToWrite: Contents AppendNewLine: True IfFileExists: File.IfFileExists.Append Encoding: File.FileEncoding.UTF8 # テキストファイルに文字列を追加してBase64エンコード System.RunPowershellScript Script: $'''[System.Convert]::ToBase64String([System.IO.File]::ReadAllBytes(\"%FilePath%\"))''' ScriptOutput=> PowershellOutput2 ScriptError=> ScriptError2 # 不要な文字を削除して出力変数としてPower Automateに渡す Text.Trim Text: PowershellOutput2 TrimOption: Text.TrimOption.Both TrimmedText=> Base64Out
1. メッセージを表示
Power Automateからフローが実行されたことを確認するためのメッセージボックスを表示します。
2. 変数の設定
デコードしたファイルを保存するためのパスを変数として設定します。
3. PowerShell スクリプトの実行
Power Automateから受け取ったエンコードされた文字列をデコードしてファイルとして保存するための、下記PowerShellスクリプトを実行します。
[System.IO.File]::WriteAllBytes("%FilePath%", [System.Convert]::FromBase64String("%Base64In%"))
4. ファイルを待機します
デコードしたファイルの作成が完了するまでの待機処理です。
5. 変数の設定
テキストファイルに追加する内容を変数として設定します。
6. テキストをファイルに書き込みます
- ファイル パス:%FilePath%
- 書き込むテキスト:%Contents%
- 新しい行を追加する:オン
- ファイルが存在する場合:内容を追加する
- エンコード:UTF-8
7. PowerShell スクリプトの実行
内容を追加したテキストファイルをエンコードしてPower Automateに渡すため、下記PowerShellスクリプトを実行します。
[System.Convert]::ToBase64String([System.IO.File]::ReadAllBytes("%FilePath%"))
8. テキストのトリミング
エンコードした文字列から不要な文字を削除し、出力変数の値として設定します。
以上でPADのフロー作成は完了です。
Power Automateのフロー作成
PADのフローの準備が出来たら、次にPower Automateのフローを作成します。
新規でインスタント クラウド フローを作成し、トリガーは手動とします。
フロー全体
1. パスによるファイル メタデータの取得
OneDriveにあるテキストファイルの情報を取得します。
2. パスによるファイル コンテンツの取得
テキストファイルの内容を取得します。
3. Power Automate Desktop で構築したフローを実行する
「デスクトップ フロー」コネクタでPADのフローを実行します。
・FileName:
@{outputs('パスによるファイル_メタデータの取得')?['body/Name']}
・Base64In:
@{base64(outputs('パスによるファイル_コンテンツの取得')?['body'])}
4. ファイルの作成
PADのフローから返ってきた文字列をデコードし、新規ファイルとして保存します。
・ファイル名:
PAD-@{outputs('パスによるファイル_メタデータの取得')?['body/Name']}
・ファイル コンテンツ:
@{base64ToBinary(outputs('Power_Automate_Desktop_で構築したフローを実行する')?['body/Base64Out'])}
以上でPower Automateのフロー作成は完了です。
実行画面
実行画面は下図の通りで、意図したとおりにフローが動いていることが確認できます。
以上のようにファイルをBase64エンコードすることで、入出力変数を介してクラウドフローとデスクトップフロー間でファイルのやりとりができました。
エンコード・デコードの手間は掛かりますが、Power Automate側もPAD側も難しい処理ではないので、ファイル連携を考えている方は是非一度お試しください。
この記事へのコメントはありません。