Sdílet prostřednictvím


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 Vytvoření první rutiny), aby rutina mohl zpracovávat objekty kanálu.

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

Definování třídy rutiny

Prvním krokem při vytváření rutin 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 příkazu je Get. (Téměř jakýkoli druh rutiny, která dokáže načíst informace, může zpracovat vstup příkazového řádku.) Další informace o schválených rutinách naleznete v tématu Názvy příkazů rutin.

Následuje definice této rutiny Get-Proc. Podrobnosti o této definici jsou uvedeny v 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 rutina Get-Proc definuje vlastnost, která představuje parametr Name, jak je popsáno v Přidání parametrů, které zpracovávají vstupnípříkazového řádku . (Obecné informace o deklarování parametrů najdete v tomto tématu.)

Pokud ale rutina potřebuje zpracovat vstup kanálu, musí mít parametry vázané na vstupní hodnoty modulem runtime Windows PowerShellu. K tomu je nutné přidat klíčové slovo ValueFromPipeline nebo přidat klíčové slovo ValueFromPipelineByProperty do deklarace atributu System.Management.Automation.ParameterAttribute. Pokud rutina přistupuje k úplnému vstupnímu objektu, zadejte klíčové slovo ValueFromPipeline. Zadejte ValueFromPipelineByProperty, pokud rutina přistupuje pouze k vlastnosti objektu.

Tady je deklarace parametru pro Name parametr této rutiny 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 ValueFromPipeline na true tak, aby modul runtime Windows PowerShellu sváže parametr s příchozím objektem, pokud je objekt stejného typu jako parametr, nebo pokud jej lze převést na stejný typ. Klíčové slovo ValueFromPipelineByPropertyName je také nastaveno na true tak, aby modul runtime prostředí Windows PowerShell zkontroloval příchozí objekt pro vlastnost Name. Pokud má příchozí objekt takovou vlastnost, modul runtime vytvoří vazbu Name parametru na Name vlastnost příchozího objektu.

Poznámka:

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

Přepsání metody zpracování vstupu

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

Tato rutina Get-Proc přepíše metodu System.Management.Automation.Automation.ProcessRecord pro zpracování vstupu parametrů Name poskytnutého uživatelem nebo skriptem. Tato metoda získá procesy pro každý požadovaný název procesu nebo všechny procesy, pokud není zadaný žádný název. Všimněte si, že v System.Management.Automation.Cmdlet.ProcessRecord, volání WriteObject(System.Object,System.Boolean) je výstupní mechanismus pro odesílání výstupních objektů do kanálu. Druhý parametr tohoto volání, enumerateCollection, je nastaven na true říct modulu runtime Prostředí Windows PowerShell, aby vypsal pole procesních objektů a zapsat jeden proces na 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

Ukázka kódu

Úplný vzorový kód jazyka C# najdete v tématu GetProcessSample03 Sample.

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

Windows PowerShell předává informace mezi rutinami pomocí objektů .NET. Proto může být potřeba, aby rutina definovala vlastní typ, nebo může být potřeba rozšířit existující typ poskytovaný jinou rutinou. Další informace o definování nových typů nebo rozšíření existujících typů naleznete v tématu Rozšíření typů objektů a formátování.

Sestavení rutiny

Po implementaci rutiny musí být zaregistrované ve Windows PowerShellu prostřednictvím modulu snap-in Prostředí Windows PowerShell. Další informace o registraci rutin naleznete v tématu Postup registrace rutin, poskytovatelů a hostitelských aplikací.

Testování rutiny

Když je vaše rutina zaregistrovaná ve Windows PowerShellu, otestujte ji spuštěním na příkazovém řádku. Například otestujte 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 prostředím Windows PowerShell.

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

    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í Name vlastnost z procesů s názvem "IEXPLORE". Tento příklad používá rutinu Get-Process (poskytovanou prostředím Windows PowerShell) jako upstreamový příkaz k načtení procesů IEXPLORE.

    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í vstupní příkazového řádku

vytvoření prvního rutiny

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

registrace rutin, poskytovatelů a hostitelských aplikací

referenční prostředí Windows PowerShell

ukázky rutin