Creazione di un cmdlet senza parametri

Questa sezione descrive come creare un cmdlet che recupera le informazioni dal computer locale senza l'uso di parametri e quindi scrive le informazioni nella pipeline. Il cmdlet descritto di seguito è un cmdlet Get-Proc che recupera informazioni sui processi del computer locale e quindi visualizza tali informazioni nella riga di comando.

Nota

Tenere presente che quando si scrivono i cmdlet, gli assembly di riferimento Windows PowerShell® vengono scaricati su disco (per impostazione predefinita in C:\Programmi\Reference Assemblies\Microsoft\WindowsPowerShell\v1.0). Non vengono installati nella Global Assembly Cache (GAC).

Denominazione del cmdlet

Un nome di cmdlet è costituito da un verbo che indica l'azione eseguita dal cmdlet e da un sostantivo che indica gli elementi su cui agisce il cmdlet. Poiché questo cmdlet Get-Proc di esempio recupera gli oggetti processo, usa il verbo "Get", definito dall'enumerazione System.Management.Automation.Verbscommon, e il sostantivo "Proc" per indicare che il cmdlet funziona sugli elementi del processo.

Quando si assegnano nomi ai cmdlet, non usare i caratteri seguenti: # , () {} [] & - /\ $ ; : " '<> | ? @ ` .

Scelta di un sostantivo

È consigliabile scegliere un sostantivo specifico. È meglio usare un sostantivo singolare preceduto da una versione abbreviata del nome del prodotto. Un nome di cmdlet di esempio di questo tipo è " Get-SQLServer ".

Scelta di un verbo

È consigliabile usare un verbo dal set di nomi di verbi di cmdlet approvati. Per altre informazioni sui verbi dei cmdlet approvati, vedere Nomi dei verbi dei cmdlet.

Definizione della classe Cmdlet

Dopo aver scelto un nome di cmdlet, definire una classe .NET per implementare il cmdlet. Ecco la definizione della classe per questo cmdlet Get-Proc esempio:

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

Si noti che prima della definizione della classe, l'attributo System.Management.Automation.CmdletAttribute, con la sintassi , viene usato per identificare questa classe [Cmdlet(verb, noun, ...)] come cmdlet. Questo è l'unico attributo obbligatorio per tutti i cmdlet e consente al runtime Windows PowerShell di chiamarli correttamente. È possibile impostare parole chiave di attributo per dichiarare ulteriormente la classe, se necessario. Tenere presente che la dichiarazione di attributo per la classe GetProcCommand di esempio dichiara solo i nomi di sostantivo e verbo per il cmdlet Get-Proc.

Nota

Per tutte Windows PowerShell classi di attributi, le parole chiave che è possibile impostare corrispondono alle proprietà della classe attribute.

Quando si assegna un nome alla classe del cmdlet, è consigliabile riflettere il nome del cmdlet nel nome della classe. A tale scopo, usare il formato "VerbNounCommand" e sostituire "Verbo" e "Sostantivo" con il verbo e il sostantivo usati nel nome del cmdlet. Come illustrato nella definizione di classe precedente, il cmdlet Get-Proc di esempio definisce una classe denominata GetProcCommand, che deriva dalla classe di base System.Management.Automation.Cmdlet.

Importante

Se si vuole definire un cmdlet che accede direttamente al runtime Windows PowerShell, la classe .NET deve derivare dalla classe di base System.Management.Automation.PSCmdlet. Per altre informazioni su questa classe, vedere Creazione di un cmdlet che definisce set di parametri.

Nota

La classe per un cmdlet deve essere contrassegnata in modo esplicito come pubblica. Le classi che non sono contrassegnate come pubbliche per impostazione predefinita saranno interne e non verranno trovate dal runtime Windows PowerShell runtime.

Windows PowerShell usa lo spazio dei nomi Microsoft.PowerShell.Commands per le relative classi di cmdlet. È consigliabile inserire le classi di cmdlet in uno spazio dei nomi Commands dello spazio dei nomi dell'API, ad esempio xxx.PS.Commands.

Override di un metodo di elaborazione di input

La classe System.Management.Automation.Cmdlet fornisce tre metodi di elaborazione dell'input principali, almeno uno dei quali deve essere sottoposto a override dal cmdlet. Per altre informazioni su come Windows PowerShell i record, vedere How Windows PowerShell Works (Funzionamento di Windows PowerShell).

Per tutti i tipi di input, il runtime Windows PowerShell chiama System.Management.Automation.Cmdlet.BeginProcessing per abilitare l'elaborazione. Se il cmdlet deve eseguire alcune operazioni di pre-elaborazione o configurazione, può eseguire questa operazione eseguendo l'override di questo metodo.

Nota

Windows PowerShell usa il termine "record" per descrivere il set di valori di parametro forniti quando viene chiamato un cmdlet.

Se il cmdlet accetta l'input della pipeline, deve eseguire l'override del metodo System.Management.Automation.Cmdlet.ProcessRecord e, facoltativamente, del metodo System.Management.Automation.Cmdlet.EndProcessing. Ad esempio, un cmdlet potrebbe eseguire l'override di entrambi i metodi se raccoglie tutto l'input usando System.Management.Automation.Cmdlet.ProcessRecord e quindi opera sull'input nel suo complesso anziché su un elemento alla volta, come fa il Sort-Object cmdlet.

Se il cmdlet non accetta l'input della pipeline, deve eseguire l'override del metodo System.Management.Automation.Cmdlet.EndProcessing. Tenere presente che questo metodo viene spesso usato al posto di System.Management.Automation.Cmdlet.BeginProcessing quando il cmdlet non può operare su un elemento alla volta, come nel caso di un cmdlet di ordinamento.

Poiché questo cmdlet Get-Proc di esempio deve ricevere l'input della pipeline, esegue l'override del metodo System.Management.Automation.Cmdlet.ProcessRecord e usa le implementazioni predefinite per System.Management.Automation.Cmdlet.BeginProcessing e System.Management.Automation.Cmdlet.EndProcessing. L'override System.Management.Automation.Cmdlet.ProcessRecord recupera i processi e li scrive nella riga di comando usando il metodo System.Management.Automation.Cmdlet.WriteObject.

protected override void ProcessRecord()
{
  // Get the current processes
  Process[] processes = Process.GetProcesses();

  // Write the processes to the pipeline making them available
  // to the next cmdlet. The second parameter of this call tells
  // PowerShell to enumerate the array, and send one process at a
  // time to the pipeline.
  WriteObject(processes, true);
}
Protected Overrides Sub ProcessRecord()

    '/ Get the current processes.
    Dim processes As Process()
    processes = Process.GetProcesses()

    '/ Write the processes to the pipeline making them available
    '/ to the next cmdlet. The second parameter of this call tells
    '/ PowerShell to enumerate the array, and send one process at a
    '/ time to the pipeline.
    WriteObject(processes, True)

End Sub 'ProcessRecord

Aspetti da ricordare sull'elaborazione dell'input

  • L'origine predefinita per l'input è un oggetto esplicito , ad esempio una stringa, fornito dall'utente nella riga di comando. Per altre informazioni, vedere Creazione di un cmdlet per elaborare l'input della riga di comando.

  • Un metodo di elaborazione dell'input può anche ricevere input dall'oggetto di output di un cmdlet upstream nella pipeline. Per altre informazioni, vedere Creazione di un cmdlet per elaborare l'input della pipeline. Tenere presente che il cmdlet può ricevere input da una combinazione di origini della riga di comando e pipeline.

  • Il cmdlet downstream potrebbe non essere restituito per molto tempo o non restituire affatto. Per questo motivo, il metodo di elaborazione dell'input nel cmdlet non deve contenere blocchi durante le chiamate a System.Management.Automation.Cmdlet.WriteObject,in particolare i blocchi per i quali l'ambito si estende oltre l'istanza del cmdlet.

Importante

I cmdlet non devono mai chiamare System.Console.Writeline* o il relativo equivalente.

Ad esempio, System.Management.Automation.Cmdlet.EndProcessing potrebbe non essere chiamato se il cmdlet viene annullato a metà o se si verifica un errore di terminazione in qualsiasi parte del cmdlet. Pertanto, un cmdlet che richiede la pulizia degli oggetti deve implementare il modello System.IDisposable completo, incluso il finalizzatore, in modo che il runtime possa chiamare sia System.Management.Automation.Cmdlet.EndProcessing che System.IDisposable.Dispose* al termine dell'elaborazione.

Codice di esempio

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

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 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

Dopo aver registrato il cmdlet con Windows PowerShell, è possibile testarlo eseguendolo nella riga di comando. Il codice per il cmdlet Get-Proc di esempio è ridotto, ma usa comunque il runtime di Windows PowerShell e un oggetto .NET esistente, sufficiente per renderlo utile. Verrà ora testato per comprendere meglio le Get-Proc possibile eseguire e come può essere usato l'output. Per altre informazioni sull'uso dei cmdlet dalla riga di comando, vedere l'Attività iniziali con Windows PowerShell.

  1. Avviare Windows PowerShell e ottenere i processi correnti in esecuzione nel computer.

    get-proc
    

    Viene visualizzato l'output seguente.

    Handles  NPM(K)  PM(K)  WS(K)  VS(M)  CPU(s)  Id   ProcessName
    -------  ------  -----  -----  -----  ------  --   ----------
    254      7       7664   12048  66     173.75  1200  QCTRAY
    32       2       1372   2628   31       0.04  1860  DLG
    271      6       1216   3688   33       0.03  3816  lg
    27       2       560    1920   24       0.01  1768  TpScrex
    ...
    
  2. Assegnare una variabile ai risultati del cmdlet per semplificarne la modifica.

    $p=get-proc
    
  3. Ottiene il numero di processi.

    $p.length
    

    Viene visualizzato l'output seguente.

    63
    
  4. Recuperare un processo specifico.

    $p[6]
    

    Viene visualizzato l'output seguente.

    Handles  NPM(K)  PM(K)  WS(K)  VS(M)  CPU(s)  Id    ProcessName
    -------  ------  -----  -----  -----  ------  --    -----------
    1033     3       2400   3336   35     0.53    1588  rundll32
    
  5. Ottiene l'ora di inizio del processo.

    $p[6].starttime
    

    Viene visualizzato l'output seguente.

    Tuesday, July 26, 2005 9:34:15 AM
    
    $p[6].starttime.dayofyear
    
    207
    
  6. Ottenere i processi per cui il conteggio degli handle è maggiore di 500 e ordinare il risultato.

    $p | Where-Object {$_.HandleCount -gt 500 } | Sort-Object HandleCount
    

    Viene visualizzato l'output seguente.

    Handles  NPM(K)  PM(K)  WS(K)  VS(M)  CPU(s)  Id   ProcessName
    -------  ------  -----  -----  -----  ------  --   ----------
    568      14      2164   4972   39     5.55    824  svchost
    716       7      2080   5332   28    25.38    468  csrss
    761      21      33060  56608  440  393.56    3300 WINWORD
    791      71      7412   4540   59     3.31    492  winlogon
    ...
    
  7. Usare il Get-Member cmdlet per elencare le proprietà disponibili per ogni processo.

    $p | Get-Member -MemberType property
    
        TypeName: System.Diagnostics.Process
    

    Viene visualizzato l'output seguente.

    Name                     MemberType Definition
    ----                     ---------- ----------
    BasePriority             Property   System.Int32 BasePriority {get;}
    Container                Property   System.ComponentModel.IContainer Conta...
    EnableRaisingEvents      Property   System.Boolean EnableRaisingEvents {ge...
    ...
    

Vedere anche

Creazione di un cmdlet per elaborare l'input della riga di comando

Creazione di un cmdlet per elaborare l'input della pipeline

Come creare un cmdlet Windows PowerShell

Estensione dei tipi di oggetto e formattazione

Funzionamento Windows PowerShell

Come registrare cmdlet, provider e applicazioni host

Guida di riferimento di Windows PowerShell

Esempi di cmdlet