Freigeben über


Hinzufügen von Parametersätzen zu einem Cmdlet

Wichtige Informationen zu Parametersätzen

Windows PowerShell definiert einen Parametersatz als Eine Gruppe von Parametern, die zusammen funktionieren. Durch Gruppieren der Parameter eines Cmdlets können Sie ein einzelnes Cmdlet erstellen, das seine Funktionalität basierend auf der vom Benutzer angegebenen Parametergruppe ändern kann.

Ein Beispiel für ein Cmdlet, das zwei Parametersätze verwendet, um verschiedene Funktionen zu definieren, ist das cmdlet Get-EventLog, das von Windows PowerShell bereitgestellt wird. Dieses Cmdlet gibt unterschiedliche Informationen zurück, wenn der Benutzer den parameter List oder LogName angibt. Wenn der parameter LogName angegeben ist, gibt das Cmdlet Informationen zu den Ereignissen in einem bestimmten Ereignisprotokoll zurück. Wenn der parameter List angegeben ist, gibt das Cmdlet Informationen zu den Protokolldateien selbst zurück (nicht die darin enthaltenen Ereignisinformationen). In diesem Fall identifizieren die parameter List und LogName zwei separate Parametersätze.

Zwei wichtige Dinge, die Sie bei Parametersätzen beachten sollten, ist, dass die Windows PowerShell-Laufzeit nur einen Parameter verwendet, der für eine bestimmte Eingabe festgelegt ist, und dass jeder Parametersatz mindestens einen Parameter aufweisen muss, der für diesen Parametersatz eindeutig ist.

Um diesen letzten Punkt zu veranschaulichen, verwendet dieses Stop-Proc Cmdlet drei Parametersätze: ProcessName, ProcessIdund InputObject. Jeder dieser Parametersätze weist einen Parameter auf, der nicht in den anderen Parametersätzen enthalten ist. Die Parametersätze können andere Parameter gemeinsam nutzen, das Cmdlet verwendet jedoch die eindeutigen Parameter ProcessName, ProcessIdund InputObject, um zu ermitteln, welche Parametersätze von der Windows PowerShell-Laufzeit verwendet werden sollen.

Deklarieren der Cmdlet-Klasse

Der erste Schritt beim Erstellen von Cmdlets ist immer das Benennen des Cmdlets und das Deklarieren der .NET-Klasse, die das Cmdlet implementiert. Für dieses Cmdlet wird das Lebenszyklusverb "Stop" verwendet, da das Cmdlet Systemprozesse beendet. Der Substantivname "Proc" wird verwendet, da das Cmdlet für Prozesse funktioniert. Beachten Sie in der nachstehenden Deklaration, dass das Cmdlet-Verb und der Name des Substantivs im Namen der Cmdlet-Klasse wiedergegeben werden.

Hinweis

Weitere Informationen zu genehmigten Cmdlet-Verbnamen finden Sie unter Cmdlet Verb Names.

Der folgende Code ist die Klassendefinition für dieses Stop-Proc-Cmdlet.

[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

Deklarieren der Parameter des Cmdlets

Dieses Cmdlet definiert drei Parameter, die als Eingabe für das Cmdlet erforderlich sind (diese Parameter definieren auch die Parametersätze) sowie einen Force Parameter, der die Funktionsweise des Cmdlets verwaltet, und einen PassThru Parameter, der bestimmt, ob das Cmdlet ein Ausgabeobjekt über die Pipeline sendet. Standardmäßig übergibt dieses Cmdlet kein Objekt über die Pipeline. Weitere Informationen zu diesen beiden letzten Parametern finden Sie unter Erstellen eines Cmdlets, das das Systemändert.

Deklarieren des Namensparameters

Mit diesem Eingabeparameter kann der Benutzer die Namen der zu beendenden Prozesse angeben. Beachten Sie, dass das ParameterSetName Attributschlüsselwort des System.Management.Automation.ParameterAttribute Attribut den ProcessName Parametersatz für diesen Parameter angibt.

[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

Beachten Sie auch, dass der Alias "ProcessName" diesem Parameter zugewiesen wird.

Deklarieren des ID-Parameters

Mit diesem Eingabeparameter kann der Benutzer die Bezeichner der zu beendenden Prozesse angeben. Beachten Sie, dass das ParameterSetName Attributschlüsselwort des System.Management.Automation.ParameterAttribute Attribut den ProcessId Parametersatz angibt.

[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

Beachten Sie auch, dass der Alias "ProcessId" diesem Parameter zugewiesen wird.

Deklarieren des InputObject-Parameters

Mit diesem Eingabeparameter kann der Benutzer ein Eingabeobjekt angeben, das Informationen zu den zu beendenden Prozessen enthält. Beachten Sie, dass das ParameterSetName Attributschlüsselwort des System.Management.Automation.ParameterAttribute Attribut den InputObject Parametersatz für diesen Parameter angibt.

[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

Beachten Sie auch, dass dieser Parameter keinen Alias aufweist.

Deklarieren von Parametern in mehreren Parametersätzen

Obwohl für jeden Parametersatz ein eindeutiger Parameter vorhanden sein muss, können Parameter zu mehr als einem Parametersatz gehören. Geben Sie in diesen Fällen dem freigegebenen Parameter einen System.Management.Automation.ParameterAttribute Attributdeklaration für jeden Satz, zu dem der Parameter gehört. Wenn sich ein Parameter in allen Parametersätzen befindet, müssen Sie das Parameterattribute nur einmal deklarieren und nicht den Parametersatznamen angeben.

Überschreiben einer Eingabeverarbeitungsmethode

Jedes Cmdlet muss eine Eingabeverarbeitungsmethode außer Kraft setzen, meistens ist dies die System.Management.Automation.Cmdlet.ProcessRecord-Methode. In diesem Cmdlet wird die System.Management.Automation.Cmdlet.ProcessRecord Methode überschrieben, sodass das Cmdlet eine beliebige Anzahl von Prozessen verarbeiten kann. Sie enthält eine Select-Anweisung, die eine andere Methode aufruft, basierend auf welchem Parameter festgelegt, den der Benutzer angegeben hat.

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

Die von der Select-Anweisung aufgerufenen Hilfsmethoden werden hier nicht beschrieben, aber sie werden im vollständigen Codebeispiel im nächsten Abschnitt angezeigt.

Codebeispiel

Den vollständigen C#-Beispielcode finden Sie unter StopProcessSample04 Sample.

Definieren von Objekttypen und Formatierungen

Windows PowerShell übergibt Informationen zwischen Cmdlets mithilfe von .NET-Objekten. Daher muss ein Cmdlet möglicherweise einen eigenen Typ definieren, oder das Cmdlet muss einen vorhandenen Typ erweitern, der von einem anderen Cmdlet bereitgestellt wird. Weitere Informationen zum Definieren neuer Typen oder zum Erweitern vorhandener Typen finden Sie unter Erweitern von Objekttypen und Formatierungen.

Erstellen des Cmdlets

Nach der Implementierung eines Cmdlets müssen Sie es über ein Windows PowerShell-Snap-In bei Windows PowerShell registrieren. Weitere Informationen zum Registrieren von Cmdlets finden Sie unter Registrieren von Cmdlets, Anbietern und Hostanwendungen.

Testen des Cmdlets

Wenn Ihr Cmdlet bei Windows PowerShell registriert wurde, testen Sie es, indem Sie es in der Befehlszeile ausführen. Hier sind einige Tests, die zeigen, wie die parameter ProcessId und InputObject verwendet werden können, um ihre Parametersätze zu testen, um einen Prozess zu beenden.

  • Führen Sie mit Windows PowerShell das cmdlet Stop-Proc aus, wobei der Parameter ProcessId festgelegt ist, um einen Prozess basierend auf seinem Bezeichner zu beenden. In diesem Fall verwendet das Cmdlet den ProcessId Parameter, der zum Beenden des Prozesses festgelegt ist.

    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
    
  • Führen Sie mit windows PowerShell das cmdlet Stop-Proc aus, wobei der Parameter InputObject festgelegt ist, um Prozesse für das Editor-Objekt zu beenden, das vom Befehl Get-Process abgerufen wird.

    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
    

Siehe auch

Erstellen eines Cmdlets, das das System

Erstellen eines Windows PowerShell-Cmdlets

Erweitern von Objekttypen und Formatierungen

Registrieren von Cmdlets, Anbietern und Hostanwendungen

Windows PowerShell SDK-