Sdílet prostřednictvím


Přidání sad parametrů do rutiny

Co je potřeba vědět o sadách parametrů

Windows PowerShell definuje sadu parametrů jako skupinu parametrů, které spolupracují. Seskupením parametrů rutiny můžete vytvořit jednu rutinu, která může změnit jeho funkčnost na základě toho, jakou skupinu parametrů určuje uživatel.

Příkladem rutiny, která používá dvě sady parametrů k definování různých funkcí, je rutina Get-EventLog, která je poskytována prostředím Windows PowerShell. Tato rutina vrátí různé informace, když uživatel zadá parametr List nebo LogName. Pokud je zadán parametr LogName, rutina vrátí informace o událostech v daném protokolu událostí. Pokud je zadán parametr List, rutina vrátí informace o samotných souborech protokolu (ne informace o události, které obsahují). V tomto případě parametry List a LogName identifikují dvě samostatné sady parametrů.

Dvě důležité věci, které je potřeba pamatovat na sady parametrů, je, že modul runtime Prostředí Windows PowerShell používá pouze jednu sadu parametrů pro určitý vstup a že každá sada parametrů musí mít alespoň jeden parametr, který je pro tuto sadu parametrů jedinečný.

K ilustraci tohoto posledního bodu používá tato rutina Stop-Proc tři sady parametrů: ProcessName, ProcessIda InputObject. Každá z těchto sad parametrů má jeden parametr, který není v ostatních sadách parametrů. Sady parametrů můžou sdílet další parametry, ale rutina používá jedinečné parametry ProcessName, ProcessIda InputObject k identifikaci sady parametrů, které má modul runtime Prostředí Windows PowerShell používat.

Deklarace 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. Pro tuto rutinu se používá sloveso "Stop" životního cyklu, protože rutina zastaví systémové procesy. Název podstatného jména "Proc" se používá, protože rutina pracuje na procesech. V následující deklaraci si všimněte, že příkaz rutiny a název podstatného jména se odráží v názvu třídy rutiny.

Poznámka:

Další informace o schválených názvech rutin naleznete v tématu Názvy sloves rutin.

Následující kód je definice třídy pro tuto rutinu Stop-Proc.

[Cmdlet(VerbsLifecycle.Stop, "Proc",
        DefaultParameterSetName = "ProcessId",
        SupportsShouldProcess = true)]
public class StopProcCommand : PSCmdlet
<Cmdlet(VerbsLifecycle.Stop, "Proc", DefaultParameterSetName:="ProcessId", _
SupportsShouldProcess:=True)> _
Public Class StopProcCommand
    Inherits PSCmdlet

Deklarování parametrů rutiny

Tato rutina definuje tři parametry potřebné jako vstup rutiny (tyto parametry také definují sady parametrů) a také parametr Force, který spravuje, co rutina dělá, a parametr PassThru určující, jestli rutina odesílá výstupní objekt prostřednictvím kanálu. Ve výchozím nastavení tato rutina neprovádí objekt přes kanál. Další informace o těchto posledních dvou parametrech najdete v tématu Vytvoření rutiny, která upravuje systémovou.

Deklarování parametru Name

Tento vstupní parametr umožňuje uživateli zadat názvy procesů, které se mají zastavit. Všimněte si, že klíčové slovo atributu ParameterSetName atributu System.Management.Automation.ParameterAttribute určuje ProcessName parametr nastaven pro tento parametr.

[Parameter(
   Position = 0,
   ParameterSetName = "ProcessName",
   Mandatory = true,
   ValueFromPipeline = true,
   ValueFromPipelineByPropertyName = true,
   HelpMessage = "The name of one or more processes to stop. Wildcards are permitted."
)]
[Alias("ProcessName")]
public string[] Name
{
    get { return processNames; }
    set { processNames = value; }
}
private string[] processNames;
<Parameter(Position:=0, ParameterSetName:="ProcessName", _
Mandatory:=True, _
ValueFromPipeline:=True, ValueFromPipelineByPropertyName:=True, _
HelpMessage:="The name of one or more processes to stop. " & _
    "Wildcards are permitted."), [Alias]("ProcessName")> _
Public Property Name() As String()
    Get
        Return processNames
    End Get
    Set(ByVal value As String())
        processNames = value
    End Set
End Property

Private processNames() As String

Všimněte si také, že alias ProcessName je předán tomuto parametru.

Deklarování parametru ID

Tento vstupní parametr umožňuje uživateli zadat identifikátory procesů, které se mají zastavit. Všimněte si, že klíčové slovo atributu ParameterSetName atributu System.Management.Automation.ParameterAttribute určuje sadu parametrů ProcessId.

[Parameter(
           ParameterSetName = "ProcessId",
           Mandatory = true,
           ValueFromPipelineByPropertyName = true,
           ValueFromPipeline = true
)]
[Alias("ProcessId")]
public int[] Id
{
  get { return processIds; }
  set { processIds = value; }
}
private int[] processIds;
<Parameter(ParameterSetName:="ProcessId", _
Mandatory:=True, _
ValueFromPipelineByPropertyName:=True, _
ValueFromPipeline:=True), [Alias]("ProcessId")> _
Public Property Id() As Integer()
    Get
        Return processIds
    End Get
    Set(ByVal value As Integer())
        processIds = value
    End Set
End Property
Private processIds() As Integer

Všimněte si také, že tento parametr má alias ProcessId.

Deklarování parametru InputObject

Tento vstupní parametr umožňuje uživateli zadat vstupní objekt, který obsahuje informace o procesech, které se mají zastavit. Všimněte si, že klíčové slovo atributu ParameterSetName atributu System.Management.Automation.ParameterAttribute určuje InputObject parametr nastaven pro tento parametr.

[Parameter(
           ParameterSetName = "InputObject",
           Mandatory = true,
           ValueFromPipeline = true)]
public Process[] InputObject
{
  get { return inputObject; }
  set { inputObject = value; }
}
private Process[] inputObject;
<Parameter(ParameterSetName:="InputObject", _
Mandatory:=True, ValueFromPipeline:=True)> _
Public Property InputObject() As Process()
    Get
        Return myInputObject
    End Get
    Set(ByVal value As Process())
        myInputObject = value
    End Set
End Property
Private myInputObject() As Process

Všimněte si také, že tento parametr nemá žádný alias.

Deklarování parametrů v několika sadách parametrů

Přestože musí existovat jedinečný parametr pro každou sadu parametrů, parametry mohou patřit do více než jedné sady parametrů. V těchto případech dejte sdílenému parametru System.Management.Automation.ParameterAttribute deklaraci atributu pro každou sadu, do které parametr patří. Pokud je parametr ve všech sadách parametrů, stačí deklarovat atribut parametru pouze jednou a není nutné zadat název sady parametrů.

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

Každá rutina musí přepsat metodu zpracování vstupu, nejčastěji se jedná o metodu System.Management.Automation.Cmdlet.ProcessRecord. V této rutině se metoda System.Management.Automation.Cmdlet.ProcessRecord přepíše, aby rutina mohl zpracovat libovolný počet procesů. Obsahuje příkaz Select, který volá jinou metodu na základě toho, který parametr nastaven uživatel zadal.

protected override void ProcessRecord()
{
  switch (ParameterSetName)
  {
    case "ProcessName":
         ProcessByName();
         break;

    case "ProcessId":
         ProcessById();
         break;

    case "InputObject":
         foreach (Process process in inputObject)
         {
           SafeStopProcess(process);
         }
         break;

    default:
         throw new ArgumentException("Bad ParameterSet Name");
  } // switch (ParameterSetName...
} // ProcessRecord
Protected Overrides Sub ProcessRecord()
    Select Case ParameterSetName
        Case "ProcessName"
            ProcessByName()

        Case "ProcessId"
            ProcessById()

        Case "InputObject"
            Dim process As Process
            For Each process In myInputObject
                SafeStopProcess(process)
            Next process

        Case Else
            Throw New ArgumentException("Bad ParameterSet Name")
    End Select

End Sub 'ProcessRecord ' ProcessRecord

Pomocné metody volané příkazem Select nejsou zde popsány, ale jejich implementace se zobrazí v kompletní ukázce kódu v další části.

Ukázka kódu

Úplný vzorový kód jazyka C# najdete v tématu StopProcessSample04 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 ji musíte zaregistrovat 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. Tady je několik testů, které ukazují, jak lze parametry ProcessId a InputObject použít k otestování sad parametrů k zastavení procesu.

  • Po spuštění Windows PowerShellu spusťte rutinu Stop-Proc s parametrem ProcessId nastaveným tak, aby se proces zastavil na základě jeho identifikátoru. V tomto případě rutina k zastavení procesu používá parametr ProcessId nastavený.

    PS> Stop-Proc -Id 444
    Confirm
    Are you sure you want to perform this action?
    Performing operation "Stop-Proc" on Target "notepad (444)".
    [Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "Y"): Y
    
  • Při spuštění Windows PowerShellu spusťte rutinu Stop-Proc s parametrem InputObject nastaveným tak, aby se zastavily procesy u objektu Poznámkového bloku načteného příkazem Get-Process.

    PS> Get-Process notepad | Stop-Proc
    Confirm
    Are you sure you want to perform this action?
    Performing operation "Stop-Proc" on Target "notepad (444)".
    [Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "Y"): N
    

Viz také

Vytvoření rutiny, která upraví systémovou

Vytvoření rutin prostředí Windows PowerShell

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

registrace rutin, poskytovatelů a hostitelských aplikací

windows PowerShell SDK