Paraméterek nélküli parancsmag létrehozása

Ez a szakasz azt ismerteti, hogyan hozhat létre olyan parancsmagot, amely paraméterek használata nélkül olvassa be az információkat a helyi számítógépről, majd az adatokat a folyamatba írja. Az itt leírt parancsmag egy Get-Proc parancsmag, amely a helyi számítógép folyamatainak adatait olvassa be, majd megjeleníti azokat a parancssorban.

Megjegyzés

Ne feledje, hogy parancsmagok írásakor a Windows PowerShell®-referencia szerelvények letöltve lesznek a lemezre (alapértelmezés szerint a következő: C:\Program Files\Reference Assemblies\Microsoft\WindowsPowerShell\v1.0). A globális szerelvény-gyorsítótárban (GAC) nincsenek telepítve.

A parancsmag elnevezése

A parancsmag neve egy olyan parancsból áll, amely a parancsmag által lekért műveletet és főnevet tartalmazza, amely azokat az elemeket jelöli, amelyeken a parancsmag műveletet mutat. Mivel ez a Get-Proc-parancsmag folyamatobjektumokat ad vissza, a System.Management.Automation.Verbscommon enumerálás által meghatározott "Get" igét használja, a "Proc" főnév pedig azt jelzi, hogy a parancsmag működik a folyamatelemeken.

A parancsmagok elnevezésekor ne használja a következő karakterek egyikét: # , () {} [] & - /\ $ ; : " <> | ? @ ` .

Főnév kiválasztása

Válasszon egy konkrét főnévt. A legjobb, ha egyetlen főnevet használ, amely a terméknév rövid verzióját használja. Ilyen típusú parancsmagnév például a " Get-SQLServer ".

Művelet kiválasztása

A jóváhagyott parancsmagnevek készletének egyik parancsát kell használnia. A jóváhagyott parancsmag-parancsmagokkal kapcsolatos további információkért lásd: Parancsmag-parancsmagok nevei.

A parancsmagosztály meghatározása

Miután kiválasztotta a parancsmag nevét, határozzon meg egy .NET-osztályt a parancsmag megvalósításához. Itt található a minta-parancsmag osztálydefiníciójaGet-Proc parancsmaghoz:

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

Figyelje meg, hogy az osztálydefiníciót megelőzően a System.Management.Automation.CmdletAttribute attribútum szintaxissal a parancsmagként azonosítja az [Cmdlet(verb, noun, ...)] osztályt. Ez az egyetlen kötelező attribútum az összes parancsmaghoz, és lehetővé teszi a Windows PowerShell futásidejűnek, hogy helyesen hívja meg őket. Beállíthatja az attribútum kulcsszavakat, hogy szükség esetén tovább deklarálják az osztályt. Vegye figyelembe, hogy a minta GetProcCommand osztály attribútumdeklarációja csak a főnév és a parancsmag Get-Proc deklarál.

Megjegyzés

Minden Windows PowerShell attribútumosztályhoz beállítható kulcsszavak megfelelnek az attribútumosztály tulajdonságainak.

A parancsmag osztályának elnevezésekor a parancsmag nevét az osztály neveként kell tükrözni. Ehhez használja a "VerbNounCommand" formát, és cserélje le az "Ige" és a "Főnév" helyére a parancsmag nevében használt igét és főnevet. Ahogy az előző osztálydefinícióban is látható, a Get-Proc parancsmag egy GetProcCommand nevű osztályt határoz meg, amely a System.Management.Automation.Cmdlet alaposztályból származik.

Fontos

Ha olyan parancsmagot szeretne definiálni, amely közvetlenül hozzáfér a Windows PowerShell-runtime-hoz, a .NET-osztálynak a System.Management.Automation.PSCmdlet alaposztályból kell származtatva lennie. További információ erről az osztályról: Creating a Cmdlet that Defines Parameter Sets(Paraméterkészleteket definiáló parancsmag létrehozása).

Megjegyzés

A parancsmag osztályát explicit módon nyilvánosként kell megjelölni. A nem nyilvánosként megjelölt osztályok alapértelmezés szerint belsőek lesznek, és a Windows PowerShell nem találhatók meg.

Windows PowerShell a Microsoft.PowerShell.Commands névteret használja a parancsmagosztályaihoz. Javasoljuk, hogy a parancsmagosztályokat az API-névtér Commands névterében helyezze el, például xxx.PS.Commands.

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

A System.Management.Automation.Cmdlet osztály három fő bemeneti feldolgozási módszert biztosít, amelyek közül legalább az egyiket felül kell bírálni. További információ a rekordok Windows PowerShell a How Windows PowerShell Works Windows PowerShell .

A bemenetek minden típusához a Windows PowerShell a System.Management.Automation.Cmdlet.BeginProcessing parancsmagot hívja meg a feldolgozás engedélyezéséhez. Ha a parancsmagnak előfeldolgozást vagy beállítást kell végrehajtania, ezt a metódus felülbírálásával végezheti el.

Megjegyzés

Windows PowerShell a "record" kifejezést használja a parancsmagok hívatakor megadott paraméterértékek leírására.

Ha a parancsmag elfogadja a folyamat bemenetét, felül kell bírálni a System.Management.Automation.Cmdlet.ProcessRecord metódust és opcionálisan a System.Management.Automation.Cmdlet.EndProcessing metódust. Egy parancsmag például felülbírálhatja mindkét metódust, ha az összes bemenetet a System.Management.Automation.Cmdlet.ProcessRecord használatával gyűjti össze, majd egyszerre egy elem helyett egészként működik a bemeneten, ahogy azt a parancsmag Sort-Object is teszi.

Ha a parancsmag nem veszi fel a folyamat bemenetét, felülbírálja a System.Management.Automation.Cmdlet.EndProcessing metódust. Vegye figyelembe, hogy ezt a metódust gyakran használják a System.Management.Automation.Cmdlet.BeginProcessing parancsmagok helyére, ha a parancsmag nem tud egyszerre egy elemmel működni, ahogyan a rendezési parancsmag esetében is.

Mivel a minta Get-Proc-parancsmagnak folyamatbemenetet kell fogadnia, felülírja a System.Management.Automation.Cmdlet.ProcessRecord metódust, és a System.Management.Automation.Cmdlet.BeginProcessing és System.Management.Automation.Cmdlet.EndProcessingalapértelmezett implementációit használja. A System.Management.Automation.Cmdlet.ProcessRecord felülbírálás lekéri a folyamatokat, és a parancssorba írja azokat a System.Management.Automation.Cmdlet.WriteObject metódussal.

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

A bemeneti feldolgozással kapcsolatos dolog, amit meg kell jegyezni

  • A bemenet alapértelmezett forrása egy explicit objektum (például egy sztring), amelyet a felhasználó a parancssorban biztosít. További információ: Parancsmag létrehozása parancssori bemenet feldolgozásához.

  • A bemeneti feldolgozási metódus a folyamat egy upstream parancsmagja kimeneti objektumának bemenetét is fogadhatja. További információ: Creating a Cmdlet to Process Pipeline Input(Parancsmag létrehozása a folyamat bemenetének feldolgozásához). Vegye figyelembe, hogy a parancsmag parancssori és folyamatforrások kombinációjából is fogadhat bemenetet.

  • Előfordulhat, hogy az lefelé irányuló parancsmag nem tér vissza hosszú időre, vagy egyáltalán nem. Emiatt a parancsmag bemeneti feldolgozási metódusának nem szabad zárolásokat tartania a System.Management.Automation.Cmdlet.WriteObjecthívásai során, különösen olyan zárolások esetén, amelyek hatóköre a parancsmagpéldányon túlra terjed.

Fontos

A parancsmagok soha ne hívják meg a System.Console.Writeline* vagy annak megfelelőit.

Előfordulhat például, hogy a rendszer nem hív meg System.Management.Automation.Cmdlet.EndProcessing parancsmagot, ha a parancsmagot félúton megszakítják, vagy ha a parancsmag bármelyik részében megszakítási hiba történik. Ezért az objektum tisztítását igénylő parancsmagnak implementálja a teljes System.IDisposable mintát, beleértve a véglegesítőt is, hogy a futtatás a feldolgozás végén a System.Management.Automation.Cmdlet.EndProcessing és a System.IDisposable.Dispose* rendszert is meg tudja hívni.

Kódminta

A teljes C#-mintakódért lásd: GetProcessSample01 minta.

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, a parancssorban futtatva tesztelheti. A minta-Get-Proc parancsmag kódja kicsi, de továbbra is az Windows PowerShell-runtime-t és egy meglévő .NET-objektumot használ, ami elég ahhoz, hogy hasznos legyen. Teszteljük, hogy jobban megértsük, mire Get-Proc és hogyan használható a kimenete. A parancsmagok parancssorból való használatával kapcsolatos további információkért lásd: Getting Started with Windows PowerShell.

  1. Indítsa Windows PowerShell, és szerezze be a számítógépen futó aktuális folyamatokat.

    get-proc
    

    Az alábbi kimenet jelenik meg.

    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. A könnyebb kezelés érdekében rendeljen hozzá egy változót a parancsmag eredményeihez.

    $p=get-proc
    
  3. A folyamatok számának lekért száma.

    $p.length
    

    Az alábbi kimenet jelenik meg.

    63
    
  4. Egy adott folyamat lekérése.

    $p[6]
    

    Az alábbi kimenet jelenik meg.

    Handles  NPM(K)  PM(K)  WS(K)  VS(M)  CPU(s)  Id    ProcessName
    -------  ------  -----  -----  -----  ------  --    -----------
    1033     3       2400   3336   35     0.53    1588  rundll32
    
  5. A folyamat kezdési ideje.

    $p[6].starttime
    

    Az alábbi kimenet jelenik meg.

    Tuesday, July 26, 2005 9:34:15 AM
    
    $p[6].starttime.dayofyear
    
    207
    
  6. Le kell kapnia a folyamatokat, amelyeknél a leírók száma nagyobb 500-asnál, és rendezheti az eredményt.

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

    Az alábbi kimenet jelenik meg.

    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. Az Get-Member egyes folyamatokhoz elérhető tulajdonságok listához használja a parancsmagot.

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

    Az alábbi kimenet jelenik meg.

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

Lásd még:

Parancsmag létrehozása parancssori bemenet feldolgozásához

Parancsmag létrehozása a folyamat bemenetének feldolgozásához

Új parancsmag Windows PowerShell létrehozása

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

Az Windows PowerShell működése

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

Windows PowerShell-referencia

Parancsmagminták