การสร้าง Cmdlet โดยไม่มีพารามิเตอร์
ส่วนนี้อธิบายวิธีการสร้าง cmdlet ที่ดึงข้อมูลจากเครื่องคอมพิวเตอร์โดยไม่ต้องใช้พารามิเตอร์ แล้วเขียนข้อมูลไปยังไปป์ไลน์ cmdlet ที่อธิบายไว้ที่นี่คือ Get-Proc cmdlet ที่ดึงข้อมูลเกี่ยวกับกระบวนการของคอมพิวเตอร์ในระบบ แล้วแสดงข้อมูลนั้นที่บรรทัดคำสั่ง
บันทึก
โปรดทราบว่าเมื่อเขียน cmdlets แอสเซมบลีอ้างอิง Windows PowerShell® จะถูกดาวน์โหลดลงบนดิสก์ (โดยค่าเริ่มต้นที่ C:\Program Files\Reference Assemblies\Microsoft\WindowsPowerShell\v1.0) ไม่ได้ติดตั้งไว้ใน Global Assembly Cache (GAC)
การตั้งชื่อ Cmdlet
ชื่อ cmdlet ประกอบด้วยคำกริยาที่บ่งชี้ถึงการดำเนินการที่ cmdlet ใช้ และคำนามที่บ่งชี้รายการที่ cmdlet กระทำ เนื่องจากตัวอย่าง Get-Proc cmdlet ดึงวัตถุกระบวนการ จึงใช้คำกริยา "Get" ซึ่งกำหนดโดยการแจงนับ System.Management.Automation.Verbscommon และคำนาม "Proc" เพื่อระบุว่า cmdlet ทำงานบนรายการกระบวนการ
เมื่อตั้งชื่อ cmdlets อย่าใช้อักขระใด ๆ ต่อไปนี้: # ,() {} [] & - /\ $; -
การเลือกคำนาม
คุณควรเลือกคำนามที่เฉพาะเจาะจง วิธีที่ดีที่สุดคือใช้คำนามเอกพจน์ที่นำหน้าด้วยชื่อผลิตภัณฑ์แบบย่อ ชื่อ cmdlet ตัวอย่างประเภทนี้คือ "Get-SQLServer"
การเลือกคำกริยา
คุณควรใช้กริยาจากชุดของชื่อกริยา cmdlet ที่ได้รับอนุมัติ สำหรับข้อมูลเพิ่มเติมเกี่ยวกับกริยา cmdlet ที่ได้รับอนุมัติ ดูชื่อกริยา Cmdlet
การกำหนดคลาส Cmdlet
เมื่อคุณเลือกชื่อ cmdlet แล้ว ให้กำหนดคลาส .NET เพื่อใช้ cmdlet นี่คือคำจำกัดความของคลาสสำหรับ Get-Proc cmdlet ตัวอย่างนี้:
[Cmdlet(VerbsCommon.Get, "Proc")]
public class GetProcCommand : Cmdlet
<Cmdlet(VerbsCommon.Get, "Proc")> _
Public Class GetProcCommand
Inherits Cmdlet
โปรดสังเกตว่าก่อนหน้าคำจำกัดความของคลาส แอ็ตทริบิวต์ System.Management.Automation.CmdletAttribute พร้อมด้วยไวยากรณ์ [Cmdlet(verb, noun, ...)] ใช้เพื่อระบุคลาสนี้เป็น cmdlet . นี่เป็นแอตทริบิวต์ที่จำเป็นเท่านั้นสำหรับ cmdlets ทั้งหมด และช่วยให้รันไทม์ Windows PowerShell เรียกได้อย่างถูกต้อง คุณสามารถตั้งค่าคีย์เวิร์ดของแอตทริบิวต์เพื่อประกาศคลาสเพิ่มเติมได้หากจำเป็น โปรดทราบว่าการประกาศแอตทริบิวต์สำหรับคลาส GetProcCommand ตัวอย่างของเราประกาศเฉพาะชื่อคำนามและกริยาสำหรับ Get-Proc cmdlet
บันทึก
สำหรับคลาสแอททริบิวต์ Windows PowerShell ทั้งหมด คำสำคัญที่คุณสามารถตั้งค่าได้จะสอดคล้องกับคุณสมบัติของคลาสแอททริบิวต์
เมื่อตั้งชื่อคลาสของ cmdlet เป็นวิธีปฏิบัติที่ดีในการสะท้อนชื่อ cmdlet ในชื่อคลาส เมื่อต้องการทำเช่นนี้ ให้ใช้แบบฟอร์ม "VerbNounCommand" และแทนที่ "Verb" และ "Noun" ด้วยคำกริยาและคำนามที่ใช้ในชื่อ cmdlet ดังที่แสดงในคำจำกัดความของคลาสก่อนหน้านี้ Get-Proc cmdlet ตัวอย่างจะกำหนดคลาสที่เรียกว่า GetProcCommand ซึ่งได้มาจากคลาสพื้นฐาน System.Management.Automation.Cmdlet
มันเป็นสิ่งสำคัญ
หากคุณต้องการกำหนด cmdlet ที่เข้าถึงรันไทม์ Windows PowerShell โดยตรง คลาส .NET ของคุณควรได้รับมาจากคลาสพื้นฐาน System.Management.Automation.PSCmdlet สำหรับข้อมูลเพิ่มเติมเกี่ยวกับคลาสนี้ โปรดดูที่การสร้าง Cmdlet ที่กำหนดชุดพารามิเตอร์
บันทึก
คลาสสำหรับ cmdlet จะต้องทำเครื่องหมายอย่างชัดเจนว่าเป็นสาธารณะ คลาสที่ไม่ได้ทำเครื่องหมายเป็นสาธารณะจะมีค่าเริ่มต้นเป็นคลาสภายใน และจะไม่พบโดยรันไทม์ Windows PowerShell
Windows PowerShell ใช้เนมสเปซ Microsoft.PowerShell.Commands สำหรับคลาส cmdlet ขอแนะนำให้วางคลาส cmdlet ของคุณในเนมสเปซ Commands ของเนมสเปซ API ของคุณ เช่น xxx.PS.Commands
การเอาชนะวิธีการประมวลผลอินพุต
คลาส System.Management.Automation.Cmdlet มีวิธีการประมวลผลอินพุตหลักสามวิธี อย่างน้อยหนึ่งวิธีซึ่ง cmdlet ของคุณจะต้องแทนที่ สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีที่ Windows PowerShell ประมวลผลระเบียน โปรดดูที่ Windows PowerShell ทำงานอย่างไร
สำหรับอินพุตทุกประเภท รันไทม์ของ Windows PowerShell จะเรียก System.Management.Automation.Cmdlet.BeginProcessing เพื่อเปิดใช้งานการประมวลผล ถ้า cmdlet ของคุณต้องทำการประมวลผลล่วงหน้าหรือการตั้งค่า ก็สามารถทำได้โดยการแทนที่วิธีนี้
บันทึก
Windows PowerShell ใช้คำว่า "บันทึก" เพื่ออธิบายชุดของค่าพารามิเตอร์ที่ให้มาเมื่อมีการเรียก cmdlet
หาก cmdlet ของคุณยอมรับอินพุตไปป์ไลน์ จะต้องแทนที่เมธอด System.Management.Automation.Cmdlet.ProcessRecord และเมธอด System.Management.Automation.Cmdlet.EndProcessing ซึ่งเป็นทางเลือก ตัวอย่างเช่น cmdlet อาจแทนที่ทั้งสองวิธีหากรวบรวมอินพุตทั้งหมดโดยใช้ System.Management.Automation.Cmdlet.ProcessRecord จากนั้นดำเนินการกับอินพุตโดยรวมแทนที่จะเป็นองค์ประกอบเดียวในแต่ละครั้ง เป็น Sort-Object cmdlet ทำ
ถ้า cmdlet ของคุณไม่ได้รับอินพุตไปป์ไลน์ ก็ควรแทนที่เมธอด System.Management.Automation.Cmdlet.EndProcessing โปรดทราบว่าวิธีนี้มักใช้แทน System.Management.Automation.Cmdlet.BeginProcessing เมื่อ cmdlet ไม่สามารถดำเนินการกับองค์ประกอบเดียวในแต่ละครั้ง เช่นเดียวกับกรณีของการเรียงลำดับ cmdlet
เนื่องจากตัวอย่างนี้ Get-Proc cmdlet ต้องได้รับการป้อนข้อมูลไปป์ไลน์ จะแทนที่เมธอด System.Management.Automation.Cmdlet.ProcessRecord และใช้การใช้งานเริ่มต้นสำหรับ System.Management.Automation.Cmdlet.BeginProcessing และ System.Management.Automation.Cmdlet.EndProcessing . System.Management.Automation.Cmdlet.ProcessRecord แทนที่ดึงข้อมูลกระบวนการและเขียนลงในบรรทัดคำสั่งโดยใช้เมธอด System.Management.Automation.Cmdlet.WriteObject
protected override void ProcessRecord()
{
// Get the current processes
Process[] processes = Process.GetProcesses();
// Write the processes to the pipeline making them available
// to the next cmdlet. The second parameter of this call tells
// PowerShell to enumerate the array, and send one process at a
// time to the pipeline.
WriteObject(processes, true);
}
Protected Overrides Sub ProcessRecord()
'/ Get the current processes.
Dim processes As Process()
processes = Process.GetProcesses()
'/ Write the processes to the pipeline making them available
'/ to the next cmdlet. The second parameter of this call tells
'/ PowerShell to enumerate the array, and send one process at a
'/ time to the pipeline.
WriteObject(processes, True)
End Sub 'ProcessRecord
สิ่งที่ต้องจำเกี่ยวกับการประมวลผลข้อมูลเข้า
แหล่งที่มาเริ่มต้นสำหรับอินพุตคือออบเจ็กต์ที่ชัดเจน (เช่น สตริง) ที่ผู้ใช้ระบุไว้ในบรรทัดคำสั่ง สำหรับข้อมูลเพิ่มเติม โปรดดูที่การสร้าง Cmdlet เพื่อประมวลผลอินพุตบรรทัดคำสั่ง
-
วิธีการประมวลผลอินพุตยังสามารถรับอินพุตจากวัตถุเอาต์พุตของ cmdlet อัปสตรีมบนไปป์ไลน์ สำหรับข้อมูลเพิ่มเติม โปรดดูที่การสร้าง Cmdlet เพื่อประมวลผลอินพุตไปป์ไลน์ โปรดทราบว่า cmdlet ของคุณจะได้รับอินพุตจากแหล่งบรรทัดคำสั่งและไปป์ไลน์รวมกัน
cmdlet ดาวน์สตรีมอาจไม่กลับมาเป็นเวลานานหรือไม่เลย ด้วยเหตุผลดังกล่าว วิธีการประมวลผลอินพุตใน cmdlet ของคุณไม่ควรระงับการล็อกในระหว่างการเรียกไปยัง System.Management.Automation.Cmdlet.WriteObject โดยเฉพาะอย่างยิ่งการล็อกซึ่งขอบเขตขยายเกินอินสแตนซ์ cmdlet
มันเป็นสิ่งสำคัญ
Cmdlet ไม่ควรเรียก System.Console.Writeline* หรือเทียบเท่า
- cmdlet ของคุณอาจมีตัวแปรวัตถุที่จะล้างข้อมูลเมื่อเสร็จสิ้นการประมวลผล (ตัวอย่างเช่น ถ้าเปิดหมายเลขอ้างอิงไฟล์ในเมธอด System.Management.Automation.Cmdlet.BeginProcessing และเก็บหมายเลขอ้างอิงเปิดสำหรับใช้งานโดย System.Management.Automation Cmdlet.ProcessRecord) สิ่งสำคัญคือต้องจำไว้ว่ารันไทม์ของ Windows PowerShell ไม่ได้เรียกเมธอด System.Management.Automation.Cmdlet.EndProcessing เสมอไป ซึ่งควรดำเนินการล้างข้อมูลวัตถุ
ตัวอย่างเช่น System.Management.Automation.Cmdlet.EndProcessing อาจไม่ถูกเรียก ถ้า cmdlet ถูกยกเลิกกลางคัน หรือหากมีข้อผิดพลาดในการยุติเกิดขึ้นในส่วนใดๆ ของ cmdlet ดังนั้น cmdlet ที่จำเป็นต้องมีการล้างข้อมูลวัตถุควรใช้รูปแบบ System.IDisposable ที่สมบูรณ์ รวมถึงตัวสุดท้าย เพื่อให้รันไทม์สามารถเรียกทั้ง System.Management.Automation.Cmdlet.EndProcessing และ System.IDisposable.Dispose* เมื่อสิ้นสุดการประมวลผล
ตัวอย่างโค้ด
สำหรับโค้ดตัวอย่าง C# ที่สมบูรณ์ โปรดดูตัวอย่าง GetProcessSample01
การกำหนดประเภทวัตถุและการจัดรูปแบบ
Windows PowerShell ส่งข้อมูลระหว่าง cmdlets โดยใช้วัตถุ .NET ด้วยเหตุนี้ cmdlet อาจจำเป็นต้องกำหนดประเภทของตัวเอง หรือ cmdlet อาจจำเป็นต้องขยายประเภทที่มีอยู่ซึ่งมาจาก cmdlet อื่น สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการกำหนดประเภทใหม่หรือการขยายประเภทที่มีอยู่ โปรดดูการขยายประเภทออบเจ็กต์และการจัดรูปแบบ
การสร้าง Cmdlet
หลังจากใช้ cmdlet คุณต้องลงทะเบียนกับ Windows PowerShell ผ่านทางสแนปอิน Windows PowerShell สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการลงทะเบียน cmdlets ดูวิธีการลงทะเบียน Cmdlets ผู้ให้บริการ และแอปพลิเคชันโฮสต์
การทดสอบ Cmdlet
เมื่อ cmdlet ของคุณได้รับการลงทะเบียนกับ Windows PowerShell แล้ว คุณสามารถทดสอบได้โดยการรันบนบรรทัดคำสั่ง โค้ดสำหรับ Get-Proc cmdlet ตัวอย่างของเรามีขนาดเล็ก แต่ยังคงใช้รันไทม์ Windows PowerShell และออบเจ็กต์ .NET ที่มีอยู่ ซึ่งเพียงพอที่จะทำให้มีประโยชน์ มาทดสอบกันเพื่อทำความเข้าใจให้ดีขึ้นว่า Get-Proc สามารถทำอะไรได้บ้าง และสามารถใช้เอาต์พุตของมันได้อย่างไร สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการใช้ cmdlets จากบรรทัดคำสั่ง โปรดดูการเริ่มต้นใช้งาน Windows PowerShell
เริ่ม Windows PowerShell และรับกระบวนการปัจจุบันที่ทำงานบนคอมพิวเตอร์
get-procผลลัพธ์ต่อไปนี้จะปรากฏขึ้น
Handles NPM(K) PM(K) WS(K) VS(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ---------- 254 7 7664 12048 66 173.75 1200 QCTRAY 32 2 1372 2628 31 0.04 1860 DLG 271 6 1216 3688 33 0.03 3816 lg 27 2 560 1920 24 0.01 1768 TpScrex ...กำหนดตัวแปรให้กับผลลัพธ์ cmdlet เพื่อการจัดการที่ง่ายขึ้น
$p=get-procรับจำนวนกระบวนการ
$p.lengthผลลัพธ์ต่อไปนี้จะปรากฏขึ้น
63ดึงข้อมูลกระบวนการเฉพาะ
$p[6]ผลลัพธ์ต่อไปนี้จะปรากฏขึ้น
Handles NPM(K) PM(K) WS(K) VS(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 1033 3 2400 3336 35 0.53 1588 rundll32รับเวลาเริ่มต้นของกระบวนการนี้
$p[6].starttimeผลลัพธ์ต่อไปนี้จะปรากฏขึ้น
Tuesday, July 26, 2005 9:34:15 AM$p[6].starttime.dayofyear207รับกระบวนการที่จำนวนหมายเลขอ้างอิงมากกว่า 500 และเรียงลำดับผลลัพธ์
$p | Where-Object {$_.HandleCount -gt 500 } | Sort-Object HandleCountผลลัพธ์ต่อไปนี้จะปรากฏขึ้น
Handles NPM(K) PM(K) WS(K) VS(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ---------- 568 14 2164 4972 39 5.55 824 svchost 716 7 2080 5332 28 25.38 468 csrss 761 21 33060 56608 440 393.56 3300 WINWORD 791 71 7412 4540 59 3.31 492 winlogon ...ใช้ cmdlet
Get-Memberเพื่อแสดงรายการคุณสมบัติที่พร้อมใช้งานสำหรับแต่ละกระบวนการ$p | Get-Member -MemberType propertyTypeName: System.Diagnostics.Processผลลัพธ์ต่อไปนี้จะปรากฏขึ้น
Name MemberType Definition ---- ---------- ---------- BasePriority Property System.Int32 BasePriority {get;} Container Property System.ComponentModel.IContainer Conta... EnableRaisingEvents Property System.Boolean EnableRaisingEvents {ge... ...
ดูเพิ่มเติม
การสร้าง Cmdlet เพื่อประมวลผลอินพุตบรรทัดคำสั่ง
การสร้าง Cmdlet เพื่อประมวลผลอินพุตไปป์ไลน์
วิธีสร้าง Windows PowerShell Cmdlet
การขยายประเภทวัตถุและการจัดรูปแบบ
Windows PowerShell ทำงานอย่างไร
วิธีลงทะเบียน Cmdlets ผู้ให้บริการ และแอปพลิเคชันโฮสต์
การอ้างอิง Windows PowerShell
ตัวอย่าง Cmdlet