แชร์ผ่าน


สร้างการดำเนินการ Power Automate สำหรับเดสก์ท็อป โดยใช้ Actions SDK

บทความนี้จะอธิบายวิธีสร้างการกระทำแบบกำหนดเองใน Power Automate สำหรับเดสก์ท็อป

การสร้างการดำเนินการแบบกำหนดเอง

สำคัญ

คำสำคัญที่สงวนไว้ไม่สามารถใช้เป็นชื่อการดำเนินการและ/หรือคุณสมบัติการดำเนินการได้ การใช้คำสำคัญที่สงวนไว้เป็นชื่อการดำเนินการและ/หรือคุณสมบัติการดำเนินการส่งผลให้เกิดการทำงานที่ผิดพลาด ข้อมูลเพิ่มเติม: คีย์เวิร์ดที่สงวนไว้ในโฟลว์เดสก์ท็อป

เริ่มด้วยการสร้างโครงการ Class Library (.NET Framework) ใหม่ เลือก .NET framework เวอร์ชัน 4.7.2

หากต้องการสร้างการดำเนินการในโมดูลที่กำหนดเองที่สร้างขึ้น:

  • ลบไฟล์ Class1.cs ที่สร้างขึ้นโดยอัตโนมัติ
  • สร้างคลาสใหม่ในโครงการของคุณเพื่อแสดงการดำเนินการแบบกำหนดเองโดยตั้งชื่อที่แตกต่างออกไป
  • รวมเนมสเปซ Microsoft.PowerPlatform.PowerAutomate.Desktop.Actions.SDK และ Microsoft.PowerPlatform.PowerAutomate.Desktop.Actions.SDK.Attributes
  • คลาสทั้งหมดที่แสดงถึงการดำเนินการควรมีแอตทริบิวต์ [Action] เหนือคลาสของคุณ
  • คลาสควรมีสิทธิ์เข้าถึงแบบสาธารณะและสืบทอดจากคลาส ActionBase
using System;
using Microsoft.PowerPlatform.PowerAutomate.Desktop.Actions.SDK;
using Microsoft.PowerPlatform.PowerAutomate.Desktop.Actions.SDK.Attributes;

namespace Modules.MyCustomModule
{
    [Action(Id = "CustomAction")]
    public class CustomAction : ActionBase
    {
        public override void Execute(ActionContext context)
        {
            throw new NotImplementedException();
        }
    }
}

การดำเนินการส่วนใหญ่สามารถมีพารามิเตอร์ (อินพุตหรือเอาต์พุต) พารามิเตอร์อินพุตและเอาต์พุตแสดงด้วยคุณสมบัติ C# แบบคลาสสิก แต่ละคุณสมบัติควรมีแอตทริบิวต์ C# ที่เหมาะสม [InputArgument] หรือ [OutputArgument] เพื่อกำหนดชนิดและวิธีการแสดงใน Power Automate สำหรับเดสก์ท็อป อาร์กิวเมนต์อินพุตยังสามารถมีค่าเริ่มต้นได้เช่นกัน

using System.ComponentModel;
using Microsoft.PowerPlatform.PowerAutomate.Desktop.Actions.SDK;
using Microsoft.PowerPlatform.PowerAutomate.Desktop.Actions.SDK.Attributes;

namespace Modules.MyCustomModule
{
    [Action(Id = "CustomAction")]
    public class CustomAction : ActionBase
    {
        [InputArgument, DefaultValue("Developer")]
        public string InputName { get; set; }

        [OutputArgument]
        public string DisplayedMessage { get; set; }

        public override void Execute(ActionContext context)
        {
            DisplayedMessage = $"Hello, {InputName}";
        }
    }
}

การเพิ่มคำอธิบายให้กับการดำเนินการแบบกำหนดเอง

เพิ่มคำอธิบายและชื่อที่จำง่ายสำหรับโมดูลและการดำเนินการต่างๆ เพื่อให้นักพัฒนา RPA รู้วิธีใช้ประโยชน์สูงสุด

ตัวอออกแบบ Power Automate สำหรับแบบเดสก์ท็อปจะแสดงชื่อที่จำง่ายและคำอธิบาย

คุณสามารถสร้างไฟล์ "Resources.resx" ภายในโฟลเดอร์ Properties ของโครงการโมดูล ไฟล์ ".resx" ใหม่ควรมีชื่อว่า "Resources.resx"

รูปแบบของคำอธิบายสำหรับโมดูลและการดำเนินการควรเป็นดังนี้:

"Module_Description" หรือ "Action_Description" และ "Module_FriendlyName" หรือ "Action_FriendlyName" ตามลำดับในฟิลด์ชื่อ คำอธิบายในฟิลด์ค่า

เราขอแนะนำให้คุณระบุคำอธิบายและชื่อที่จำง่ายสำหรับพารามิเตอร์ด้วย รูปแบบควรเป็นดังนี้: "Action_Parameter_Description", "Action_Parameter_FriendlyName"

ภาพหน้าจอของแหล่งข้อมูลสำหรับการดำเนินการแบบง่าย

เคล็ดลับ

ขอแนะนำให้ระบุว่าคุณกำลังอธิบายอะไรในฟิลด์ความคิดเห็น (เช่น โมดูล การดำเนินการ ฯลฯ)

นอกจากนี้ยังสามารถตั้งค่าเหล่านี้ได้ด้วยคุณสมบัติ FriendlyName และ Description ของแอตทริบิวต์ [InputArgument], [OutputArgument] และ [Action]

นี่คือตัวอย่างของไฟล์ Resources.resx สำหรับโมดูลที่กำหนดเอง

ภาพหน้าจอของทรัพยากร

อีกวิธีในการเพิ่มชื่อที่จำง่ายและคำอธิบายให้กับการดำเนินการและพารามิเตอร์อย่างรวดเร็วคือ การใช้คุณสมบัติ FriendlyName และ Description ในแอตทริบิวต์ [Action], [InputArguement] และ [OutputArguement]

หมายเหตุ

หากต้องการเพิ่มชื่อและคำอธิบายที่จำง่ายให้กับโมดูล คุณต้องแก้ไขไฟล์ .resx ที่เกี่ยวข้อง หรือเพิ่มแอตทริบิวต์ C# ที่เกี่ยวข้อง

การแปลแหล่งข้อมูลเป็นภาษาท้องถิ่น

ภาษาเริ่มต้นสำหรับโมดูลใน Power Automate สำหรับเดสก์ท็อปจะถือว่าเป็นภาษาอังกฤษ

ไฟล์ Resources.resx ควรเป็นภาษาอังกฤษ

ภาษาอื่นๆ สามารถเพิ่มได้ด้วยไฟล์ Resources.{locale}.resx พิเศษสำหรับการแปลเป็นภาษาท้องถิ่น ตัวอย่างเช่น Resources.fr.resx

ประเภทโมดูลที่กำหนดเอง

โมดูลสามารถมีประเภทและประเภทย่อยเพื่อการจัดระเบียบการดำเนินการให้ดีขึ้น

หากต้องการแยกการดำเนินการแบบกำหนดเองในประเภท ประเภทย่อย ให้แก้ไขแอตทริบิวต์ [Action] ที่นำหน้าคลาสที่แสดงการดำเนินการแบบกำหนดเองในลักษณะต่อไปนี้:

[Action(Category = "category.subcategory")]

หมายเหตุ

โมดูลสามารถมีได้หลายประเภท ในทำนองเดียวกัน ประเภทสามารถประกอบด้วยประเภทย่อยได้ โครงสร้างนี้สามารถเป็นแบบไม่จำกัดได้

คุณสมบัติ ลำดับ แสดงลำดับการแสดงตัวอย่างการดำเนินการในตัวออกแบบ

Action1 อยู่ในหมวดหมู่ "TestCategory" และเป็นการดำเนินการแรกของโมดูล (วิธีนี้คุณจะอธิบายลำดับและหมวดหมู่ด้วยตัวอย่าง)

[Action(Id = "Action1", Order = 1, Category = "TestCategory")]

การดำเนินการของเงื่อนไข

การดำเนินการตามเงื่อนไขเป็นการดำเนินการที่ส่งคืนค่า "จริง" หรือ "เท็จ" การดำเนินการ 'ถ้ามีไฟล์อยู่' ของ Power Automate สำหรับเดสก์ท็อปของไลบรารีมาตรฐานเป็นตัวอย่างที่ดีของการดำเนินการแบบมีเงื่อนไข

ตัวอย่างการดำเนินการแบบมีเงื่อนไข:

using Microsoft.PowerPlatform.PowerAutomate.Desktop.Actions.SDK;
using Microsoft.PowerPlatform.PowerAutomate.Desktop.Actions.SDK.Attributes;
using System;
using System.ComponentModel;

namespace Modules.CustomModule
{
    [ConditionAction(Id = "ConditionalAction1", ResultPropertyName = nameof(Result))]
    [Throws("ActionError")] // TODO: change error name (or delete if not needed)
    public class ConditionalAction1 : ActionBase
    {
        #region Properties

        public bool Result { get; private set; }

        [InputArgument]
        public string InputArgument1 { get; set; }

        #endregion

        #region Methods Overrides

        public override void Execute(ActionContext context)
        {
            try
            {
                //TODO: add action execution code here
            }
            catch (Exception e)
            {
                if (e is ActionException) throw;

                throw new ActionException("ActionError", e.Message, e.InnerException);
            }
        }

        #endregion
    }
}

สังเกตตัวแปรแบบบูลีนที่เป็น ผลลัพธ์

การดำเนินการ ถ้ามีไฟล์อยู่ จะไม่มีอาร์กิวเมนต์เอาต์พุต สิ่งที่ส่งคืนจะเป็นจริงหรือเท็จ ขึ้นอยู่กับว่าตัวแปรแบบบูลีนที่เป็น ผลลัพธ์ เก็บค่าใด

ตัวเลือกการดำเนินการแบบกำหนดเอง

มีบางกรณีที่การดำเนินการแบบกำหนดเองอาจจำเป็นต้องมีมากกว่าหนึ่งรูปแบบ

ตัวอย่างคือการดำเนิกนาร "เรียกใช้ Excel" จากไลบรารีการดำเนินการมาตรฐาน

การใช้ตัวเลือก "ด้วยเอกสารเปล่า" โฟลว์จะเปิดใช้เอกสาร Excel เปล่า ในขณะที่การใช้ตัวเลือก "และเปิดเอกสารต่อไปนี้" จำเป็นต้องมีพาธไฟล์ของไฟล์ที่จะเปิด

ภาพหน้าจอของตัวเลือกการดำเนินการ เปิดใช้งาน Excel

การดำเนินการสองอย่างที่กล่าวถึงข้างต้นคือสองตัวเลือกของการดำเนินการพื้นฐาน "เปิดใช้งาน Excel"

เมื่อสร้างการดำเนินการแบบกำหนดเอง คุณไม่จำเป็นต้องเขียนฟังก์ชันการทำงานใหม่

คุณสามารถสร้างการดำเนินการ "พื้นฐาน" เดียว ตั้งค่าพารามิเตอร์อินพุตและเอาต์พุต จากนั้นเลือกสิ่งที่จะมองเห็นได้ในแต่ละอย่างโดยใช้ตัวเลือกการดำเนินการ

ด้วยตัวเลือกการดำเนินการ สามารถเพิ่มระดับของสิ่งที่เป็นนามธรรมเหนือการดำเนินการเดียว ทำให้สามารถดึงฟังก์ชันการทำงานเฉพาะจากการดำเนินการ "พื้นฐาน" เดียวได้โดยไม่ต้องเขียนโค้ดใหม่เพื่อสร้างรูปแบบใหม่ของการดำเนินการเดียวกันทุกครั้ง

คิดว่าตัวเลือกเป็นทางเลือก กรองการดำเนินการเดียวและนำเสนอเฉพาะข้อมูลที่จำเป็นตามตัวเลือกที่เกี่ยวข้อง

ภาพหน้าจอของแผนผังตัวเลือกการดำเนินการ

หากต้องการสร้างตัวเลือกการดำเนินการใหม่ ให้สร้างการดำเนินการพื้นฐานที่จะใช้โดยตัวเลือกก่อน

การดำเนินการส่วนกลางต้องการคุณสมบัติแบบบูลีนหรือ enum เป็นอาร์กิวเมนต์ C# ของอินพุต

ค่าของคุณสมบัตินี้กำหนดว่าจะใช้ตัวเลือกใด

วิธีที่พบมากที่สุดคือการใช้ enum โดยเฉพาะอย่างยิ่งเมื่อต้องการมากกว่าสองตัวเลือก enum เป็นตัวเลือกเดียว

สำหรับกรณีตัวเลือกสองกรณี สามารถใช้ค่าแบบบูลีนได้

คุณสมบัตินี้ หรือที่เรียกว่าอาร์กิวเมนต์ข้อจำกัด ต้องมีค่าเริ่มต้น

การดำเนินการส่วนกลางถูกประกาศเป็นการดำเนินการแบบคลาสสิก

สังเกตว่าคุณสมบัติแรก (อาร์กิวเมนต์ของอินพุต) คือ enum ตัวเลือกที่เหมาะสมจะทำงานขึ้นอยู่กับค่าของคุณสมบัตินั้น

หมายเหตุ

หากต้องการเรียงลำดับอาร์กิวเมนต์ในลักษณะที่คุณต้องการ คุณต้องตั้งค่าลำดับถัดจากแอตทริบิวต์ InputArgument

using System.ComponentModel;
using Microsoft.PowerPlatform.PowerAutomate.Desktop.Desktop.Actions.SDK;
using Microsoft.PowerPlatform.PowerAutomate.Desktop.Desktop.Actions.SDK.Attributes;

namespace Modules.CustomModule
{
    [Action(Id = "CentralCustomAction")]
    public  class CentralCustomAction : ActionBase
    {
        #region Properties

        [InputArgument, DefaultValue(SelectorChoice.Selector1)]
        public SelectorChoice Selector { get; set; }

        [InputArgument(Order = 1)]
        public string FirstName { get; set; }

        [InputArgument(Order = 2)]
        public string LastName { get; set; }

        [InputArgument(Order = 3)]
        public int Age { get; set; }

        [OutputArgument]
        public string DisplayedMessage { get; set; }

        #endregion

        #region Methods Overrides

        public override void Execute(ActionContext context)
        {
            if (Selector == SelectorChoice.Selector1)
            {
                DisplayedMessage = $"Hello, {FirstName}!";
            }
            else if (Selector == SelectorChoice.Selector2)
            {
                DisplayedMessage = $"Hello, {FirstName} {LastName}!";
            }
            else // The 3rd Selector was chosen 
            {
                DisplayedMessage = $"Hello, {FirstName} {LastName}!\nYour age is: {Age}";
            }
        }

        #endregion
    } // you can see below how to implement an action selector
}

ตัวเลือกการดำเนินการแบบกำหนดเองโดยใช้ enum

ในตัวอย่างนี้ คุณสร้างตัวเลือกสามรายการ enum แบบง่ายกำหนดตัวเลือกที่เหมาะสมในแต่ละครั้ง:

public enum SelectorChoice
{
    Selector1,
    Selector2,
    Selector3
}

ตัวเลือกแสดงโดยคลาส

คลาสเหล่านั้นต้องสืบทอดคลาส ActionSelector<TBaseActionClass>

หมายเหตุ

TBaseActionClass เป็นชื่อคลาสการดำเนินการพื้นฐาน

ในวิธีการ UseName() ชื่อของตัวเลือกการดำเนินการจะถูกประกาศ สิ่งนี้ใช้เป็นชื่อของการดำเนินการที่จะแก้ไขแหล่งข้อมูล

public class Selector1 : ActionSelector<CentralCustomAction>
{
    public Selector1()
    {
        UseName("DisplayOnlyFirstName");
        Prop(p => p.Selector).ShouldBe(SelectorChoice.Selector1);
        ShowAll();
        Hide(p => p.LastName);
        Hide(p => p.Age);
        // or 
        // Show(p => p.FirstName); 
        // Show(p => p.DisplayedMessage);
    }
}

หมายเหตุ

ไม่ควรประกาศคลาส ตัวเลือก เป็นการดำเนินการ การดำเนินการเดียวคือการดำเนินการส่วนกลาง ตัวเลือกทำหน้าที่เป็นตัวกรอง

ในตัวอย่างเฉพาะนี้ เราต้องการแสดงอาร์กิวเมนต์เพียงรายการเดียว ดังนั้นรายการอื่นๆ จะถูกกรองออก ในทำนองเดียวกันสำหรับ Selector2:

public class Selector2 : ActionSelector<CentralCustomAction>
{
    public Selector2()
    {
        UseName("DisplayFullName");
        Prop(p => p.Selector).ShouldBe(SelectorChoice.Selector2);
        ShowAll();
        Hide(p => p.Age);
    }
}

และคลาส Selector3:

public class Selector3 : ActionSelector<CentralCustomAction>
{
    public Selector3()
    {
        UseName("DisplayFullDetails");
        Prop(p => p.Selector).ShouldBe(SelectorChoice.Selector3);
        ShowAll();
    }
}

การดำเนินการขั้นสุดท้ายทำได้โดยใช้วิธีการ Execute(ActionContext context) ที่อยู่ในการดำเนินการส่วนกลาง ค่าที่กรองตามลำดับจะแสดงขึ้นตามตัวเลือก

public override void Execute(ActionContext context)
{
    if (Selector == SelectorChoice.Selector1)
    {
        DisplayedMessage = $"Hello, {FirstName}!";
    }
    else if (Selector == SelectorChoice.Selector2)
    {
        DisplayedMessage = $"Hello, {FirstName} {LastName}!";
    }
    else // The 3rd Selector was chosen 
    {
        DisplayedMessage = $"Hello, {FirstName} {LastName}!\nYour age is: {Age}";
    }
}

ตัวเลือกการดำเนินการแบบกำหนดเองโดยใช้ค่าแบบบูลีน

ต่อไปนี้คือตัวอย่างการใช้ค่าแบบบูลีนแทน enum

using System.ComponentModel;
using Microsoft.PowerPlatform.PowerAutomate.Desktop.Actions.SDK;
using Microsoft.PowerPlatform.PowerAutomate.Desktop.Actions.SDK.ActionSelectors;
using Microsoft.PowerPlatform.PowerAutomate.Desktop.Actions.SDK.Attributes;

namespace Modules.CustomModule
{
    [Action]
    public class CentralCustomActionWithBoolean : ActionBase
    {
        #region Properties

        [InputArgument, DefaultValue(true)]
        public bool TimeExpired { get; set; }

        [InputArgument]
        public string ElapsedTime { get; set; }

        [InputArgument]
        public string RemainingTime { get; set; }

        [OutputArgument]
        public string DisplayedMessage { get; set; }

        #endregion

        #region Methods Overrides

        public override void Execute(ActionContext context)
        {
            DisplayedMessage = TimeExpired ? $"The timer has expired. Elapsed time: {ElapsedTime}" : $"Remaining time: {RemainingTime}";
        }

        #endregion
    }

    public class NoTime : ActionSelector<CentralCustomActionWithBoolean>
    {
        public NoTime()
        {
            UseName("TimeHasExpired");
            Prop(p => p.TimeExpired).ShouldBe(true);
            ShowAll();
            Hide(p => p.RemainingTime);
        }
    }

    public class ThereIsTime : ActionSelector<CentralCustomActionWithBoolean>
    {
        public ThereIsTime()
        {
            UseName("TimeHasNotExpired");
            Prop(p => p.TimeExpired).ShouldBe(false);
            ShowAll();
            Hide(p => p.RemainingTime);
        }
    }
}

การตั้งค่าคำอธิบายสำหรับตัวเลือกการดำเนินการแบบกำหนดเอง

หากต้องการสร้างคำอธิบายและข้อมูลสรุปสำหรับตัวเลือก ให้ใช้รูปแบบต่อไปนี้ในไฟล์ .resx ของโมดูลที่คุณกำหนดเอง

SelectorName_Description
SelectorName_Summary

ซึ่งสามารถทำได้ในตัวเลือกด้วยวิธีการ WithDescription และ WithSummary

สำคัญ

ไฟล์ .dll ที่อธิบายการดำเนินการแบบกำหนดเอง การขึ้นต่อกันของไฟล์ .dll และไฟล์ .cab ที่มีทุกอย่างควรได้รับการเซ็นชื่ออย่างถูกต้องด้วยใบรับรองดิจิทัลที่องค์กรของคุณเชื่อถือ นอกจากนี้ ใบรับรองควรได้รับการติดตั้งบนแต่ละเครื่องที่มีการสร้าง/แก้ไข/ดำเนินการโฟลว์เดสก์ท็อปที่มีการขึ้นต่อกันของการดำเนินการแบบกำหนดเอง ซึ่งอยู่ภายใต้ Trusted Root Certification Authoritues

รหัสโมดูลที่กำหนดเอง

แต่ละโมดูลมีรหัสของตัวเอง (ชื่อแอสเซมบลี) เมื่อสร้างโมดูลที่กำหนดเอง ตรวจสอบให้แน่ใจว่าคุณตั้งค่ารหัสโมดูลที่ไม่ซ้ำกัน หากต้องการตั้งชื่อแอสเซมบลีของโมดูลของคุณ ให้แก้ไขคุณสมบัติ Assembly name ภายใต้ส่วนทั่วไปของคุณสมบัติของโปรเจ็กต์ C#

คำเตือน

การรวมโมดูลที่มีรหัสเดียวกันในโฟลว์จะส่งผลให้เกิดความขัดแย้ง

แบบแผนชื่อโมดูลที่กำหนดเอง

เพื่อให้โมดูลที่กำหนดเองสามารถอ่านได้ผ่าน Power Automate สำหรับเดสก์ท็อป AssemblyName ต้องมีชื่อไฟล์ตามรูปแบบด้านล่าง:

?*.Modules.?*
Modules.?*

ตัวอย่างเช่น Modules.ContosoActions.dll

AssemblyTitle ในการตั้งค่าโครงการระบุรหัสโมดูล มีได้เฉพาะอักขระที่เป็นตัวอักษรและตัวเลขคละกันและเครื่องหมายขีดล่าง และต้องขึ้นต้นด้วยตัวอักษร

ลงนาม DLL ทั้งหมดภายในโมดูลแบบกำหนดเอง

สำคัญ

จำเป็นต้องให้ไฟล์ .dll ทั้งหมดประกอบด้วยโมดูลที่กำหนดเอง (แอสเซมบลีที่สร้างขึ้นและการขึ้นต่อกันทั้งหมด) ที่ลงนามด้วยใบรับรองที่เชื่อถือได้

ในการสิ้นสุดการสร้างโมดูลแบบกำหนดเอง ไฟล์ .dll ที่สร้างขึ้นทั้งหมด ซึ่งสามารถพบได้ภายใต้โฟลเดอร์ bin/release หรือ bin/Debug ของโปรเจ็กต์ จะต้องได้รับการลงนาม

ลงนามไฟล์ .dll ทั้งหมดโดยใช้ใบรับรองที่เชื่อถือได้โดยการรันคำสั่งต่อไปนี้ (สำหรับไฟล์ .dll แต่ละไฟล์) ใน Developer Command Prompt สำหรับ Visual Studio:

ลงนามไฟล์ .dll ทั้งหมดโดยใช้ใบรับรองที่เชื่อถือได้โดยการรันคำสั่งต่อไปนี้ (สำหรับไฟล์ dll แต่ละไฟล์) ใน Developer Command Prompt สำหรับ Visual Studio:

Signtool sign /f {your certificate name}.pfx /p {your password for exporting the certificate} /fd 
SHA256 {path to the .dll you want to sign}.dll

หรือโดยการเรียกใช้คำสั่งต่อไปนี้ (โดยการสร้างสคริปต์ Windows PowerShell .ps1) ที่วนซ้ำไฟล์ .dll ทั้งหมด และลงนามแต่ละไฟล์ด้วยใบรับรองที่ให้มา:

Get-ChildItem {the folder where dll files of custom module exist} -Filter *.dll | 
Foreach-Object {
	Signtool sign /f {your certificate name}.pfx /p {your password for exporting the certificate} /fd SHA256 $_.FullName
}

หมายเหตุ

ใบรับรองกิจิทัลต้องมีคีย์ส่วนตัวที่ส่งออกได้และความสามารถในการเซ็นชื่อในโค้ด

การบรรจุทุกอย่างไว้ในไฟล์ cabinet

ไฟล์ .dll ที่มีการดำเนินการแบบกำหนดเองและการขึ้นต่อกันทั้งหมด (ไฟล์ .dll) จะต้องได้รับการบรรจุในไฟล์ Cabinet (.cab)

หมายเหตุ

เมื่อตั้งชื่อไฟล์ .cab ให้ทำตามหลักการตั้งชื่อไฟล์และโฟลเดอร์สำหรับระบบปฏิบัติการ Windows อย่าใช้ช่องว่างหรืออักขระพิเศษ เช่น < > : " / \ | ? *

สร้าง Windows PowerShell Script (.ps1) ที่มีบรรทัดต่อไปนี้:

param(

    [ValidateScript({Test-Path $_ -PathType Container})]
	[string]
	$sourceDir,
	
	[ValidateScript({Test-Path $_ -PathType Container})]
    [string]
    $cabOutputDir,

    [string]
    $cabFilename
)

$ddf = ".OPTION EXPLICIT
.Set CabinetName1=$cabFilename
.Set DiskDirectory1=$cabOutputDir
.Set CompressionType=LZX
.Set Cabinet=on
.Set Compress=on
.Set CabinetFileCountThreshold=0
.Set FolderFileCountThreshold=0
.Set FolderSizeThreshold=0
.Set MaxCabinetSize=0
.Set MaxDiskFileCount=0
.Set MaxDiskSize=0
"
$ddfpath = ($env:TEMP + "\customModule.ddf")
$sourceDirLength = $sourceDir.Length;
$ddf += (Get-ChildItem $sourceDir -Filter "*.dll" | Where-Object { (!$_.PSIsContainer) -and ($_.Name -ne "Microsoft.PowerPlatform.PowerAutomate.Desktop.Actions.SDK.dll") } | Select-Object -ExpandProperty FullName | ForEach-Object { '"' + $_ + '" "' + ($_.Substring($sourceDirLength)) + '"' }) -join "`r`n"
$ddf | Out-File -Encoding UTF8 $ddfpath
makecab.exe /F $ddfpath
Remove-Item $ddfpath

สคริปต์ Windows PowerShell นี้สามารถใช้สำหรับสร้างไฟล์ .cab โดยการเรียกใช้ใน Windows PowerShell และระบุ:

  • ไดเรกทอรีไปยังไฟล์ .dll ที่จะบีบอัด
  • ไดเรกทอรีเป้าหมายที่จะวางไฟล์ .cab ที่สร้างขึ้น

เรียกใช้สคริปต์โดยใช้ไวยากรณ์ต่อไปนี้:

.\{name of script containing the .cab compression directions}.ps1 "{absolute path  to the source directory containing the .dll files}" "{target dir to save cab}" {cabName}.cab

ตัวอย่าง:

.\makeCabFile.ps1 "C:\Users\Username\source\repos\MyCustomModule\bin\Release\net472" "C:\Users\Username\MyCustomActions" MyCustomActions.cab

หมายเหตุ

  • ตรวจสอบให้แน่ใจว่าไฟล์ .dll การดำเนินการที่กำหนดเองจริงอยู่ในระดับรากของพาธเป้าหมายเมื่อสร้างไฟล์ .cab และไม่ได้อยู่ในโฟลเดอร์ย่อย
  • ต้องเซ็นชื่อไฟล์ .cab ด้วย ไฟล์ .cab ที่ไม่ได้เซ็นชื่อและ/หรือ .dll ที่ไม่ได้เซ็นชื่อที่อยู่ในไฟล์นั้นจะไม่สามารถใช้งานได้ในโฟลว์เดสก์ท็อป และจะส่งผลให้เกิดข้อผิดพลาดระหว่างการรวม

ขั้นตอนถัดไป

อัปโหลดการดำเนินการแบบกำหนดเอง

ดูเพิ่มเติม