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
,OutVariable
eOutBuffer
. Inoltre, gli alias seguenti per questi nomi di parametro sono riservati:vb
,db
,ea
,ev
,ov
eob
.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
l'estensione dei tipi di oggetto e la formattazione
Come registrare cmdlet, provider e applicazioni host