Udostępnij za pomocą


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

Jednym ze źródeł danych wejściowych dla polecenia cmdlet jest wiersz polecenia. W tym temacie opisano sposób dodawania parametru do polecenia cmdlet Get-Proc (opisanego w Creating Your First Cmdlet), dzięki czemu polecenie cmdlet może przetwarzać dane wejściowe z komputera lokalnego na podstawie jawnych obiektów przekazanych do polecenia cmdlet. Polecenie cmdlet Get-Proc opisane tutaj pobiera procesy na podstawie ich nazw, a następnie wyświetla informacje o procesach w wierszu polecenia.

Definiowanie klasy poleceń cmdlet

Pierwszym krokiem tworzenia polecenia cmdlet jest nazewnictwo poleceń cmdlet i deklaracja klasy .NET Framework, która implementuje polecenie cmdlet. To polecenie cmdlet pobiera informacje o procesie, więc nazwa zlecenia wybrana tutaj 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.

Oto deklaracja klasy dla polecenia cmdlet Get-Proc. Szczegółowe informacje o tej definicji znajdują się w Tworzenie pierwszego polecenia cmdlet.

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

Deklarowanie parametrów

Parametr polecenia cmdlet umożliwia użytkownikowi podanie danych wejściowych polecenia cmdlet. W poniższym przykładzie Get-Proc i Get-Member są nazwami poleceń cmdlet potoku, a MemberType jest parametrem polecenia cmdlet Get-Member. Parametr ma argument "property".

> Get-Proc PS; Get-Member -MemberType właściwości

Aby zadeklarować parametry polecenia cmdlet, należy najpierw zdefiniować właściwości reprezentujące parametry. W Get-Proc cmdlet jedynym parametrem jest Name, który w tym przypadku reprezentuje nazwę obiektu procesu .NET Framework do pobrania. W związku z tym klasa poleceń cmdlet definiuje właściwość ciągu typu, aby akceptować tablicę nazw.

Oto deklaracja parametru dla parametru Name polecenia cmdlet Get-Proc.

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

Aby poinformować środowisko uruchomieniowe programu Windows PowerShell, że ta właściwość jest parametrem Name, atrybut System.Management.Automation.ParameterAttribute jest dodawany do definicji właściwości. Podstawowa składnia deklarowania tego atrybutu to [Parameter()].

Uwaga

Parametr musi być jawnie oznaczony jako publiczny. Parametry, które nie są oznaczone jako domyślne publiczne do wewnętrznej i nie są znalezione przez środowisko uruchomieniowe programu Windows PowerShell.

To polecenie cmdlet używa tablicy ciągów dla parametru Name. Jeśli to możliwe, polecenie cmdlet powinno również zdefiniować parametr jako tablicę, ponieważ umożliwia to polecenie cmdlet akceptowanie więcej niż jednego elementu.

Co należy pamiętać o definicjach parametrów

  • Wstępnie zdefiniowane nazwy parametrów programu Windows PowerShell i typy danych powinny być ponownie używane tak samo, jak to możliwe, aby upewnić się, że polecenie cmdlet jest zgodne z poleceniami cmdlet programu Windows PowerShell. Jeśli na przykład wszystkie polecenia cmdlet używają wstępnie zdefiniowanej nazwy parametru Id do identyfikowania zasobu, użytkownik łatwo zrozumie znaczenie parametru, niezależnie od używanego polecenia cmdlet. Zasadniczo nazwy parametrów są zgodne z tymi samymi regułami, co nazwy zmiennych w środowisku uruchomieniowym języka wspólnego (CLR). Aby uzyskać więcej informacji na temat nazewnictwa parametrów, zobacz nazwach parametrów cmdlet.

  • Program Windows PowerShell rezerwuje kilka nazw parametrów, aby zapewnić spójne środowisko użytkownika. Nie używaj tych nazw parametrów: WhatIf, Confirm, Verbose, Debug, Warn, ErrorAction, ErrorVariable, OutVariablei OutBuffer. Ponadto następujące aliasy dla tych nazw parametrów są zarezerwowane: vb, db, ea, ev, ovi ob.

  • Name jest prostą i typową nazwą parametru zalecaną do użycia w poleceniach cmdlet. Lepiej jest wybrać nazwę parametru podobną do tej niż nazwa złożona, która jest unikatowa dla określonego polecenia cmdlet i trudno ją zapamiętać.

  • Parametry nie są uwzględniane wielkości liter w programie Windows PowerShell, chociaż domyślnie powłoka zachowuje wielkość liter. Ważność wielkości liter argumentów zależy od działania polecenia cmdlet. Argumenty są przekazywane do parametru określonego w wierszu polecenia.

  • Przykłady innych deklaracji parametrów można znaleźć w temacie Cmdlet Parameters.

Deklarowanie parametrów jako pozycyjnych lub nazwanych

Polecenie cmdlet musi ustawić każdy parametr jako pozycyjny lub nazwany parametr. Oba rodzaje parametrów akceptują pojedyncze argumenty, wiele argumentów rozdzielonych przecinkami i ustawieniami logicznymi. Parametr logiczny, nazywany również przełącznikiem , obsługuje tylko ustawienia logiczne. Przełącznik służy do określania obecności parametru. Zalecaną wartością domyślną jest false.

Przykładowe polecenie cmdlet Get-Proc definiuje parametr Name jako parametr pozycyjny z pozycją 0. Oznacza to, że pierwszy argument wprowadzony przez użytkownika w wierszu polecenia jest automatycznie wstawiany dla tego parametru. Jeśli chcesz zdefiniować nazwany parametr, dla którego użytkownik musi określić nazwę parametru z wiersza polecenia, pozostaw słowo kluczowe Position z deklaracji atrybutu.

Uwaga

Jeśli parametry nie muszą być nazwane, zaleca się, aby pozycyjne najczęściej używane parametry, aby użytkownicy nie musieli wpisywać nazwy parametru.

Deklarowanie parametrów jako obowiązkowe lub opcjonalne

Polecenie cmdlet musi ustawić każdy parametr jako opcjonalny lub obowiązkowy. W przykładowym poleceniu cmdlet Get-Proc parametr Name jest zdefiniowany jako opcjonalny, ponieważ słowo kluczowe Mandatory nie jest ustawione w deklaracji atrybutu.

Walidacja parametru pomocniczego

Przykładowe polecenie cmdlet Get-Proc dodaje atrybut weryfikacji danych wejściowych, System.Management.Automation.ValidateNotNullOrEmptyAttribute, do parametru Name w celu włączenia weryfikacji, czy dane wejściowe nie są null ani puste. Ten atrybut jest jednym z kilku atrybutów weryfikacji udostępnianych przez program Windows PowerShell. Aby zapoznać się z przykładami innych atrybutów weryfikacji, zobacz Sprawdzanie poprawności danych wejściowych parametru.

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

Zastępowanie metody przetwarzania wejściowego

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

Polecenie cmdlet Get-Proc zastępuje metodę System.Management.Automation.Cmdlet.ProcessRecord w celu obsługi danych wejściowych parametru Name dostarczonych przez użytkownika lub skrypt. Ta metoda pobiera procesy dla każdej żądanej nazwy procesu lub wszystkie dla procesów, jeśli nie podano nazwy. Zwróć uwagę, że w System.Management.Automation.Cmdlet.ProcessRecordwywołanie System.Management.Automation.Cmdlet.WriteObject 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ę wyjściową 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);
    }
  }
}
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

Przykładowy kod

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

Definiowanie typów obiektów i formatowanie

Program Windows PowerShell przekazuje informacje między poleceniami cmdlet przy użyciu obiektów programu .NET Framework. 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 zarejestrować je w programie Windows PowerShell przy użyciu 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 można go przetestować, uruchamiając je w wierszu polecenia. Poniżej przedstawiono dwa sposoby testowania kodu dla 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 użyj następującego polecenia, aby wyświetlić listę procesów programu Internet Explorer o nazwie "IEXPLORE".

    Get-Proc -Name iexplore
    

    Zostanie wyświetlone następujące dane wyjściowe.

    Handles  NPM(K)  PM(K)   WS(K)  VS(M)  CPU(s)   Id   ProcessName
    -------  ------  -----   -----  -----   ------ --   -----------
        354      11  10036   18992    85   0.67   3284   iexplore
    
  • Aby wyświetlić listę procesów programów Internet Explorer, Outlook i Notatnik o nazwach "IEXPLORE", "OUTLOOK" i "NOTATNIK", użyj następującego polecenia. Jeśli istnieje wiele procesów, zostaną wyświetlone wszystkie z nich.

    Get-Proc -Name iexplore, outlook, notepad
    

    Zostanie wyświetlone następujące dane wyjściowe.

    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
    

Zobacz też

dodawanie parametrów, które wejściowe potoku przetwarzania

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