Udostępnij za pośrednictwem


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

Jednym źródłem danych wejściowych dla polecenia cmdlet jest obiekt w potoku pochodzącym z nadrzędnego polecenia cmdlet. W tej sekcji opisano sposób dodawania parametru do polecenia cmdlet Get-Proc (opisanego w Creating Your First Cmdlet), aby polecenie cmdlet może przetwarzać obiekty potoków.

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

Definiowanie klasy poleceń cmdlet

Pierwszym krokiem 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 "Pobierz". (Prawie każde polecenie cmdlet, które może pobierać informacje, może przetwarzać dane wejściowe wiersza polecenia). Aby uzyskać więcej informacji na temat zatwierdzonych czasowników poleceń cmdlet, zobacz Cmdlet Verb Names.

Poniżej przedstawiono definicję tego polecenia cmdlet Get-Proc. Szczegółowe informacje o tej definicji podano w 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 polecenie cmdlet Get-Proc definiuje właściwość reprezentującą parametr Name zgodnie z opisem w Dodawanie parametrów, które przetwarzają dane wejściowe wiersza polecenia. (Zobacz ten temat, aby uzyskać ogólne informacje na temat deklarowania parametrów).

Jednak gdy polecenie cmdlet musi przetworzyć dane wejściowe potoku, musi mieć parametry powiązane z wartościami wejściowymi przez środowisko uruchomieniowe programu Windows PowerShell. W tym celu należy dodać słowo kluczowe ValueFromPipeline lub dodać słowo kluczowe ValueFromPipelineByProperty do deklaracji atrybutu System.Management.Automation.ParameterAttribute. Określ słowo kluczowe ValueFromPipeline, jeśli polecenie cmdlet uzyskuje dostęp do kompletnego obiektu wejściowego. Określ ValueFromPipelineByProperty, jeśli polecenie cmdlet uzyskuje dostęp tylko do właściwości obiektu.

Oto deklaracja parametru dla parametru Name tego 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 ValueFromPipeline na true, tak aby środowisko uruchomieniowe programu Windows PowerShell powiązało parametr z obiektem przychodzącym, jeśli obiekt jest tego samego typu co parametr, lub jeśli może być on powiązany z tym samym typem. Słowo kluczowe ValueFromPipelineByPropertyName jest również ustawione na true, aby środowisko uruchomieniowe programu Windows PowerShell sprawdzało obiekt przychodzący dla właściwości Name. Jeśli obiekt przychodzący ma taką właściwość, środowisko uruchomieniowe będzie wiązać parametr Name z właściwością Name obiektu przychodzącego.

Uwaga

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

Zastępowanie metody przetwarzania wejściowego

Jeśli polecenie cmdlet ma obsługiwać dane wejściowe potoku, musi zastąpić odpowiednie metody przetwarzania danych wejściowych. Podstawowe metody przetwarzania danych wejściowych są wprowadzane w Tworzenie pierwszego polecenia cmdlet.

To polecenie cmdlet Get-Proc zastępuje metodę System.Management.Automation.Cmdlet.ProcessRecord do obsługi danych wejściowych parametru Name dostarczonych przez użytkownika lub skrypt. Ta metoda pobierze procesy dla każdej żądanej nazwy procesu lub wszystkich procesów, jeśli nie podano nazwy. Zwróć uwagę, że w 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, enumerateCollection, jest ustawiony na true, aby poinformować środowisko uruchomieniowe programu Windows PowerShell, aby wyliczyć tablicę obiektów procesu i napisać jeden proces jednocześnie w 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ładowy kod

Aby uzyskać pełny przykładowy kod w języku C#, zobacz GetProcessSample03 Sample.

Definiowanie typów obiektów i formatowanie

Program Windows PowerShell przekazuje informacje między poleceniami cmdlet przy użyciu obiektów .NET. W związku z tym może być konieczne zdefiniowanie własnego typu polecenia cmdlet lub może być konieczne rozszerzenie istniejącego typu dostarczonego 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.

Kompilowanie polecenia cmdlet

Po zaimplementowaniu polecenia cmdlet należy go zarejestrować w programie Windows PowerShell za pomocą przystawki programu Windows PowerShell. Aby uzyskać więcej informacji na temat rejestrowania poleceń cmdlet, zobacz Jak rejestrować polecenia cmdlet, dostawcy i aplikacje hosta.

Testowanie polecenia cmdlet

Po zarejestrowaniu polecenia cmdlet w programie 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 do programu Windows PowerShell.

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

    PS> type ProcessNames | Get-Proc
    

    Zostanie wyświetlone 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ść Name z procesów o nazwie "IEXPLORE". W tym przykładzie użyto polecenia cmdlet Get-Process (dostarczonego przez program Windows PowerShell) jako nadrzędnego polecenia w celu pobrania procesów "IEXPLORE".

    PS> Get-Process iexplore | Get-Proc
    

    Zostanie wyświetlone 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, dostawcy i aplikacje hosta

dokumentacja programu Windows PowerShell

przykłady poleceń cmdlet