Aggiunta di parametri che elaborano gli input della riga di comando

Un'origine di input per un cmdlet è la riga di comando. Questo argomento descrive come aggiungere un parametro al cmdlet (descritto in Creazione del primo cmdlet ) in modo che il cmdlet possa elaborare l'input dal computer locale in base a oggetti espliciti passati al Get-Proc cmdlet. Il cmdlet descritto qui recupera i processi in base ai relativi nomi e quindi visualizza informazioni sui Get-Proc processi al prompt dei comandi.

Definizione della classe Cmdlet

Il primo passaggio nella creazione del cmdlet è la denominazione dei cmdlet e la dichiarazione .NET Framework classe che implementa il cmdlet. Questo cmdlet recupera le informazioni sul processo, quindi il nome del verbo scelto qui è "Get". Quasi tutti i cmdlet in grado di recuperare informazioni possono elaborare l'input della riga di comando. Per altre informazioni sui verbi dei cmdlet approvati, vedere Nomi dei verbi dei cmdlet.

Ecco la dichiarazione di classe per il Get-Proc cmdlet . Per informazioni dettagliate su questa definizione, vedere Creazione del primo cmdlet.

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

Dichiarazione di parametri

Un parametro del cmdlet consente all'utente di fornire l'input al cmdlet. Nell'esempio seguente Get-Proc e sono i nomi dei cmdlet in pipeline ed è un parametro per il cmdlet Get-Member MemberType Get-Member . Il parametro ha l'argomento "property".

PS> get-proc ; get-member -membertype - proprietà

Per dichiarare i parametri per un cmdlet, è innanzitutto necessario definire le proprietà che rappresentano i parametri. Nel cmdlet l'unico parametro è , che in questo caso rappresenta il nome Get-Proc Name dell'.NET Framework processo da recuperare. Pertanto, la classe cmdlet definisce una proprietà di tipo string per accettare una matrice di nomi.

Ecco la dichiarazione di parametro per Name il parametro del 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

Per informare Windows PowerShell runtime che questa proprietà è il parametro , viene aggiunto un attributo Name System.Management.Automation.Parameterattribute alla definizione della proprietà. La sintassi di base per dichiarare questo attributo è [Parameter()] .

Nota

Un parametro deve essere contrassegnato in modo esplicito come pubblico. I parametri che non sono contrassegnati come pubblici per impostazione predefinita sono interni e non vengono trovati dal runtime Windows PowerShell pubblico.

Questo cmdlet usa una matrice di stringhe per il Name parametro . Se possibile, il cmdlet deve anche definire un parametro come matrice, perché in questo modo il cmdlet può accettare più di un elemento.

Aspetti da ricordare sulle definizioni dei parametri

  • I nomi Windows PowerShell parametri predefiniti e i tipi di dati devono essere riutilizzati il più possibile per garantire che il cmdlet sia compatibile con Windows PowerShell cmdlet. Ad esempio, se tutti i cmdlet usano il nome di parametro predefinito per identificare una risorsa, l'utente comprenderà facilmente il significato del parametro, indipendentemente dal Id cmdlet in uso. In pratica, i nomi dei parametri seguono le stesse regole usate per i nomi delle variabili in Common Language Runtime (CLR). Per altre informazioni sulla denominazione dei parametri, vedere Nomi dei parametri dei cmdlet.

  • Windows PowerShell riserva alcuni nomi di parametro per offrire un'esperienza utente coerente. Non usare questi nomi di parametro: WhatIf , , , , , , , Confirm e Verbose Debug Warn ErrorAction ErrorVariable OutVariable OutBuffer . Inoltre, gli alias seguenti per questi nomi di parametro sono riservati: vb , , , , e db ea ev ov ob .

  • Name è un nome di parametro semplice e comune, consigliato per l'uso nei cmdlet. È meglio scegliere un nome di parametro simile al seguente rispetto a un nome complesso univoco per un cmdlet specifico e difficile da ricordare.

  • Per i parametri non viene Windows PowerShell distinzione tra maiuscole e minuscole, anche se per impostazione predefinita la shell mantiene la distinzione tra maiuscole e minuscole. La distinzione tra maiuscole e minuscole degli argomenti dipende dal funzionamento del cmdlet . Gli argomenti vengono passati a un parametro come specificato nella riga di comando.

  • Per esempi di altre dichiarazioni di parametro, vedere Parametri dei cmdlet.

Dichiarazione di parametri come posizionali o denominati

Un cmdlet deve impostare ogni parametro come parametro posizionale o denominato. Entrambi i tipi di parametri accettano argomenti singoli, più argomenti separati da virgole e impostazioni booleane. Un parametro booleano, detto anche opzione, gestisce solo le impostazioni booleane. L'opzione viene utilizzata per determinare la presenza del parametro . Il valore predefinito consigliato è false .

Il Get-Proc cmdlet di esempio definisce il Name parametro come parametro posizionale con position 0. Ciò significa che il primo argomento immesso dall'utente nella riga di comando viene inserito automaticamente per questo parametro. Se si vuole definire un parametro denominato, per il quale l'utente deve specificare il nome del parametro dalla riga di comando, lasciare la parola chiave fuori Position dalla dichiarazione di attributo.

Nota

A meno che i parametri non siano denominati, è consigliabile rendere posizionali i parametri più usati in modo che gli utenti non dovranno digitare il nome del parametro.

Dichiarazione di parametri come obbligatori o facoltativi

Un cmdlet deve impostare ogni parametro come parametro facoltativo o obbligatorio. Nel cmdlet di esempio il parametro è definito come facoltativo perché la Get-Proc parola chiave non è Name Mandatory impostata nella dichiarazione dell'attributo.

Supporto della convalida dei parametri

Il cmdlet di esempio aggiunge un attributo di convalida Get-Proc dell'input, System.Management.Automation.Validatenotnulloremptyattribute,al parametro per abilitare la convalida che l'input non è né Name null vuoto. Questo attributo è uno dei diversi attributi di convalida forniti da Windows PowerShell. Per esempi di altri attributi di convalida, vedere Convalida dell'input del parametro.

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

Override di un metodo di elaborazione di input

Se il cmdlet deve gestire l'input della riga di comando, deve eseguire l'override dei metodi di elaborazione dell'input appropriati. I metodi di elaborazione dell'input di base sono stati introdotti in Creazione del primo cmdlet.

Il Get-Proc cmdlet esegue l'override del metodo System.Management.Automation.Cmdlet.ProcessRecord per gestire l'input del parametro fornito dall'utente Name o da uno script. Questo metodo ottiene i processi per ogni nome di processo richiesto o tutti per i processi se non viene specificato alcun nome. Si noti che in System.Management.Automation.Cmdlet.ProcessRecordla chiamata a System.Management.Automation.Cmdlet.WriteObject%28System.Object%2CSystem.Boolean%29 è il meccanismo di output per l'invio di oggetti di output alla pipeline. Il secondo parametro di questa chiamata, , è impostato su per informare il runtime di Windows PowerShell di enumerare la matrice di output di oggetti processo e scrivere un processo alla volta nella riga enumerateCollection true di comando.

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

Codice di esempio

Per il codice di esempio C# completo, vedere l'esempio GetProcessSample02.

Definizione di tipi di oggetto e formattazione

Windows PowerShell passa informazioni tra i cmdlet usando .NET Framework oggetti . Di conseguenza, un cmdlet potrebbe dover definire il proprio tipo o un 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 usando uno snap-in Windows PowerShell di configurazione. Per altre informazioni sulla registrazione dei cmdlet, vedere How to Register Cmdlets, Providers, and Host Applications.

Test del cmdlet

Quando il cmdlet viene registrato con Windows PowerShell, è possibile testarlo eseguendolo nella riga di comando. Ecco due modi per testare il codice per il cmdlet di esempio. Per altre informazioni sull'uso dei cmdlet dalla riga di comando, vedere Attività iniziali con Windows PowerShell.

  • Al prompt Windows PowerShell, usare il comando seguente per elencare il processo Internet Explorer, denominato "IEXPLORE".

    get-proc -name iexplore
    

    Viene visualizzato l'output seguente.

    Handles  NPM(K)  PM(K)   WS(K)  VS(M)  CPU(s)   Id   ProcessName
    -------  ------  -----   -----  -----   ------ --   -----------
        354      11  10036   18992    85   0.67   3284   iexplore
    
  • Per elencare i processi Internet Explorer, Outlook e Blocco note denominati "IEXPLORE", "OUTLOOK" e "NOTEPAD", usare il comando seguente. Se sono presenti più processi, vengono visualizzati tutti.

    get-proc -name iexplore, outlook, notepad
    

    Viene visualizzato l'output seguente.

    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
    

Vedere anche

Aggiunta di parametri che elaborano gli input della pipeline

Creazione del primo cmdlet

Estensione dei tipi di oggetto e formattazione

Come registrare cmdlet, provider e applicazioni host

Guida di riferimento di Windows PowerShell

Esempi di cmdlet