一文講透為Power Automate for Desktop (PAD) 實現自定義模組 – 附完整程式碼

概述

Power Automate for Desktop (以下簡稱PAD)是微軟推出的一款針對Windows桌面端的免費RPA(機器人流程自動化)工具,它目前默認會隨著Windows 11安裝,但也可以通過單獨下載安裝。

PAD 目前僅支援Windows 11和 Windows 10系統安裝使用。

我在 “全民RPA之微軟PAD入門培訓” 中的分享過,PAD 與其他RPA工具相比,有如下的一些優勢:

關於 PAD 的常規使用和入門指南,請參考官方文檔 //docs.microsoft.com/zh-cn/learn/paths/pad-get-started/, PAD 默認自帶了幾十個模組(module),數以百計的功能(action),可以滿足不同用戶在不同場景下的需求。值得注意的是,使用 PAD 並不需要電腦本科畢業,只要你具備一定的業務知識,以及基本的邏輯思維即可。

這篇文章(以及後續兩篇文章)將介紹如何為PAD開發自定義模組,根據自己的業務需求,實現特殊的邏輯和功能。

聲明

由於PAD這個產品還在不斷地發展中,目前官方並沒有公開的文檔對自定義模組開發進行描述。這幾篇文章所基於的經驗是技術社區摸索和交流所得,不代表官方意見和任何承諾。

目前中國有一個PAD愛好者的技術社區,QQ群號是 610-576-550,有需要的朋友也可以添加。這個是完全由以潘淳老師為核心的一群熱心愛好者運營的,潘老師在某銀行的科技與創新中心供職,在PAD等多個方面的造詣,以及他研究問題的方法,都讓我驚嘆和折服。

基本概念

本文演示環境是在 Windows 10 中文版,通過 單獨下載安裝PAD 的環境。

默認情況下,啟動PAD 後你會看到下面這個介面,這是所謂的控制台(console),用來顯示你當前所有的PAD流程,然後可以新建流程、修改環境和設置等。

點擊 新建流或點擊某個流程後會進入設計器(designer)介面。

上圖的左邊面板區域就是目前內置的模組(module)和操作(action),模組相當於是一個分類,用來組織一個或多個操作。

你可以拖動這些操作(action)到中間的設計器區域,用來設計你的流程。每個功能,都有一定的設置介面,用來幫助你設定輸入和輸出參數,例如

到這裡為止,你已經了解了PAD中主要的幾個核心概念

  1. 控制台 (Console)
  2. 設計器 (Designer)
  3. 模組 (Module)
  4. 操作 (Action)
  5. 流(Flow)

本文所提到的自定義PAD模組,就是開發符合業務需要的 模組(包括一個或多個操作),用來在設計器裡面提供給用戶使用,它們可以和內置的模組和操作一起來構成你的流程

準備開發環境

具體來說,我們將採用Visual StudioC# 語言,根據 PAD 所提供的 SDK (軟體開發工具包)進行開發。 請按照如下的提示準備開發環境。

Visual Studio 2022 社區版

這是完全免費的,你可以通過 //visualstudio.microsoft.com/zh-hans/thank-you-downloading-visual-studio/?sku=Community&channel=Release&version=VS2022&source=VSLandingPage&cid=2030&passive=false 下載安裝。

安裝Visual Studio 必要的組件

請至少確保安裝了下面兩個功能組件,.NET 桌面開發 這個組件會提供我們需要的項目模板,而 通用 Windows 平台開發 這個組件,你要選項至少一個 Windows 10 SDK(如果你看到多個的話),這個是為了得到一系列的工具,主要是一個我們後續用來做程式碼簽名的工具 signtool.exe

檢查 signtool 這個工具是否安裝正確

在磁碟上面搜索 signtool.exe 或者直接到這個目錄(C:\Program Files (x86)\Windows Kits\10\bin\10.0.19041.0\x64)中去找,請確保有這個工具。

創建並編輯項目

啟動Visual Studio 2022後,請選擇如下的模板來創建項目

⚠️ 經過測試發現,如果使用 .NET Core.NET Standard 類庫來創建項目,也能成功部署,甚至能測試成功,但無法保存流程,會產生錯誤。所以請一定要用 .NET Framework 的類庫。

給你的項目起一個合適的名字,請注意,名稱中需要包含 Modules 這幾個字元,下圖中的命名規範是推薦的。

項目創建好之後,我們來做一點最基本的修改,以確保實現一個最簡單的操作 action。首先,修改 AssemblyInfo.cs 這個文件,將 AssemblyTitle 修改得更短一點。

PAD 在在載入自定義模組時嘗試以這個 AssemblyTitle 的值作為模組的標識符(id),作為規範之一,它規定這個標識符不能包含標點符號。

接下來我們添加 PAD SDK的引用,其實說是SDK, 本質上就是兩個特殊的dll 而已,你可以在PAD 的安裝目錄(C:\Program Files (x86)\Power Automate Desktop)下面找到它們。你可以通過 添加引用 窗口來添加它們

點擊 瀏覽... 按鈕去找到它們,然後選中,最後點擊 確定按鈕

接下來就可以修改一下 Class1.cs 這個文件了。我建議將其重命令成 HelloAction.cs(選中文件,然後按 F2 鍵重命名),任何時候保持一個好的命名規範都會讓你事半功倍。

最後,修改程式碼如下

using Microsoft.Flow.RPA.Desktop.Modules.SDK;
using Microsoft.Flow.RPA.Desktop.Modules.SDK.Attributes;
using Microsoft.Flow.RPA.Desktop.Modules.SDK.Extended.Attributes;
using System;

namespace Xizhang.Modules.Helloworld.Actions
{
    [Action(Id = "Hello")]
    [Icon(Code = "EEE7")]
    public class HelloAction : ActionBase
    {
        [InputArgument]
        public string Name { get; set; }

        [OutputArgument]
        public string Result { get; set; }
        public override void Execute(ActionContext context)
        {

            Result = String.Format("Hello,{0}", Name);
        }
    }
}

這個程式碼很簡潔,我們讓 HelloAction 繼承 ActionBase 類,然後實現了它的 Execute 方法。在這個操作(action)中,我們定義了一個輸入參數和一個輸出參數。另外還用到了幾個 Attribute 來自操作進行描述,例如它的id, 和Icon。

值得注意的是,這裡的Icon是一個字元串,據說是PAD 有一個內置的圖標文件,有一系列的圖標,每個圖標都有一個自己的編號。這裡先用 EEE7吧。

準備簽名證書

PAD 規定所有的自定義模組源程式碼必須要進行數字簽名,以確保不被濫用。正常情況下,你需要擁有一個真正合法的證書(每年要花一定的銀子續費),但在開發測試階段,或者小範圍使用的話,你可以利用自簽名證書來實現。

通過Windows 自帶的PowerShell 可以輕鬆地生成自簽名證書,請在管理員模式下打開PowerShell,並執行下面的命令

$cert = New-SelfSignedCertificate -Subject Xizhang.PAD.Actions.Cert -Type CodeSigningCert

然後將這個證書導出私鑰

$cert | Export-PfxCertificate `
  -Password (ConvertTo-SecureString -AsPlainText -Force "password") `
  -FilePath Xizhang.PAD.Actions.Cert.pfx

最後,你需要把這個證書安裝到本地電腦的信任根頒發機構中去。找到這個pfx文件,雙擊即可安裝。

點擊兩次 下一步,在下面介面輸入密碼

點擊下一步,將證書安裝到 受信任的根證書頒發機構

然後點擊下一步,完成安裝,在下圖中點擊 即可。

對項目進行簽名

有了證書,接下來就可以對我們開發好的自定義模組進行簽名了。你可以通過在項目屬性中添加 生成事件來自動化完成這個工作。

這個命令大致如下,你要修改的是其中的證書路徑部分,請用你的實際路徑替換 c:/users/chenxizhang/Xizhang.PAD.Actions.Cert.pfx

"C:\Program Files (x86)\Windows Kits\10\bin\10.0.19041.0\x64\signtool.exe" sign /tr //timestamp.digicert.com /f c:/users/chenxizhang/Xizhang.PAD.Actions.Cert.pfx /p password $(AssemblyName).dll

按下 CTRL+SHIFT+B 對解決方案進行生成,然後到生成目錄中去找到對應的程式集

查看這個程式集的屬性,來確認它是否已經正確地被簽名

選中籤名資訊,點擊 詳細資訊 按鈕的話,可以進一步查看證書

部署到PAD的自定義模組目錄

到現在為止,我們基本上準備就緒了。其實就是按照SDK提供的基礎類型(ActionBase),以及遵守一些規範,少量的程式碼,另外就是要對程式集簽名而已。

接下來我們看看把這個程式集部署到自定義模組目錄中去,這個過程也很簡單,首先複製如下的文件(包括主程式集文件,以及它的依賴程式集)

然後轉到PAD的 安裝目錄,通常是 C:\Program Files (x86)\Power Automate Desktop,在裡面創建一個子目錄 custom-modules(如果該目錄不存在的話),然後把你的文件粘貼進去即可。請注意,此時最好把PAD完全關閉

驗證功能

接下來就是最激動人心的時刻了。你現在可以重新打開PAD的控制台,然後新建一個流程,進入設計器介面。

我們果然看到了左側的操作欄面板,出現了一個新的分類 自定義操作,而我剛才自定義開發的模組和操作也出現在這裡了。下面我把 HelloAction 拖到設計器中間區域,它也會彈出了一個對話框,讓我輸入參數(這裡是 Name)。

看起來不錯,我保存後運行一下,確實能看到它正確地輸出了內容。

為自定義組件實現多語言支援

我們的自定義組件已經能正確工作了。但美中不足的是,它在中文版上面可能不是很友好,它的名稱,描述,參數等文字資訊,如果能也顯示中文就更好了吧。下面看看如何添加這個能力。

回到Visual Studio 項目屬性介面中來,請點擊下圖中央位置的鏈接創建資源文件。

你會看到如下的介面

我們需要為模組名稱、描述,操作名稱、描述,輸入輸出參數名稱、描述等定義資源。它們遵守一定的規範,那就是在相應對象的後面用 _FriendlyName 表示名稱,用 _Description 表示描述。

那麼,到底用什麼來表示模組對象呢?其實就是剛才我們提到的在 AssemblyInfo.cs 文件中定義的 AssemblyTitle 這個資訊,還記得嗎?
操作的名稱,就是它的類名稱。例如本例中的 HelloAction。操作的輸入輸出參數名稱,需要以 操作名稱_屬性名稱 來定義,例如本例中的 Name 這個輸入參數,我們在定義資源文件時就用 HelloAction_Name 來表示它。

掌握了如上的規範,你就可以很輕鬆地定義不同語言的資源文件了,例如下圖所示是默認的資源文件(也就是英文)。實際上,即便不提供資源文件,我們的自定義模組都已經正常工作了,那個情況下,它會直接使用上述對象的字面文字作為資源。

然後添加另外一個資源文件。你將看到如下這樣的介面,請注意名稱也是Resources, 但是加了一個 zh-Hans的限定符,這表示它是用來為簡體中文提供支援的資源文件。

根據英文版那個資源文件依葫蘆畫瓢,你可以定義如下的一個簡體中文版

這裡有一個實用技巧就是,你可以選中英文版資源文件的左上角的區域(下圖中的紅色區域),複製全部,然後在簡體中文版的資源文件,同樣選中左上角的區域,粘貼,就可以快速地把所有定義好的資源複製過來,然後直接修改即可。

再次編譯一下解決方案,你可以看到輸出目錄中的 zh-Hans 子目錄中會多出來幾個文件

需要注意的是,這個文件中只包含了資源定義,並且它同樣是要進行簽名的,所以我可以修改一下生成事件

"C:\Program Files (x86)\Windows Kits\10\bin\10.0.19041.0\x64\signtool.exe" sign /tr //timestamp.digicert.com /f c:/users/chenxizhang/Xizhang.PAD.Actions.Cert.pfx /p password $(AssemblyName).dll

"C:\Program Files (x86)\Windows Kits\10\bin\10.0.19041.0\x64\signtool.exe" sign /tr //timestamp.digicert.com /f c:/users/chenxizhang/Xizhang.PAD.Actions.Cert.pfx /p password "zh-Hans/$(AssemblyName).resources.dll"

你可以同樣的方式確認一下這個新的資源文件程式集也同樣被簽名了

接下來我們重新部署一下,這次要複製的文件需要包含 zh-Hans 目錄哦,請注意必須把PAD關閉才能完成複製。

複製過去後的目錄結構如下

你現在可以重新打開PAD的控制台,然後新建一個流程,進入設計器介面。

你會發現,現在我們的自定義模組已經全部用中文了。這樣對於中文用戶的體驗就很好了。

⚠️ 請注意,經測試發現,有時候直接替換程式集,可能因為PAD有快取的原因(也可以是一個bug),看不到效果。需要等一段時間,或者乾脆把custom-modules目錄的內容複製出來,清空一下,然後開一下PAD,這樣可以刷新一下快取,然後把內容複製回來,再開PAD就可以了。

多語言高級技巧

其實還有兩個高級技巧,一個是為操作(action)添加一個更加直觀的匯總資訊(Summary),這個的好處是同一個操作,在不同地方使用時,根據參數不同,可以在介面上顯示不同的內容。另外一個問題,在程式碼中,可能也需要有輸出文本資訊,這個資訊也需要做多語言。下面分別講解這兩個問題如何解決。

添加操作的匯總資訊

這個也不難,我們需要在資源文件中添加一個特殊的鍵值:操作名稱_Summary,例如本例為 HelloAction_Summary,另外值得注意的是,在這個文字中,可以引用輸入輸出參數名,以便顯示更加相關的資訊。引用的方式是 <參數名>, 但要求參數名全部大寫 ,例如本例為 <NAME> <RESULT>

重新部署後,我們可以看到如下的效果

為程式碼中的文本做多語言處理

我們來看一下目前這個程式碼的邏輯,下圖所示關鍵程式碼就是對輸入參數(Name)做了一個格式化,然後將其賦值給輸出變數(Result)

很顯然,這個字元串也應該做多語言處理。那麼我們來看一下怎麼處理吧。首先,我們仍然是需要在兩個資源文件中分別定義在不同語言應該怎麼輸出這個消息。

然後,用如下的程式碼替換掉原先的程式碼

Result = String.Format(Properties.Resources.Messages_SayHello, Name);

完美,這樣就可以自動根據當前的語言版本用不同的消息給用戶打招呼了。請看下面的例子

總結

本文完整地給大家介紹了PAD自定義模組開發的全過程,包括創建項目,修改功能,程式碼簽名,部署測試,以及多語言處理等,希望對大家有所幫助。

本文隨附程式碼,請通過 //github.com/chenxizhang/pad-custom-module-quickstart 進行訪問,可以自行克隆在本地編譯,按照步驟在你的電腦上面安裝和部署。