Condividi tramite


Aggiunta di parametri che elaborano gli input della riga di comando

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

Definizione della classe cmdlet

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

Ecco la dichiarazione di classe per il cmdlet Get-Proc. I dettagli su questa definizione sono disponibili in 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 cmdlet consente all'utente di fornire input al cmdlet. Nell'esempio seguente Get-Proc e Get-Member sono i nomi dei cmdlet con pipeline e MemberType è un parametro per il cmdlet Get-Member. Il parametro ha l'argomento "property".

PS> Get-Proc ; proprietà Get-Member -MemberType

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

Ecco la dichiarazione di parametro per il parametro Name 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 il runtime di Windows PowerShell che questa proprietà è il parametro Name, viene aggiunto un attributo 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 interna e non vengono trovati dal runtime di Windows PowerShell.

Questo cmdlet usa una matrice di stringhe per il parametro Name. Se possibile, il cmdlet deve anche definire un parametro come matrice, perché consente al cmdlet di accettare più di un elemento.

Aspetti da ricordare sulle definizioni dei parametri

  • I nomi dei parametri e i tipi di dati predefiniti di Windows PowerShell devono essere riutilizzati il più possibile per garantire che il cmdlet sia compatibile con i cmdlet di Windows PowerShell. Ad esempio, se tutti i cmdlet usano il nome di parametro Id predefinito per identificare una risorsa, l'utente comprenderà facilmente il significato del parametro, indipendentemente dal cmdlet in uso. Fondamentalmente, 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 Cmdlet Parameter Names.

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

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

  • I parametri non fanno distinzione tra maiuscole e minuscole in Windows PowerShell, anche se per impostazione predefinita la shell mantiene la distinzione tra maiuscole e minuscole. La distinzione tra maiuscole e minuscole degli argomenti dipende dall'operazione del cmdlet. Gli argomenti vengono passati a un parametro come specificato nella riga di comando.

  • Per esempi di altre dichiarazioni di parametri, vedere Cmdlet Parameters.

Dichiarazione di parametri come posizionali o denominati

Un cmdlet deve impostare ogni parametro come parametro posizionale o denominato. Entrambi i tipi di parametri accettano singoli argomenti, 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 cmdlet Get-Proc di esempio definisce il parametro Name come parametro posizionale con la posizione 0. Ciò significa che il primo argomento immesso dall'utente nella riga di comando viene inserito automaticamente per questo parametro. Se si desidera definire un parametro denominato, per il quale l'utente deve specificare il nome del parametro dalla riga di comando, lasciare la parola chiave Position dalla dichiarazione dell'attributo.

Nota

A meno che i parametri non debbano essere denominati, è consigliabile posizionare i parametri più usati in modo che gli utenti non debbano 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 Get-Proc di esempio il parametro Name è definito come facoltativo perché la parola chiave Mandatory non è impostata nella dichiarazione dell'attributo.

Supporto della convalida dei parametri

Il cmdlet di esempio Get-Proc aggiunge un attributo di convalida di input, System.Management.Automation.ValidateNotNullOrEmptyAttribute, al parametro Name per abilitare la convalida che l'input non è né null né 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 di input appropriati. I metodi di elaborazione di input di base vengono introdotti in Creazione del primo cmdlet.

Il cmdlet Get-Proc esegue l'override del metodo System.Management.Automation.Cmdlet.ProcessRecord per gestire l'input del parametro Name fornito dall'utente 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.ProcessRecord, la chiamata a System.Management.Automation.Cmdlet.WriteObject è il meccanismo di output per l'invio di oggetti di output alla pipeline. Il secondo parametro di questa chiamata, enumerateCollection, è impostato su true per informare il runtime di Windows PowerShell di enumerare la matrice di output degli oggetti processo e scrivere un processo alla volta nella riga 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 Esempio getProcessSample02.

Definizione di tipi di oggetto e formattazione

Windows PowerShell passa informazioni tra i cmdlet usando oggetti .NET Framework. Di conseguenza, potrebbe essere necessario 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 dei 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 di Windows PowerShell. Per altre informazioni sulla registrazione dei cmdlet, vedere Come registrare cmdlet, provider e applicazioni host.

Test del cmdlet

Quando il cmdlet è 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 Introduzione a Windows PowerShell.

  • Al prompt di Windows PowerShell usare il comando seguente per elencare il processo di 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 di Internet Explorer, Outlook e Blocco note denominati "IEXPLORE", "OUTLOOK" e "NOTEPAD", utilizzare 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 di input della pipeline di elaborazione

creazione del primo cmdlet

l'estensione dei tipi di oggetto e la formattazione

Come registrare cmdlet, provider e applicazioni host

di riferimento di Windows PowerShell

esempi di cmdlet