ค้นหาเว็บไซต์

การสร้าง 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

  1. เริ่ม 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
    ...
    
  2. กำหนดตัวแปรให้กับผลลัพธ์ cmdlet เพื่อการจัดการที่ง่ายขึ้น

    $p=get-proc
    
  3. รับจำนวนกระบวนการ

    $p.length
    

    ผลลัพธ์ต่อไปนี้จะปรากฏขึ้น

    63
    
  4. ดึงข้อมูลกระบวนการเฉพาะ

    $p[6]
    

    ผลลัพธ์ต่อไปนี้จะปรากฏขึ้น

    Handles  NPM(K)  PM(K)  WS(K)  VS(M)  CPU(s)  Id    ProcessName
    -------  ------  -----  -----  -----  ------  --    -----------
    1033     3       2400   3336   35     0.53    1588  rundll32
    
  5. รับเวลาเริ่มต้นของกระบวนการนี้

    $p[6].starttime
    

    ผลลัพธ์ต่อไปนี้จะปรากฏขึ้น

    Tuesday, July 26, 2005 9:34:15 AM
    
    $p[6].starttime.dayofyear
    
    207
    
  6. รับกระบวนการที่จำนวนหมายเลขอ้างอิงมากกว่า 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
    ...
    
  7. ใช้ cmdlet Get-Member เพื่อแสดงรายการคุณสมบัติที่พร้อมใช้งานสำหรับแต่ละกระบวนการ

    $p | Get-Member -MemberType property
    
        TypeName: 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

บทความที่เกี่ยวข้อง