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

การเพิ่มพารามิเตอร์ที่ประมวลผลอินพุตบรรทัดคำสั่ง


แหล่งอินพุตหนึ่งสำหรับ cmdlet คือบรรทัดคำสั่ง หัวข้อนี้อธิบายวิธีการเพิ่มพารามิเตอร์ลงใน Get-Proc cmdlet (ซึ่งอธิบายไว้ในการสร้าง Cmdlet แรกของคุณ) เพื่อให้ cmdlet สามารถประมวลผลอินพุตจากเครื่องคอมพิวเตอร์ตามวัตถุที่ชัดเจนที่ส่งผ่านไปยัง cmdlet . Get-Proc cmdlet ที่อธิบายไว้ที่นี่ดึงข้อมูลกระบวนการตามชื่อ จากนั้นแสดงข้อมูลเกี่ยวกับกระบวนการที่พร้อมท์คำสั่ง

การกำหนดคลาส Cmdlet

ขั้นตอนแรกในการสร้าง cmdlet คือการตั้งชื่อ cmdlet และการประกาศคลาส .NET Framework ที่ใช้ cmdlet cmdlet นี้ดึงข้อมูลกระบวนการ ดังนั้นชื่อกริยาที่เลือกที่นี่คือ "รับ" (cmdlet เกือบทุกประเภทที่สามารถดึงข้อมูลสามารถประมวลผลอินพุตบรรทัดคำสั่งได้) สำหรับข้อมูลเพิ่มเติมเกี่ยวกับกริยา cmdlet ที่ได้รับอนุมัติ โปรดดูชื่อกริยา Cmdlet

นี่คือการประกาศคลาสสำหรับ Get-Proc cmdlet รายละเอียดเกี่ยวกับคำจำกัดความนี้มีอยู่ในการสร้าง Cmdlet แรกของคุณ

[Cmdlet(VerbsCommon.Get, "proc")]
public class GetProcCommand: Cmdlet
<Cmdlet(VerbsCommon.Get, "Proc")> _
Public Class GetProcCommand
    Inherits Cmdlet

การประกาศพารามิเตอร์

พารามิเตอร์ cmdlet ช่วยให้ผู้ใช้สามารถป้อนข้อมูลให้กับ cmdlet ได้ ในตัวอย่างต่อไปนี้ Get-Proc และ Get-Member เป็นชื่อของ Pipelined cmdlets และ MemberType เป็นพารามิเตอร์สำหรับ รับสมาชิก cmdlet พารามิเตอร์มีอาร์กิวเมนต์ "คุณสมบัติ"

PS> รับ-proc ; รับสมาชิก -คุณสมบัติประเภทสมาชิก

หากต้องการประกาศพารามิเตอร์สำหรับ cmdlet คุณต้องกำหนดคุณสมบัติที่แสดงถึงพารามิเตอร์ก่อน ใน cmdlet Get-Proc พารามิเตอร์เดียวคือ ชื่อ ซึ่งในกรณีนี้แสดงถึงชื่อของวัตถุกระบวนการ .NET Framework ที่จะดึงข้อมูล ดังนั้นคลาส cmdlet จึงกำหนดคุณสมบัติของประเภทสตริงเพื่อยอมรับอาร์เรย์ของชื่อ

นี่คือการประกาศพารามิเตอร์สำหรับพารามิเตอร์ Name ของ Get-Proc cmdlet

/// <summary>
/// Specify the cmdlet Name parameter.
/// </summary>
  [Parameter(Position = 0)]
  [ValidateNotNullOrEmpty]
  public string[] Name
  {
    get { return processNames; }
    set { processNames = value; }
  }
  private string[] processNames;

  #endregion Parameters
<Parameter(Position:=0), ValidateNotNullOrEmpty()> _
Public Property Name() As String()
    Get
        Return processNames
    End Get

    Set(ByVal value As String())
        processNames = value
    End Set

End Property

เมื่อต้องการแจ้งรันไทม์ Windows PowerShell ว่าคุณสมบัตินี้เป็นพารามิเตอร์ Name แอตทริบิวต์ System.Management.Automation.Parameterattribute จะถูกเพิ่มลงในข้อกำหนดของคุณสมบัติ ไวยากรณ์พื้นฐานสำหรับการประกาศแอตทริบิวต์นี้คือ [Parameter()]

บันทึก

พารามิเตอร์จะต้องทำเครื่องหมายอย่างชัดเจนว่าเป็นสาธารณะ พารามิเตอร์ที่ไม่ได้ทำเครื่องหมายเป็นค่าเริ่มต้นสาธารณะสำหรับภายในและไม่พบโดยรันไทม์ Windows PowerShell

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

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

  • ชื่อพารามิเตอร์และชนิดข้อมูลของ Windows PowerShell ที่กำหนดไว้ล่วงหน้าควรใช้ซ้ำให้มากที่สุดเพื่อให้แน่ใจว่า cmdlet ของคุณเข้ากันได้กับ Windows PowerShell cmdlets ตัวอย่างเช่น หาก cmdlet ทั้งหมดใช้ชื่อพารามิเตอร์ Id ที่กำหนดไว้ล่วงหน้าเพื่อระบุทรัพยากร ผู้ใช้จะเข้าใจความหมายของพารามิเตอร์ได้อย่างง่ายดาย ไม่ว่าพวกเขาจะใช้ cmdlet ใดก็ตาม โดยพื้นฐานแล้ว ชื่อพารามิเตอร์จะเป็นไปตามกฎเดียวกันกับที่ใช้สำหรับชื่อตัวแปรใน Common Language Runtime (CLR) สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการตั้งชื่อพารามิเตอร์ ดูชื่อพารามิเตอร์ Cmdlet

  • Windows PowerShell ขอสงวนชื่อพารามิเตอร์บางส่วนเพื่อมอบประสบการณ์ผู้ใช้ที่สอดคล้องกัน อย่าใช้ชื่อพารามิเตอร์เหล่านี้: WhatIf, Confirm, Verbose, Debug, Warn, ErrorAction, ErrorVariable, OutVariable และ OutBuffer นอกจากนี้ นามแฝงต่อไปนี้สำหรับชื่อพารามิเตอร์เหล่านี้ถูกสงวนไว้: vb, db, ea, ev, ov และ ob

  • ชื่อเป็นชื่อพารามิเตอร์ทั่วไปที่แนะนำให้ใช้ใน cmdlets ของคุณ เป็นการดีกว่าที่จะเลือกชื่อพารามิเตอร์เช่นนี้มากกว่าชื่อที่ซับซ้อนซึ่งเป็นชื่อเฉพาะสำหรับ cmdlet ที่ระบุและจำยาก

  • พารามิเตอร์ไม่คำนึงถึงขนาดตัวพิมพ์ใน Windows PowerShell แม้ว่าโดยค่าเริ่มต้นเชลล์จะรักษาขนาดตัวพิมพ์ไว้ก็ตาม การพิจารณาตัวพิมพ์เล็กและใหญ่ของอาร์กิวเมนต์ขึ้นอยู่กับการดำเนินการของ cmdlet อาร์กิวเมนต์จะถูกส่งผ่านไปยังพารามิเตอร์ตามที่ระบุไว้ที่บรรทัดคำสั่ง

  • สำหรับตัวอย่างการประกาศพารามิเตอร์อื่นๆ โปรดดูที่พารามิเตอร์ Cmdlet

การประกาศพารามิเตอร์เป็นตำแหน่งหรือตั้งชื่อ

cmdlet ต้องตั้งค่าแต่ละพารามิเตอร์เป็นพารามิเตอร์ตำแหน่งหรือที่มีชื่อ พารามิเตอร์ทั้งสองประเภทยอมรับอาร์กิวเมนต์เดียว อาร์กิวเมนต์หลายรายการคั่นด้วยเครื่องหมายจุลภาค และการตั้งค่าบูลีน พารามิเตอร์บูลีนหรือที่เรียกว่า สวิตช์ จัดการเฉพาะการตั้งค่าบูลีนเท่านั้น สวิตช์ใช้เพื่อพิจารณาว่ามีพารามิเตอร์อยู่หรือไม่ ค่าเริ่มต้นที่แนะนำคือ false

ตัวอย่าง Get-Proc cmdlet กำหนดพารามิเตอร์ Name เป็นพารามิเตอร์ตำแหน่งที่มีตำแหน่ง 0 ซึ่งหมายความว่าอาร์กิวเมนต์แรกที่ผู้ใช้ป้อนในบรรทัดคำสั่งจะถูกแทรกโดยอัตโนมัติสำหรับสิ่งนี้ พารามิเตอร์. หากคุณต้องการกำหนดพารามิเตอร์ที่มีชื่อ ซึ่งผู้ใช้ต้องระบุชื่อพารามิเตอร์จากบรรทัดคำสั่ง ให้ปล่อยคีย์เวิร์ด Position ออกจากการประกาศแอตทริบิวต์

บันทึก

เว้นแต่ว่าจะต้องตั้งชื่อพารามิเตอร์ เราขอแนะนำให้คุณสร้างตำแหน่งพารามิเตอร์ที่ใช้บ่อยที่สุด เพื่อให้ผู้ใช้ไม่ต้องพิมพ์ชื่อพารามิเตอร์

การประกาศพารามิเตอร์เป็นข้อบังคับหรือทางเลือก

cmdlet ต้องตั้งค่าแต่ละพารามิเตอร์เป็นพารามิเตอร์ทางเลือกหรือพารามิเตอร์บังคับ ใน cmdlet Get-Proc ตัวอย่าง พารามิเตอร์ Name ถูกกำหนดให้เป็นทางเลือกเนื่องจากไม่ได้ตั้งค่าคำสำคัญ Mandatory ในการประกาศแอตทริบิวต์

รองรับการตรวจสอบพารามิเตอร์

cmdlet Get-Proc ตัวอย่างเพิ่มแอตทริบิวต์การตรวจสอบอินพุต System.Management.Automation.Validatenotnulloremptyattribute ไปยังพารามิเตอร์ Name เพื่อเปิดใช้งานการตรวจสอบว่าอินพุตไม่เป็น null หรือไม่เว้นว่าง คุณลักษณะนี้เป็นหนึ่งในคุณลักษณะการตรวจสอบหลายรายการที่มีให้โดย Windows PowerShell สำหรับตัวอย่างคุณลักษณะการตรวจสอบความถูกต้องอื่นๆ โปรดดูการตรวจสอบความถูกต้องของอินพุตพารามิเตอร์

[Parameter(Position = 0)]
[ValidateNotNullOrEmpty]
public string[] Name

การเอาชนะวิธีการประมวลผลอินพุต

ถ้า cmdlet ของคุณคือการจัดการอินพุตบรรทัดคำสั่ง จะต้องแทนที่วิธีการประมวลผลอินพุตที่เหมาะสม วิธีการประมวลผลอินพุตพื้นฐานถูกนำมาใช้ในการสร้าง Cmdlet แรกของคุณ

Get-Proc cmdlet จะแทนที่เมธอด System.Management.Automation.Cmdlet.ProcessRecord เพื่อจัดการอินพุตพารามิเตอร์ Name ที่ผู้ใช้หรือสคริปต์ให้มา เมธอดนี้รับกระบวนการสำหรับชื่อกระบวนการที่ร้องขอแต่ละรายการ หรือทั้งหมดสำหรับกระบวนการหากไม่มีการระบุชื่อ โปรดสังเกตว่าใน System.Management.Automation.Cmdlet.ProcessRecord การเรียกไปยัง System.Management.Automation.Cmdlet.WriteObject%28System.Object%2CSystem.Boolean%29 เป็นกลไกผลลัพธ์สำหรับการส่งวัตถุผลลัพธ์ไปยังไปป์ไลน์ พารามิเตอร์ตัวที่สองของการเรียกนี้ enumerateCollection ถูกตั้งค่าเป็น true เพื่อแจ้งรันไทม์ของ Windows PowerShell ให้ระบุอาร์เรย์เอาต์พุตของวัตถุกระบวนการ และเขียนทีละกระบวนการไปยัง บรรทัดคำสั่ง

protected override void ProcessRecord()
{
  // If no process names are passed to the cmdlet, get all processes.
  if (processNames == null)
  {
    // Write the processes to the pipeline making them available
    // to the next cmdlet. The second argument of this call tells
    // PowerShell to enumerate the array, and send one process at a
    // time to the pipeline.
    WriteObject(Process.GetProcesses(), true);
  }
  else
  {
    // If process names are passed to the cmdlet, get and write
    // the associated processes.
    foreach (string name in processNames)
    {
      WriteObject(Process.GetProcessesByName(name), true);
    }
  }
}
Protected Overrides Sub ProcessRecord()

    '/ If no process names are passed to the cmdlet, get all processes.
    If processNames Is Nothing Then
        Dim processes As Process()
        processes = Process.GetProcesses()
    End If

    '/ If process names are specified, write the processes to the
    '/ pipeline to display them or make them available to the next cmdlet.

    For Each name As String In processNames
        '/ The second parameter of this call tells PowerShell to enumerate the
        '/ array, and send one process at a time to the pipeline.
        WriteObject(Process.GetProcessesByName(name), True)
    Next

End Sub 'ProcessRecord

ตัวอย่างโค้ด

สำหรับโค้ดตัวอย่าง C# ที่สมบูรณ์ โปรดดูตัวอย่าง GetProcessSample02

การกำหนดประเภทวัตถุและการจัดรูปแบบ

Windows PowerShell ส่งข้อมูลระหว่าง cmdlet ของโดยใช้วัตถุ .NET Framework ด้วยเหตุนี้ cmdlet อาจจำเป็นต้องกำหนดประเภทของตัวเอง หรือ cmdlet อาจจำเป็นต้องขยายประเภทที่มีอยู่ซึ่งมาจาก cmdlet อื่น สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการกำหนดประเภทใหม่หรือการขยายประเภทที่มีอยู่ โปรดดูการขยายประเภทออบเจ็กต์และการจัดรูปแบบ

การสร้าง Cmdlet

หลังจากที่คุณใช้ cmdlet คุณต้องลงทะเบียนกับ Windows PowerShell โดยใช้สแน็ปอิน Windows PowerShell สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการลงทะเบียน cmdlets ดูวิธีการลงทะเบียน Cmdlets ผู้ให้บริการ และแอปพลิเคชันโฮสต์

การทดสอบ Cmdlet

เมื่อ cmdlet ของคุณลงทะเบียนกับ Windows PowerShell คุณสามารถทดสอบได้โดยการรันบนบรรทัดคำสั่ง ต่อไปนี้เป็นสองวิธีในการทดสอบโค้ดสำหรับ cmdlet ตัวอย่าง สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการใช้ cmdlets จากบรรทัดคำสั่ง โปรดดูที่ การเริ่มต้นใช้งาน Windows PowerShell

  • ที่พรอมต์ Windows PowerShell ใช้คำสั่งต่อไปนี้เพื่อแสดงรายการกระบวนการ Internet Explorer ซึ่งมีชื่อว่า "IEXPLORE"

    get-proc -name iexplore
    

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

    Handles  NPM(K)  PM(K)   WS(K)  VS(M)  CPU(s)   Id   ProcessName
    -------  ------  -----   -----  -----   ------ --   -----------
        354      11  10036   18992    85   0.67   3284   iexplore
    
  • หากต้องการแสดงรายการกระบวนการ Internet Explorer, Outlook และ Notepad ที่ชื่อว่า "IEXPLORE," "OUTLOOK" และ "NOTEPAD" ให้ใช้คำสั่งต่อไปนี้ หากมีหลายกระบวนการ กระบวนการทั้งหมดจะแสดงขึ้นมา

    get-proc -name iexplore, outlook, notepad
    

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

    Handles  NPM(K)  PM(K)   WS(K)  VS(M)  CPU(s)   Id   ProcessName
    -------  ------  -----   -----  -----  ------   --   -----------
        732      21  24696    5000    138   2.25  2288   iexplore
        715      19  20556   14116    136   1.78  3860   iexplore
       3917      62  74096   58112    468 191.56  1848   OUTLOOK
         39       2   1024    3280     30   0.09  1444   notepad
         39       2   1024     356     30   0.08  3396   notepad
    

ดูเพิ่มเติม

การเพิ่มพารามิเตอร์ที่ประมวลผลอินพุตไปป์ไลน์

การสร้าง Cmdlet แรกของคุณ

การขยายประเภทวัตถุและการจัดรูปแบบ

วิธีลงทะเบียน Cmdlets ผู้ให้บริการ และแอปพลิเคชันโฮสต์

การอ้างอิง Windows PowerShell

ตัวอย่าง Cmdlet

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