สร้างการดำเนินการ 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# ที่เกี่ยวข้อง
การเพิ่มการจัดการข้อผิดพลาดให้กับการดำเนินการที่กำหนดเอง
หากต้องการกำหนดข้อยกเว้นที่กำหนดเองในการดำเนินการของคุณ ให้ใช้แอตทริบิวต์ [Throws("ActionError")]
เหนือคลาสการดำเนินการที่กำหนดเอง กรณีข้อยกเว้นแต่ละกรณีที่คุณต้องการกำหนดควรมีแอตทริบิวต์ของตัวเอง
ในบล็อกการเก็บ ให้ใช้รหัสต่อไปนี้:
throw new ActionException("ActionError", e.Message, e.InnerException);
ตรวจสอบว่าชื่อ ActionException
ตรงกับชื่อที่คุณระบุในแอตทริบิวต์ Throws
ใช้ throw new ActionException
สำหรับกรณีข้อยกเว้นแต่ละกรณีและจับคู่กับชื่อแอตทริบิวต์ Throws
ที่เกี่ยวข้อง ข้อยกเว้นทั้งหมดที่กำหนดไว้ในแอตทริบิวต์ Throws
จะปรากฏในแท็บการจัดการข้อผิดพลาดจากการดำเนินการของตัวออกแบบ
ตัวอย่างนี้สามารถพบได้ในส่วน การดำเนินการแบบมีเงื่อนไข
การแปลแหล่งข้อมูลเป็นภาษาท้องถิ่น
ภาษาเริ่มต้นสำหรับโมดูลใน 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"
เมื่อสร้างการดำเนินการแบบกำหนดเอง คุณไม่จำเป็นต้องเขียนฟังก์ชันการทำงานใหม่
คุณสามารถสร้างการดำเนินการ "พื้นฐาน" เดียว ตั้งค่าพารามิเตอร์อินพุตและเอาต์พุต จากนั้นเลือกสิ่งที่จะมองเห็นได้ในแต่ละอย่างโดยใช้ตัวเลือกการดำเนินการ
ด้วยตัวเลือกการดำเนินการ สามารถเพิ่มระดับของสิ่งที่เป็นนามธรรมเหนือการดำเนินการเดียว ทำให้สามารถดึงฟังก์ชันการทำงานเฉพาะจากการดำเนินการ "พื้นฐาน" เดียวได้โดยไม่ต้องเขียนโค้ดใหม่เพื่อสร้างรูปแบบใหม่ของการดำเนินการเดียวกันทุกครั้ง
คิดว่าตัวเลือกเป็นทางเลือก กรองการดำเนินการเดียวและนำเสนอเฉพาะข้อมูลที่จำเป็นตามตัวเลือกที่เกี่ยวข้อง
หากต้องการสร้างตัวเลือกการดำเนินการใหม่ ให้สร้างการดำเนินการพื้นฐานที่จะใช้โดยตัวเลือกก่อน
การดำเนินการส่วนกลางต้องการคุณสมบัติแบบบูลีนหรือ 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 ที่ไม่ได้เซ็นชื่อที่อยู่ในไฟล์นั้นจะไม่สามารถใช้งานได้ในโฟลว์เดสก์ท็อป และจะส่งผลให้เกิดข้อผิดพลาดระหว่างการรวม
ขั้นตอนถัดไป
อัปโหลดการดำเนินการแบบกำหนดเอง