Aggiunta dei set di parametri a un cmdlet
Informazioni sui set di parametri
Windows PowerShell definisce un set di parametri come gruppo di parametri che operano insieme. Raggruppando i parametri di un cmdlet, è possibile creare un singolo cmdlet che può modificarne la funzionalità in base al gruppo di parametri specificato dall'utente.
Un esempio di cmdlet che usa due set di parametri per definire funzionalità diverse è il cmdlet fornito Get-EventLog
da Windows PowerShell. Questo cmdlet restituisce informazioni diverse quando l'utente specifica il List
parametro LogName
o . Se il LogName
parametro viene specificato, il cmdlet restituisce informazioni sugli eventi in un determinato registro eventi. Se si List
specifica il parametro , il cmdlet restituisce informazioni sui file di log stessi (non sulle informazioni sugli eventi che contengono). In questo caso, i List
parametri LogName
e identificano due set di parametri separati.
Due aspetti importanti da ricordare sui set di parametri sono che il runtime di Windows PowerShell usa un solo set di parametri per un determinato input e che ogni set di parametri deve avere almeno un parametro univoco per tale set di parametri.
Per illustrare l'ultimo punto, Stop-Proc cmdlet usa tre set di parametri: ProcessName
ProcessId
, e InputObject
. Ognuno di questi set di parametri ha un parametro che non si trova negli altri set di parametri. I set di parametri possono condividere altri parametri, ma il cmdlet usa i parametri univoci , e per identificare il set di parametri che il ProcessName
ProcessId
runtime Windows PowerShell deve InputObject
usare.
Dichiarazione della classe Cmdlet
Il primo passaggio nella creazione dei cmdlet consiste sempre nel denominare il cmdlet e dichiarare la classe .NET che implementa il cmdlet. Per questo cmdlet viene usato il verbo del ciclo di vita "Stop" perché il cmdlet arresta i processi di sistema. Il nome "Proc" viene usato perché il cmdlet funziona sui processi. Nella dichiarazione seguente si noti che il verbo del cmdlet e il nome del sostantivo si riflettono nel nome della classe del cmdlet.
Nota
Per altre informazioni sui nomi dei verbi dei cmdlet approvati, vedere Nomi dei verbi dei cmdlet.
Il codice seguente è la definizione della classe per questo cmdlet Stop-Proc.
[Cmdlet(VerbsLifecycle.Stop, "Proc",
DefaultParameterSetName = "ProcessId",
SupportsShouldProcess = true)]
public class StopProcCommand : PSCmdlet
<Cmdlet(VerbsLifecycle.Stop, "Proc", DefaultParameterSetName:="ProcessId", _
SupportsShouldProcess:=True)> _
Public Class StopProcCommand
Inherits PSCmdlet
Dichiarazione dei parametri del cmdlet
Questo cmdlet definisce tre parametri necessari come input per il cmdlet (questi parametri definiscono anche i set di parametri), nonché un parametro che gestisce le operazioni del cmdlet e un parametro che determina se il cmdlet invia un oggetto di output tramite la Force
PassThru
pipeline. Per impostazione predefinita, questo cmdlet non passa un oggetto attraverso la pipeline. Per altre informazioni su questi ultimi due parametri, vedere Creazione di un cmdlet che modifica il sistema.
Dichiarazione del parametro Name
Questo parametro di input consente all'utente di specificare i nomi dei processi da arrestato. Si noti che ParameterSetName
la parola chiave attribute dell'attributo System.Management.Automation.Parameterattribute specifica il ProcessName
set di parametri per questo parametro.
[Parameter(
Position = 0,
ParameterSetName = "ProcessName",
Mandatory = true,
ValueFromPipeline = true,
ValueFromPipelineByPropertyName = true,
HelpMessage = "The name of one or more processes to stop. Wildcards are permitted."
)]
[Alias("ProcessName")]
public string[] Name
{
get { return processNames; }
set { processNames = value; }
}
private string[] processNames;
<Parameter(Position:=0, ParameterSetName:="ProcessName", _
Mandatory:=True, _
ValueFromPipeline:=True, ValueFromPipelineByPropertyName:=True, _
HelpMessage:="The name of one or more processes to stop. " & _
"Wildcards are permitted."), [Alias]("ProcessName")> _
Public Property Name() As String()
Get
Return processNames
End Get
Set(ByVal value As String())
processNames = value
End Set
End Property
Private processNames() As String
Si noti anche che l'alias "ProcessName" viene assegnato a questo parametro.
Dichiarazione del parametro Id
Questo parametro di input consente all'utente di specificare gli identificatori dei processi da arrestato. Si noti che la ParameterSetName
parola chiave attribute dell'attributo System.Management.Automation.Parameterattribute specifica il ProcessId
set di parametri.
[Parameter(
ParameterSetName = "ProcessId",
Mandatory = true,
ValueFromPipelineByPropertyName = true,
ValueFromPipeline = true
)]
[Alias("ProcessId")]
public int[] Id
{
get { return processIds; }
set { processIds = value; }
}
private int[] processIds;
<Parameter(ParameterSetName:="ProcessId", _
Mandatory:=True, _
ValueFromPipelineByPropertyName:=True, _
ValueFromPipeline:=True), [Alias]("ProcessId")> _
Public Property Id() As Integer()
Get
Return processIds
End Get
Set(ByVal value As Integer())
processIds = value
End Set
End Property
Private processIds() As Integer
Si noti anche che l'alias "ProcessId" viene assegnato a questo parametro.
Dichiarazione del parametro InputObject
Questo parametro di input consente all'utente di specificare un oggetto di input che contiene informazioni sui processi da arrestato. Si noti che ParameterSetName
la parola chiave attribute dell'attributo System.Management.Automation.Parameterattribute specifica il InputObject
set di parametri per questo parametro.
[Parameter(
ParameterSetName = "InputObject",
Mandatory = true,
ValueFromPipeline = true)]
public Process[] InputObject
{
get { return inputObject; }
set { inputObject = value; }
}
private Process[] inputObject;
<Parameter(ParameterSetName:="InputObject", _
Mandatory:=True, ValueFromPipeline:=True)> _
Public Property InputObject() As Process()
Get
Return myInputObject
End Get
Set(ByVal value As Process())
myInputObject = value
End Set
End Property
Private myInputObject() As Process
Si noti anche che questo parametro non ha alias.
Dichiarazione di parametri in più set di parametri
Anche se deve essere presente un parametro univoco per ogni set di parametri, i parametri possono appartenere a più set di parametri. In questi casi, assegnare al parametro condiviso una dichiarazione di attributo System.Management.Automation.Parameterattribute per ogni set a cui appartiene il parametro. Se un parametro si trova in tutti i set di parametri, è necessario dichiarare l'attributo del parametro una sola volta e non è necessario specificare il nome del set di parametri.
Override di un metodo di elaborazione di input
Ogni cmdlet deve eseguire l'override di un metodo di elaborazione dell'input. Nella maggior parte dei casi si tratta del metodo System.Management.Automation.Cmdlet.ProcessRecord. In questo cmdlet viene eseguito l'override del metodo System.Management.Automation.Cmdlet.ProcessRecord in modo che il cmdlet possa elaborare un numero qualsiasi di processi. Contiene un'istruzione Select che chiama un metodo diverso in base al set di parametri specificato dall'utente.
protected override void ProcessRecord()
{
switch (ParameterSetName)
{
case "ProcessName":
ProcessByName();
break;
case "ProcessId":
ProcessById();
break;
case "InputObject":
foreach (Process process in inputObject)
{
SafeStopProcess(process);
}
break;
default:
throw new ArgumentException("Bad ParameterSet Name");
} // switch (ParameterSetName...
} // ProcessRecord
Protected Overrides Sub ProcessRecord()
Select Case ParameterSetName
Case "ProcessName"
ProcessByName()
Case "ProcessId"
ProcessById()
Case "InputObject"
Dim process As Process
For Each process In myInputObject
SafeStopProcess(process)
Next process
Case Else
Throw New ArgumentException("Bad ParameterSet Name")
End Select
End Sub 'ProcessRecord ' ProcessRecord
I metodi helper chiamati dall'istruzione Select non sono descritti qui, ma è possibile visualizzarne l'implementazione nell'esempio di codice completo nella sezione successiva.
Codice di esempio
Per il codice di esempio C# completo, vedere StopProcessSample04 Sample.
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 Windows PowerShell snap-in. 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, testarlo eseguendolo nella riga di comando. Di seguito sono riportati alcuni test che illustrano come usare i ProcessId
InputObject
parametri e per testare i relativi set di parametri per arrestare un processo.
Dopo Windows PowerShell, eseguire il cmdlet Stop-Proc con il parametro impostato per
ProcessId
arrestare un processo in base al relativo identificatore. In questo caso, il cmdlet usa ilProcessId
set di parametri per arrestare il processo.PS> stop-proc -Id 444 Confirm Are you sure you want to perform this action? Performing operation "stop-proc" on Target "notepad (444)". [Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"): Y
Dopo Windows PowerShell, eseguire il cmdlet Stop-Proc con il parametro impostato per arrestare i processi nell Blocco note o
InputObject
object recuperato dalGet-Process
comando.PS> get-process notepad | stop-proc Confirm Are you sure you want to perform this action? Performing operation "stop-proc" on Target "notepad (444)". [Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"): N
Vedere anche
Creazione di un cmdlet che modifica il sistema
Come creare un cmdlet Windows PowerShell
Estensione dei tipi di oggetto e formattazione