Paraméterkészletek hozzáadása parancsmagokhoz

A paraméterkészletekkel kapcsolatos fontos tudnimek

Windows PowerShell egy paraméterkészletet határoz meg együtt működő paraméterek csoportjaként. Egy parancsmag paramétereinek csoportosítása lehetővé teszi, hogy egyetlen parancsmagot hozzon létre, amely a felhasználó által megadott paramétercsoport alapján módosíthatja annak működését.

Egy olyan parancsmag például, amely két paraméterkészletet használ a különböző funkciók meghatározásához, a parancsmag, amelyet a Get-EventLog Windows PowerShell. Ez a parancsmag különböző információkat ad vissza, amikor a felhasználó megadja a List vagy a LogName paramétert. Ha a paraméter meg van adva, a parancsmag információt ad vissza egy adott LogName eseménynapló eseményeiről. Ha a paraméter meg van adva, a parancsmag magukról a naplófájlokkal kapcsolatos adatokat ad vissza (nem pedig az List eseményadatokat, amelyek tartalmazzák őket). Ebben az esetben a List és a paraméter két különálló LogName paraméterkészletet azonosít.

A paraméterkészletekkel kapcsolatos két fontos dolog, hogy a Windows PowerShell-runtime csak egy paraméterkészletet használ egy adott bemenethez, és hogy minden paraméterkészletnek legalább egy, az adott paraméterkészlethez egyedi paraméterrel kell lennie.

Az utolsó pont szemléltetésére ez Stop-Proc parancsmag három paraméterkészletet használ: ProcessName , ProcessId és InputObject . Ezen paraméterkészletek mindegyikének van egy paraméterkészlete, amely nem a többi paraméterkészletben van. A paraméterkészletek más paramétereket is használhatnak, de a parancsmag az egyedi , és paramétereket használja annak azonosítására, hogy a Windows PowerShell futtatás melyik ProcessName ProcessId InputObject paraméterkészletet használja.

A parancsmagosztály deklarálása

A parancsmag létrehozásának első lépése mindig a parancsmag elnevezése és a parancsmagot megvalósító .NET-osztály deklarációja. Ehhez a parancsmaghoz a "Stop" életciklus-parancs használatos, mert a parancsmag leállítja a rendszerfolyamatokat. A "Proc" főnév azért használatos, mert a parancsmag folyamatokon működik. Az alábbi deklarációban figyelje meg, hogy a parancsmag ige és főnév is megjelenik a parancsmag osztályának nevében.

Megjegyzés

A jóváhagyott parancsmagnevekkel kapcsolatos további információkért lásd: Parancsmag-parancsmagok nevei.

A következő kód a parancsmag osztálydefiníciójaStop-Proc parancsmaghoz.

[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

A parancsmag paramétereinek deklarálta

Ez a parancsmag három paramétert határoz meg, amelyek a parancsmag bemeneteként szükségesek (ezek a paraméterek a paraméterkészleteket is meghatározzák), valamint egy paramétert, amely a parancsmag parancsmagját kezeli, valamint egy paramétert, amely meghatározza, hogy a parancsmag kimeneti objektumot küld-e a Force PassThru folyamaton keresztül. Alapértelmezés szerint ez a parancsmag nem ad át objektumot a folyamaton keresztül. További információ az utolsó két paraméterről: Creating a Cmdlet that Modififies the System.

A Name paraméter deklarása

Ez a bemeneti paraméter lehetővé teszi, hogy a felhasználó megadja a leállítani kívánt folyamatok nevét. Vegye figyelembe, hogy a ParameterSetName System.Management.Automation.Parameterattribute attribútumszava határozza meg a ProcessName paraméterkészletet ehhez a paraméterhez.

[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

Azt is figyelje meg, hogy a "ProcessName" alias van megadva ehhez a paraméterhez.

Az Azonosító paraméter deklarása

Ez a bemeneti paraméter lehetővé teszi, hogy a felhasználó megadja a leállítani kívánt folyamatok azonosítóit. Vegye figyelembe, ParameterSetName hogy a System.Management.Automation.Parameterattribute attribútum kulcsszó határozza meg a ProcessId paraméterkészletet.

[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

Vegye figyelembe azt is, hogy a "ProcessId" alias van megadva ehhez a paraméterhez.

Az InputObject paraméter deklarása

Ez a bemeneti paraméter lehetővé teszi, hogy a felhasználó megad egy bemeneti objektumot, amely információkat tartalmaz a leállítani kívánt folyamatokról. Vegye figyelembe, hogy a ParameterSetName System.Management.Automation.Parameterattribute attribútumszava határozza meg a InputObject paraméterkészletet ehhez a paraméterhez.

[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

Vegye figyelembe azt is, hogy ennek a paraméternek nincs aliasa.

Paraméterek deklarása több paraméterkészletben

Bár minden paraméterkészlethez egyedi paraméternek kell tartozni, a paraméterek több paraméterkészlethez is tartoznak. Ezekben az esetekben adjon egy System.Management.Automation.Parameterattribute attribútumdeklarációt a megosztott paraméternek minden olyan készlethez, amelyhez a paraméter tartozik. Ha egy paraméter az összes paraméterkészletben van, csak egyszer kell deklarálni a paraméterattribútumot, és nem kell megadnia a paraméterkészlet nevét.

Bemeneti feldolgozási metódus felülbírálása

Minden parancsmagnak felül kell bírálni egy bemeneti feldolgozási módszert. Ez leggyakrabban a System.Management.Automation.Cmdlet.ProcessRecord metódus. Ebben a parancsmagban a System.Management.Automation.Cmdlet.ProcessRecord metódus felül van bírálva, hogy a parancsmag bármilyen számú folyamatot feldolgozhat. Tartalmaz egy Select utasítást, amely egy másik metódust hív meg a felhasználó által megadott paraméterkészlet alapján.

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

A Select utasítás által hívott segítő metódusokat itt nem ismertetjük, de azok implementációja a következő szakaszban a teljes kódmintában látható.

Kódminta

A teljes C#-mintakódért tekintse meg a StopProcessSample04 mintát.

Objektumtípusok definiálása és formázása

Windows PowerShell .NET-objektumok használatával továbbítja az információkat a parancsmagok között. Emiatt előfordulhat, hogy egy parancsmagnak meg kell határoznia a saját típusát, vagy a parancsmagnak ki kell terjesztenie egy másik parancsmag által biztosított meglévő típust. További információ az új típusok meghatározásáról vagy a meglévő típusok kiterjesztéséről: Extending Object Types and Formatting (Az objektumtípusok kiterjesztése és formázása).

A parancsmag kiépítése

A parancsmagok megvalósítása után regisztrálnia kell azt a Windows PowerShell egy Windows PowerShell beépülő modulon keresztül. További információ a parancsmagok regisztrálásról: Parancsmagok, szolgáltatók és gazdaalkalmazások regisztrálása.

A parancsmag tesztelése

Miután regisztrálta a parancsmagot a Windows PowerShell, tesztelje a parancssorban való futtatásával. Íme néhány teszt, amelyek azt mutatják be, hogyan használhatók a és a paraméterekkel a paraméterkészletek egy folyamat ProcessId InputObject leállításához.

  • A Windows PowerShell futtassa a Stop-Proc parancsmagot a paraméterkészlet használatával, hogy leállítsa a folyamatot ProcessId az azonosítója alapján. Ebben az esetben a parancsmag a paraméterkészletet használja a ProcessId folyamat leállításához.

    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
    
  • A Windows PowerShell után futtassa a Stop-Proc parancsmagot a paraméterkészlet használatával, hogy leállítsa a Jegyzettömb által lekért objektum InputObject Get-Process folyamatait.

    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
    

Lásd még:

Rendszermódosító parancsmag létrehozása

Új parancsmag Windows PowerShell létrehozása

Objektumtípusok kiterjesztése és formázása

Parancsmagok, szolgáltatók és gazdaalkalmazások regisztrálása

Windows PowerShell SDK