Přidání parametrů, které zpracovávají vstup z kanálu

Jedním ze zdrojů vstupu pro rutinu je objekt v kanálu, který pochází z upstreamové rutiny. Tato část popisuje, jak přidat parametr do rutiny Get-Proc (popsané v tématu Vytvoření první rutiny ),aby rutina zpracuje objekty kanálu.

Tato Get-Proc rutina používá parametr, který přijímá vstup z objektu kanálu, načítá informace o zpracování z místního počítače na základě zadaných názvů a pak zobrazuje informace o procesech Name na příkazovém řádku.

Definování třídy rutiny

Prvním krokem při vytváření rutiny je vždy pojmenování rutiny a deklarování třídy .NET, která tuto rutinu implementuje. Tato rutina načte informace o procesu, takže zde zvolený název slovesa je "Get". (Téměř jakýkoli druh rutiny, která dokáže načítá informace, dokáže zpracovat vstup z příkazového řádku.) Další informace o schválených příkazech rutin najdete v tématu Názvy rutin.

Následuje definice pro tuto rutinu Get-Proc. Podrobnosti o této definici najdete v tématu Vytvoření první rutiny.

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

Definování vstupu z kanálu

Tato část popisuje, jak definovat vstup z kanálu pro rutinu. Tato Get-Proc rutina definuje vlastnost, která představuje parametr , jak je popsáno v tématu Name Přidání parametrů, které zpracovávají vstup příkazového řádku. (Obecné informace o deklaraci parametrů najdete v tomto tématu.)

Pokud ale rutina potřebuje zpracovat vstup kanálu, musí mít své parametry vázané na vstupní hodnoty Windows PowerShell runtime. Chcete-li to provést, musíte přidat klíčové slovo nebo přidat klíčové slovo ValueFromPipeline ValueFromPipelineByProperty do deklarace atributu System.Management.Automation.Parameterattribute. Pokud ValueFromPipeline rutina přistupuje k úplnému vstupnímu objektu, zadejte klíčové slovo . ValueFromPipelineByPropertyUrčete, jestli rutina přistupuje jenom k vlastnosti objektu .

Tady je deklarace parametru pro parametr této rutiny Name Get-Proc který přijímá vstup kanálu.

[Parameter(
   Position = 0,
   ValueFromPipeline = true,
   ValueFromPipelineByPropertyName = true)]
[ValidateNotNullOrEmpty]
public string[] Name
{
   get { return this.processNames; }
   set { this.processNames = value; }
}
<Parameter(Position:=0, ValueFromPipeline:=True, _
ValueFromPipelineByPropertyName:=True), ValidateNotNullOrEmpty()> _
Public Property Name() As String()
    Get
        Return processNames
    End Get

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

End Property

Předchozí deklarace nastaví klíčové slovo na , aby modul runtime Windows PowerShell sváže parametr s příchozím objektem, pokud je objekt stejný typ jako parametr, nebo pokud může být přinucen ke ValueFromPipeline true stejnému typu. Klíčové slovo je také nastavené na , takže Windows PowerShell runtime zkontroluje příchozí ValueFromPipelineByPropertyName true objekt pro Name vlastnost. Pokud má příchozí objekt takovou vlastnost, modul runtime vytvoří vazbu parametru na Name Name vlastnost příchozího objektu.

Poznámka

Nastavení klíčového slova atributu pro parametr má přednost před ValueFromPipeline nastavením klíčového ValueFromPipelineByPropertyName slova .

Přepsání metody vstupního zpracování

Pokud má vaše rutina zpracovat vstup kanálu, musí přepsat příslušné metody zpracování vstupu. Základní metody zpracování vstupu jsou uvedené v tématu Vytvoření první rutiny.

Tato Get-Proc rutina přepíše metodu System.Management.Automation.Cmdlet.ProcessRecord pro zpracování vstupu parametru poskytnutého uživatelem Name nebo skriptem. Tato metoda získá procesy pro každý požadovaný název procesu nebo všechny procesy, pokud není žádný název. Všimněte si, že v rámci System.Management.Automation.Cmdlet.ProcessRecordje volání WriteObject(System.Object,System.Boolean) výstupním mechanismem pro odesílání výstupních objektů do kanálu. Druhý parametr tohoto volání, , je nastaven na , aby se modulu runtime Windows PowerShell říká, že má vytvořit výčet pole procesních objektů a zapisovat jeden proces po druhém na enumerateCollection true příkazový řádek.

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);
    } // End foreach (string name...).
  }
}
Protected Overrides Sub ProcessRecord()
    Dim processes As Process()

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

        '/ 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 If

End Sub 'ProcessRecord

Vzorek kódu

Kompletní vzorový kód jazyka C# najdete v části Ukázka GetProcessSample03.

Definování typů objektů a formátování

Windows PowerShell předává informace mezi rutinami pomocí objektů .NET. V důsledku toho může rutina potřebovat definovat vlastní typ nebo rutina může potřebovat rozšířit existující typ poskytovaný jinou rutinou. Další informace o definování nových typů nebo rozšíření existujících typů najdete v tématu Rozšíření typů objektůa formátování .

Sestavení rutiny

Po implementaci rutiny musí být tato rutina zaregistrovaná Windows PowerShell prostřednictvím Windows PowerShell modulu snap-in. Další informace o registraci rutin najdete v tématu Postup registrace rutin, zprostředkovatelů a hostitelských aplikací.

Testování rutiny

Když je vaše rutina zaregistrovaná v Windows PowerShell, otestujte ji tak, že ji na příkazovém řádku použijete. Otestujte například kód ukázkové rutiny. Další informace o používání rutin z příkazového řádku najdete v tématu Začínáme s Windows PowerShell.

  • Na Windows PowerShell příkazového řádku zadejte následující příkazy, které prostřednictvím kanálu načítá názvy procesů.

    PS> type ProcessNames | get-proc
    

    Zobrazí se následující výstup.

    Handles  NPM(K)  PM(K)   WS(K)  VS(M)  CPU(s)    Id  ProcessName
    -------  ------  -----   ----- -----   ------    --  -----------
        809      21  40856    4448    147    9.50  2288  iexplore
        737      21  26036   16348    144   22.03  3860  iexplore
         39       2   1024     388     30    0.08  3396  notepad
       3927      62  71836   26984    467  195.19  1848  OUTLOOK
    
  • Zadáním následujících řádků získáte objekty procesu, které mají vlastnost z procesů Name s názvem IEXPEXPEXPEXP. Tento příklad používá Get-Process rutinu (poskytnutou Windows PowerShell) jako upstreamový příkaz k načtení procesů "IEXPREQUEST".

    PS> get-process iexplore | get-proc
    

    Zobrazí se následující výstup.

    Handles  NPM(K)  PM(K)   WS(K)  VS(M)  CPU(s)    Id  ProcessName
    -------  ------  -----   ----- -----   ------    --  -----------
        801      21  40720    6544    142    9.52  2288  iexplore
        726      21  25872   16652    138   22.09  3860  iexplore
        801      21  40720    6544    142    9.52  2288  iexplore
        726      21  25872   16652    138   22.09  3860  iexplore
    

Viz také

Přidání parametrů, které zpracovávají vstup z příkazového řádku

Vytvoření první rutiny

Rozšíření typů objektů a formátování

Registrace rutin, poskytovatelů a hostitelských aplikací

Referenční informace k Windows PowerShellu

Ukázky rutin