Dodawanie parametrów, które przetwarzają dane wejściowe potoku

Jednym ze źródeł danych wejściowych dla polecenia cmdlet jest obiekt w potoku, który pochodzi z nadrzędnego polecenia cmdlet. W tej sekcji opisano sposób dodawania parametru do polecenia cmdlet Get-Proc (opisanego w temacie Creating Your First Cmdlet ) (Tworzenie pierwszego polecenia cmdlet),aby polecenie cmdlet umożliwiało przetwarzanie obiektów potoku.

To Get-Proc cmdlet używa parametru, który akceptuje dane wejściowe z obiektu potoku, pobiera informacje o procesach z komputera lokalnego na podstawie podanych nazw, a następnie wyświetla informacje o procesach w wierszu Name polecenia.

Definiowanie klasy polecenia cmdlet

Pierwszym krokiem podczas tworzenia polecenia cmdlet jest zawsze nazewnictwo polecenia cmdlet i deklarowanie klasy .NET, która implementuje polecenie cmdlet. To polecenie cmdlet pobiera informacje o procesie, więc wybrana tutaj nazwa czasownika to "Get". (Niemal każdy rodzaj polecenia cmdlet, które może uzyskać informacje, może przetwarzać dane wejściowe wiersza polecenia). Aby uzyskać więcej informacji na temat zatwierdzonych czasowników cmdlet, zobacz Nazwy czasowników polecenia cmdlet.

Poniżej przedstawiono definicję tego polecenia cmdlet Get-Proc . Szczegółowe informacje o tej definicji znajdują się w tece Creating Your First Cmdlet (Tworzenie pierwszego polecenia cmdlet).

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

Definiowanie danych wejściowych z potoku

W tej sekcji opisano sposób definiowania danych wejściowych z potoku dla polecenia cmdlet. To Get-Proc cmdlet definiuje właściwość, która reprezentuje parametr zgodnie z opisem w tece Dodawanie parametrów, które przetwarzają Name dane wejściowe wiersza polecenia. (Zobacz ten temat, aby uzyskać ogólne informacje na temat deklarowania parametrów).

Jeśli jednak polecenie cmdlet musi przetworzyć dane wejściowe potoku, jego parametry muszą być powiązane z wartościami wejściowymi przez Windows PowerShell uruchomieniowego. W tym celu należy dodać słowo kluczowe lub słowo kluczowe do deklaracji atrybutu ValueFromPipeline ValueFromPipelineByProperty System.Management.Automation.Parameterattribute. Określ słowo ValueFromPipeline kluczowe , jeśli polecenie cmdlet uzyskuje dostęp do kompletnego obiektu wejściowego. Określ, ValueFromPipelineByProperty czy polecenie cmdlet uzyskuje dostęp tylko do właściwości obiektu .

Oto deklaracja parametru dla parametru tego Name polecenia cmdlet Get-Proc, które akceptuje dane wejściowe potoku.

[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

Poprzednia deklaracja ustawia słowo kluczowe na , aby środowisko uruchomieniowe usługi Windows PowerShell powiązało parametr z obiektem przychodzącym, jeśli obiekt jest tym samym typem co parametr lub jeśli można go wywrzeć na ten sam ValueFromPipeline true typ. Słowo ValueFromPipelineByPropertyName kluczowe jest również ustawione na , aby środowisko Windows PowerShell sprawdzało przychodzący obiekt dla true Name właściwości. Jeśli obiekt przychodzący ma taką właściwość, środowisko uruchomieniowe powiążą parametr Name z Name właściwością obiektu przychodzącego.

Uwaga

Ustawienie słowa ValueFromPipeline kluczowego atrybutu dla parametru ma pierwszeństwo przed ustawieniem słowa ValueFromPipelineByPropertyName kluczowego .

Zastępowanie metody przetwarzania danych wejściowych

Jeśli twoje polecenie cmdlet ma obsługiwać dane wejściowe potoku, musi zastąpić odpowiednie metody przetwarzania danych wejściowych. Podstawowe metody przetwarzania danych wejściowych zostały wprowadzone w tece Creating Your First Cmdlet (Tworzenie pierwszego polecenia cmdlet).

To Get-Proc cmdlet zastępuje metodę System.Management.Automation.Cmdlet.ProcessRecord w celu obsługi danych wejściowych parametru dostarczonych przez użytkownika lub Name skrypt. Ta metoda pobierze procesy dla każdej żądanej nazwy procesu lub wszystkich procesów, jeśli nie podano nazwy. Zwróć uwagę, że w obiekcie System.Management.Automation.Cmdlet.ProcessRecordwywołanie writeObject(System.Object,System.Boolean) jest mechanizmem wyjściowym wysyłania obiektów wyjściowych do potoku. Drugi parametr tego wywołania, , jest ustawiony na , aby poinformować środowisko uruchomieniowe programu Windows PowerShell o wyliczeniu tablicy obiektów procesu i zapisywać po jednym procesie w enumerateCollection true wierszu polecenia.

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

Przykład kodu

Aby uzyskać kompletny przykładowy kod w języku C#, zobacz GetProcessSample03 Sample (Przykład GetProcessSample03).

Definiowanie typów obiektów i formatowania

Windows PowerShell przekazuje informacje między poleceniami cmdlet przy użyciu obiektów .Net. W związku z tym polecenie cmdlet może wymagać zdefiniowania własnego typu lub może być konieczne rozszerzenie istniejącego typu udostępnianego przez inne polecenie cmdlet. Aby uzyskać więcej informacji na temat definiowania nowych typów lub rozszerzania istniejących typów, zobacz Rozszerzanie typów obiektów i formatowanie.

Budowania polecenia cmdlet

Po zaimplementowaniu polecenia cmdlet należy je zarejestrować Windows PowerShell za pośrednictwem Windows PowerShell przystawki. Aby uzyskać więcej informacji na temat rejestrowania cmdlet, zobacz How to Register Cmdlets, Providers, and Host Applications(Jak rejestrować polecenia cmdlet, dostawców i aplikacje hosta).

Testowanie polecenia cmdlet

Po zarejestrowaniu polecenia cmdlet w u Windows PowerShell przetestuj je, uruchamiając je w wierszu polecenia. Na przykład przetestuj kod przykładowego polecenia cmdlet. Aby uzyskać więcej informacji na temat używania poleceń cmdlet z wiersza polecenia, zobacz Wprowadzenie z Windows PowerShell.

  • W wierszu Windows PowerShell wprowadź następujące polecenia, aby pobrać nazwy procesów za pośrednictwem potoku.

    PS> type ProcessNames | get-proc
    

    Wyświetlone są następujące dane wyjściowe.

    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
    
  • Wprowadź następujące wiersze, aby pobrać obiekty procesu, które mają właściwość z procesów o Name nazwie "IEXPLORE". W tym przykładzie użyto polecenia cmdlet (dostarczonego przez Windows PowerShell) jako nadrzędnego polecenia do pobrania Get-Process procesów "IEXPLORE".

    PS> get-process iexplore | get-proc
    

    Wyświetlone są następujące dane wyjściowe.

    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
    

Zobacz też

Dodawanie parametrów, które przetwarzają dane wejściowe wiersza polecenia

Tworzenie pierwszego polecenia cmdlet

Rozszerzanie typów obiektów i formatowanie

Jak rejestrować polecenia cmdlet, dostawców i aplikacje hosta

Dokumentacja programu Windows PowerShell

Przykłady poleceń cmdlet