Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Un cmdlet è un comando leggero usato nell'ambiente PowerShell. Il runtime di PowerShell richiama questi cmdlet all'interno del contesto degli script di automazione forniti nella riga di comando. Il runtime di PowerShell li richiama anche a livello di codice tramite le API di PowerShell.
Cmdlets
I cmdlet eseguono un'azione e in genere restituiscono un oggetto Microsoft .NET al comando successivo nella pipeline. Un cmdlet è un singolo comando che partecipa alla semantica della pipeline di PowerShell. Sono inclusi cmdlet binari (C#), funzioni di script avanzate, CDXML e flussi di lavoro.
Questa documentazione dell'SDK descrive come creare cmdlet binari scritti in C#. Per informazioni sui cmdlet basati su script, vedere:
- informazioni_sulle_funzioni_avanzate
- about_Functions_CmdletBindingAttribute
- about_Functions_Advanced_Methods
Per creare un cmdlet binario, è necessario implementare una classe cmdlet che deriva da una delle due classi di base di cmdlet specializzate. La classe derivata deve:
- Dichiarare un attributo che identifica la classe derivata come cmdlet.
- Definire le proprietà pubbliche decorate con attributi che identificano le proprietà pubbliche come parametri del cmdlet.
- Eseguire l'override di uno o più metodi di elaborazione di input per elaborare i record.
È possibile caricare l'assembly che contiene la classe direttamente usando il cmdlet Import-Module oppure è possibile creare un'applicazione host che carica l'assembly usando il System.Management.Automation.Runspaces.InitialSessionState API. Entrambi i metodi forniscono l'accesso a livello di codice e della riga di comando alla funzionalità del cmdlet.
Condizioni dei cmdlet
I termini seguenti vengono usati di frequente nella documentazione del cmdlet di PowerShell:
Attributo cmdlet
Attributo .NET usato per dichiarare una classe cmdlet come cmdlet. Anche se PowerShell usa diversi altri attributi facoltativi, è necessario l'attributo Cmdlet. Per altre informazioni su questo attributo, vedere dichiarazione dell'attributo del cmdlet.
Parametro del cmdlet
Proprietà pubbliche che definiscono i parametri disponibili per l'utente o per l'applicazione che esegue il cmdlet. I cmdlet possono avere parametri obbligatori, denominati, posizionali e switch. I parametri switch consentono di definire i parametri valutati solo se i parametri vengono specificati nella chiamata. Per altre informazioni sui diversi tipi di parametri, vedere Cmdlet Parameters.
Parameter Set
Gruppo di parametri che possono essere usati nello stesso comando per eseguire un'azione specifica. Un cmdlet può avere più set di parametri, ma ogni set di parametri deve avere almeno un parametro univoco. Una buona progettazione dei cmdlet suggerisce vivamente che il parametro univoco sia anche un parametro obbligatorio. Per altre informazioni sui set di parametri, vedere set di parametri del cmdlet .
Parametro dinamico
Parametro aggiunto al cmdlet in fase di esecuzione. In genere, i parametri dinamici vengono aggiunti al cmdlet quando un altro parametro è impostato su un valore specifico. Per altre informazioni sui parametri dinamici, vedere parametri dinamici del cmdlet .
Metodi di elaborazione dell'input
La classe System.Management.Automation.Cmdlet fornisce i metodi virtuali seguenti usati per elaborare i record. Tutte le classi di cmdlet derivate devono eseguire l'override di uno o più dei primi tre metodi:
- System.Management.Automation.Cmdlet.BeginProcessing: usato per fornire funzionalità facoltative di pre-elaborazione per il cmdlet.
- System.Management.Automation.Cmdlet.ProcessRecord: usato per fornire funzionalità di elaborazione record per record per il cmdlet. Il metodo System.Management.Automation.Cmdlet.ProcessRecord può essere chiamato un numero qualsiasi di volte o non affatto, a seconda dell'input del cmdlet.
- System.Management.Automation.Cmdlet.EndProcessing: usato per fornire funzionalità facoltative di post-elaborazione per il cmdlet.
- System.Management.Automation.Cmdlet.StopProcessing: usato per interrompere l'elaborazione quando l'utente arresta il cmdlet in modo asincrono, ad esempio premendo CTRL+C).
Per altre informazioni su questi metodi, vedere Cmdlet Input Processing Methods.
Quando si implementa un cmdlet, è necessario eseguire l'override di almeno uno di questi metodi di elaborazione di input. In genere, l'ProcessRecord() è il metodo di cui si esegue l'override perché viene chiamato per ogni record elaborato dal cmdlet. Al contrario, il metodo BeginProcessing() e il metodo EndProcessing() vengono chiamati una volta per eseguire la pre-elaborazione o la post-elaborazione dei record. Per altre informazioni su questi metodi, vedere metodi di elaborazione dell'input.
Funzionalità ShouldProcess
PowerShell consente di creare cmdlet che richiedono all'utente commenti e suggerimenti prima che il cmdlet apporta una modifica al sistema. Per usare questa funzionalità, il cmdlet deve dichiarare che supporta la funzionalità ShouldProcess
quando si dichiara l'attributo Cmdlet e il cmdlet deve chiamare il System.Management.Automation.Cmdlet.ShouldProcess e System.Management.Automation.Cmdlet.ShouldContinue metodi dall'interno di un metodo di elaborazione di input. Per altre informazioni su come supportare la funzionalità di ShouldProcess
, vedere Richiesta di conferma.
Transazione
Gruppo logico di comandi che vengono considerati come una singola attività. L'attività ha esito negativo automaticamente se un comando nel gruppo ha esito negativo e l'utente ha la possibilità di accettare o rifiutare le azioni eseguite all'interno della transazione. Per partecipare a una transazione, il cmdlet deve dichiarare che supporta le transazioni quando viene dichiarato l'attributo Cmdlet. Il supporto per le transazioni è stato introdotto in Windows PowerShell 2.0. Per altre informazioni sulle transazioni, vedere How to Support Transactions.
Differenze tra i cmdlet e i comandi
I cmdlet differiscono dai comandi in altri ambienti della shell dei comandi nei modi seguenti:
- I cmdlet sono istanze di classi .NET; non sono eseguibili autonomi.
- I cmdlet possono essere creati da poche righe di codice.
- I cmdlet in genere non eseguono la propria analisi, la presentazione degli errori o la formattazione dell'output. L'analisi, la presentazione degli errori e la formattazione dell'output vengono gestite dal runtime di PowerShell.
- I cmdlet elaborano gli oggetti di input dalla pipeline anziché da flussi di testo e i cmdlet in genere recapitano oggetti come output alla pipeline.
- I cmdlet sono orientati ai record perché elaborano un singolo oggetto alla volta.
Classi di base dei cmdlet
Windows PowerShell supporta i cmdlet derivati dalle due classi di base seguenti.
La maggior parte dei cmdlet si basa su classi .NET che derivano dalla classe base System.Management.Automation.Cmdlet. La derivazione da questa classe consente a un cmdlet di usare il set minimo di dipendenze nel runtime di Windows PowerShell. Questo ha due vantaggi. Il primo vantaggio è che gli oggetti cmdlet sono più piccoli e che è meno probabile che siano interessate dalle modifiche apportate al runtime di PowerShell. Il secondo vantaggio è che, se necessario, è possibile creare direttamente un'istanza dell'oggetto cmdlet e quindi richiamarla direttamente anziché richiamarla tramite il runtime di PowerShell.
I cmdlet più complessi si basano su classi .NET che derivano dalla classe base System.Management.Automation.PSCmdlet. La derivazione da questa classe offre molto più accesso al runtime di PowerShell. Questo accesso consente al cmdlet di chiamare gli script, di accedere ai provider e di accedere allo stato della sessione corrente. Per accedere allo stato della sessione corrente, si ottengono e si impostano le variabili di sessione e le preferenze. Tuttavia, la derivazione da questa classe aumenta le dimensioni dell'oggetto cmdlet e significa che il cmdlet è più strettamente associato alla versione corrente del runtime di PowerShell.
In generale, a meno che non sia necessario l'accesso esteso al runtime di PowerShell, è necessario derivare dalla classe system.Management.Automation.Cmdlet. Tuttavia, il runtime di PowerShell offre funzionalità di registrazione complete per l'esecuzione di cmdlet. Se il modello di controllo dipende da questa registrazione, è possibile impedire l'esecuzione del cmdlet da un altro cmdlet derivando dalla classe System.Management.Automation.PSCmdlet.
Attributi dei cmdlet
PowerShell definisce diversi attributi .NET usati per gestire i cmdlet e per specificare le funzionalità comuni fornite da PowerShell e che potrebbero essere richieste dal cmdlet . Ad esempio, gli attributi vengono usati per designare una classe come cmdlet, per specificare i parametri del cmdlet e per richiedere la convalida dell'input in modo che gli sviluppatori di cmdlet non devono implementare tale funzionalità nel codice del cmdlet. Per altre informazioni sugli attributi, vedere attributi di PowerShell.
Nomi dei cmdlet
PowerShell usa una coppia di nomi verbi e sostantivi per denominare i cmdlet. Ad esempio, il cmdlet Get-Command
incluso in PowerShell viene usato per ottenere tutti i cmdlet registrati nella shell dei comandi. Il verbo identifica l'azione eseguita dal cmdlet e il sostantivo identifica la risorsa in cui il cmdlet esegue l'azione.
Questi nomi vengono specificati quando la classe .NET viene dichiarata come cmdlet. Per altre informazioni su come dichiarare una classe .NET come cmdlet, vedere Dichiarazione di attributo cmdlet.
Scrittura del codice del cmdlet
Questo documento offre due modi per scoprire come viene scritto il codice del cmdlet. Se si preferisce visualizzare il codice senza molta spiegazione, vedere Esempi di codice del cmdlet. Se si preferisce una spiegazione più dettagliata del codice, vedere gli argomenti Esercitazione GetProc, Esercitazione stopProco SelectStr Tutorial.
Per altre informazioni sulle linee guida per la scrittura di cmdlet, vedere Cmdlet Development Guidelines.
Vedere anche
concetti relativi ai cmdlet di PowerShell