Aggiunta dei set di parametri a un cmdlet

Informazioni sui set di parametri

Windows PowerShell definisce un set di parametri come gruppo di parametri che operano insieme. Raggruppando i parametri di un cmdlet, è possibile creare un singolo cmdlet che può modificarne la funzionalità in base al gruppo di parametri specificato dall'utente.

Un esempio di cmdlet che usa due set di parametri per definire funzionalità diverse è il cmdlet fornito Get-EventLog da Windows PowerShell. Questo cmdlet restituisce informazioni diverse quando l'utente specifica il List parametro LogName o . Se il LogName parametro viene specificato, il cmdlet restituisce informazioni sugli eventi in un determinato registro eventi. Se si List specifica il parametro , il cmdlet restituisce informazioni sui file di log stessi (non sulle informazioni sugli eventi che contengono). In questo caso, i List parametri LogName e identificano due set di parametri separati.

Due aspetti importanti da ricordare sui set di parametri sono che il runtime di Windows PowerShell usa un solo set di parametri per un determinato input e che ogni set di parametri deve avere almeno un parametro univoco per tale set di parametri.

Per illustrare l'ultimo punto, Stop-Proc cmdlet usa tre set di parametri: ProcessName ProcessId , e InputObject . Ognuno di questi set di parametri ha un parametro che non si trova negli altri set di parametri. I set di parametri possono condividere altri parametri, ma il cmdlet usa i parametri univoci , e per identificare il set di parametri che il ProcessName ProcessId runtime Windows PowerShell deve InputObject usare.

Dichiarazione della classe Cmdlet

Il primo passaggio nella creazione dei cmdlet consiste sempre nel denominare il cmdlet e dichiarare la classe .NET che implementa il cmdlet. Per questo cmdlet viene usato il verbo del ciclo di vita "Stop" perché il cmdlet arresta i processi di sistema. Il nome "Proc" viene usato perché il cmdlet funziona sui processi. Nella dichiarazione seguente si noti che il verbo del cmdlet e il nome del sostantivo si riflettono nel nome della classe del cmdlet.

Nota

Per altre informazioni sui nomi dei verbi dei cmdlet approvati, vedere Nomi dei verbi dei cmdlet.

Il codice seguente è la definizione della classe per questo cmdlet 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

Dichiarazione dei parametri del cmdlet

Questo cmdlet definisce tre parametri necessari come input per il cmdlet (questi parametri definiscono anche i set di parametri), nonché un parametro che gestisce le operazioni del cmdlet e un parametro che determina se il cmdlet invia un oggetto di output tramite la Force PassThru pipeline. Per impostazione predefinita, questo cmdlet non passa un oggetto attraverso la pipeline. Per altre informazioni su questi ultimi due parametri, vedere Creazione di un cmdlet che modifica il sistema.

Dichiarazione del parametro Name

Questo parametro di input consente all'utente di specificare i nomi dei processi da arrestato. Si noti che ParameterSetName la parola chiave attribute dell'attributo System.Management.Automation.Parameterattribute specifica il ProcessName set di parametri per questo parametro.

[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

Si noti anche che l'alias "ProcessName" viene assegnato a questo parametro.

Dichiarazione del parametro Id

Questo parametro di input consente all'utente di specificare gli identificatori dei processi da arrestato. Si noti che la ParameterSetName parola chiave attribute dell'attributo System.Management.Automation.Parameterattribute specifica il ProcessId set di parametri.

[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

Si noti anche che l'alias "ProcessId" viene assegnato a questo parametro.

Dichiarazione del parametro InputObject

Questo parametro di input consente all'utente di specificare un oggetto di input che contiene informazioni sui processi da arrestato. Si noti che ParameterSetName la parola chiave attribute dell'attributo System.Management.Automation.Parameterattribute specifica il InputObject set di parametri per questo parametro.

[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

Si noti anche che questo parametro non ha alias.

Dichiarazione di parametri in più set di parametri

Anche se deve essere presente un parametro univoco per ogni set di parametri, i parametri possono appartenere a più set di parametri. In questi casi, assegnare al parametro condiviso una dichiarazione di attributo System.Management.Automation.Parameterattribute per ogni set a cui appartiene il parametro. Se un parametro si trova in tutti i set di parametri, è necessario dichiarare l'attributo del parametro una sola volta e non è necessario specificare il nome del set di parametri.

Override di un metodo di elaborazione di input

Ogni cmdlet deve eseguire l'override di un metodo di elaborazione dell'input. Nella maggior parte dei casi si tratta del metodo System.Management.Automation.Cmdlet.ProcessRecord. In questo cmdlet viene eseguito l'override del metodo System.Management.Automation.Cmdlet.ProcessRecord in modo che il cmdlet possa elaborare un numero qualsiasi di processi. Contiene un'istruzione Select che chiama un metodo diverso in base al set di parametri specificato dall'utente.

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

I metodi helper chiamati dall'istruzione Select non sono descritti qui, ma è possibile visualizzarne l'implementazione nell'esempio di codice completo nella sezione successiva.

Codice di esempio

Per il codice di esempio C# completo, vedere StopProcessSample04 Sample.

Definizione di tipi di oggetto e formattazione

Windows PowerShell passa informazioni tra i cmdlet usando oggetti .NET. Di conseguenza, un cmdlet potrebbe dover definire il proprio tipo o il cmdlet potrebbe dover estendere un tipo esistente fornito da un altro cmdlet. Per altre informazioni sulla definizione di nuovi tipi o sull'estensione di tipi esistenti, vedere Estensione dei tipi di oggetto e formattazione.

Compilazione del cmdlet

Dopo aver implementato un cmdlet, è necessario registrarlo con Windows PowerShell tramite Windows PowerShell snap-in. Per altre informazioni sulla registrazione dei cmdlet, vedere How to Register Cmdlets, Providers, and Host Applications.

Test del cmdlet

Dopo aver registrato il cmdlet con Windows PowerShell, testarlo eseguendolo nella riga di comando. Di seguito sono riportati alcuni test che illustrano come usare i ProcessId InputObject parametri e per testare i relativi set di parametri per arrestare un processo.

  • Dopo Windows PowerShell, eseguire il cmdlet Stop-Proc con il parametro impostato per ProcessId arrestare un processo in base al relativo identificatore. In questo caso, il cmdlet usa il ProcessId set di parametri per arrestare il processo.

    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
    
  • Dopo Windows PowerShell, eseguire il cmdlet Stop-Proc con il parametro impostato per arrestare i processi nell Blocco note o InputObject object recuperato dal Get-Process comando.

    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
    

Vedere anche

Creazione di un cmdlet che modifica il sistema

Come creare un cmdlet Windows PowerShell

Estensione dei tipi di oggetto e formattazione

Come registrare cmdlet, provider e applicazioni host

Windows PowerShell SDK