Vytvoření rutiny bez parametrů

Tato část popisuje, jak vytvořit rutinu, která načte informace z místního počítače bez použití parametrů a pak tyto informace zapíše do kanálu. Zde popsaná rutina je Get-Proc, která načte informace o procesech místního počítače a pak tyto informace zobrazí na příkazovém řádku.

Poznámka

Při psaní rutin se referenční sestavení Windows PowerShell® stáhnou na disk (ve výchozím nastavení je to C:\Program Files\Reference Assemblies\Microsoft\WindowsPowerShell\v1.0). Nejsou nainstalovány v globální mezipaměti sestavení (GAC).

Pojmenování rutiny

Název rutiny se skládá z operace, která označuje akci, kterou rutina přijímá, a podstatného jména, které označuje položky, se kterými rutina pracuje. Vzhledem k tomu, že tato ukázková rutina Get-Proc načte objekty procesu, používá příkaz Get definovaný výčtem System.Management.Automation.Verbscommon a podstatné jméno "Proc", které označuje, že rutina pracuje s položkami procesu.

Při pojmenování rutin nepoužívejte žádný z následujících znaků: # , () {} [] & - /\ $ ; : " '<> | ? @ ` .

Volba podstatného jména

Měli byste zvolit podstatné jméno, které je specifické. Nejlepší je použít singelární podstatné jméno s předponou zkrácené verze názvu produktu. Příklad názvu rutiny tohoto typu je Get-SQLServer .

Volba slovesa

Měli byste použít příkaz ze sady schválených názvů rutin. Další informace o schválených příkazech rutin najdete v tématu Názvy rutin.

Definování třídy rutiny

Po zvolení názvu rutiny definujte třídu .NET pro implementaci rutiny. Tady je definice třídy pro tuto ukázkovou rutinu Get-Proc:

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

Všimněte si, že před definicí třídy se k identifikaci této třídy jako rutiny používá atribut System.Management.Automation.CmdletAttribute se [Cmdlet(verb, noun, ...)] syntaxí . Toto je jediný povinný atribut pro všechny rutiny a umožňuje modulu runtime Windows PowerShell je správně volat. Pokud je to potřeba, můžete nastavit klíčová slova atributu pro další deklaraci třídy. Uvědomte si, že deklarace atributu pro naši ukázkovou třídu GetProcCommand deklaruje pouze názvy podstatného jména a slovesa Get-Proc rutinu.

Poznámka

U všech Windows PowerShell atributů klíčová slova, která můžete nastavit, odpovídají vlastnostem třídy atributu.

Při pojmenování třídy rutiny je vhodné v názvu třídy odrážet název rutiny. Použijte k tomu tvar "VerbNounCommand" a nahraďte "Sloveso" a "Podstatné jméno" slovesem a podstatné jméno použitým v názvu rutiny. Jak je znázorněno v předchozí definici třídy, ukázková rutina Get-Proc definuje třídu s názvem GetProcCommand, která je odvozená ze základní třídy System.Management.Automation.Cmdlet.

Důležité

Pokud chcete definovat rutinu, která přistupuje přímo k modulu runtime Windows PowerShell, vaše třída .NET by měla být odvozena ze základní třídy System.Management.Automation.PSCmdlet. Další informace o této třídě najdete v tématu Vytvoření rutiny, která definuje sady parametrů.

Poznámka

Třída pro rutinu musí být explicitně označena jako veřejná. Třídy, které nejsou označené jako veřejné, budou ve výchozím nastavení interní a nebude nalezeny Windows PowerShell runtime.

Windows PowerShell třídy rutin používá obor názvů Microsoft.PowerShell.Commands. Doporučujeme umístit třídy rutin do oboru názvů Commands vašeho oboru názvů rozhraní API, například xxx.PS.Commands.

Přepsání metody vstupního zpracování

Třída System.Management.Automation.Cmdlet poskytuje tři hlavní metody zpracování vstupu, z nichž alespoň jedna musí přepsat vaši rutinu. Další informace o tom, jak Windows PowerShell záznamy, najdete v tématu How Windows PowerShell Works.

Pro všechny typy vstupů volá modul runtime Windows PowerShell System.Management.Automation.Cmdlet.BeginProcessing, aby umožnil zpracování. Pokud vaše rutina musí provést určité předběžné zpracování nebo nastavení, může to provést přepsáním této metody.

Poznámka

Windows PowerShell používá termín "záznam" k popisu sady hodnot parametrů zadaných při volání rutiny.

Pokud vaše rutina přijímá vstup kanálu, musí přepsat metodu System.Management.Automation.Cmdlet.ProcessRecord a volitelně metodu System.Management.Automation.Cmdlet.EndProcessing. Rutina může například přepsat obě metody, pokud shromáždí všechny vstupy pomocí System.Management.Automation.Cmdlet.ProcessRecord, a pak funguje na vstupu jako celek, nikoli po jednom prvku, jak to dělá Sort-Object rutina.

Pokud vaše rutina nepřistupuje ke vstupu kanálu, měla by přepsat metodu System.Management.Automation.Cmdlet.EndProcessing. Uvědomte si, že tato metoda se často používá místo System.Management.Automation.Cmdlet.BeginProcessing, když rutina nemůže pracovat současně s jedním prvkem, jako je tomu u rutiny řazení.

Vzhledem k tomu, že tato ukázková rutina Get-Proc musí přijímat vstup kanálu, přepíše metodu System.Management.Automation.Cmdlet.ProcessRecord a používá výchozí implementace pro System.Management.Automation.Cmdlet.BeginProcessing a System.Management.Automation.Cmdlet.EndProcessing. Přepsání System.Management.Automation.Cmdlet.ProcessRecord načte procesy a zapíše je do příkazového řádku pomocí metody System.Management.Automation.Cmdlet.WriteObject.

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

Co je třeba si zapamatovat o zpracování vstupu

Důležité

Rutiny by nikdy neměly volat System.Console.Writeline* ani jeho ekvivalent.

Například System.Management.Automation.Cmdlet.EndProcessing nemusí být volána, pokud je rutina zrušena uprostřed nebo pokud dojde k ukončující chybě v jakékoli části rutiny. Proto by rutina, která vyžaduje vyčištění objektu, měla implementovat kompletní vzor System.IDisposable, včetně finalizační metody, aby modul runtime mohl na konci zpracování volat System.Management.Automation.Cmdlet.EndProcessing a System.IDisposable.Dispose*.

Vzorek kódu

Kompletní vzorový kód jazyka C# najdete v části Ukázka GetProcessSample01.

Definování typů objektů a formátování

Windows PowerShell předá informace mezi rutinami pomocí objektů .NET. V důsledku toho může rutina potřebovat definovat vlastní typ nebo může potřebovat rozšířit existující typ poskytovaný jinou rutinou. Další informace o definování nových typů nebo rozšíření existujících typů najdete v tématu Rozšíření typů objektůa formátování .

Sestavení rutiny

Po implementaci rutiny ji musíte zaregistrovat ve Windows PowerShell prostřednictvím Windows PowerShell modulu snap-in. Další informace o registraci rutin najdete v tématu Postup registrace rutin, zprostředkovatelů a hostitelských aplikací.

Testování rutiny

Když je vaše rutina zaregistrovaná v Windows PowerShell, můžete ji otestovat spuštěním na příkazovém řádku. Kód pro naši ukázkovou rutinu Get-Proc je malý, ale přesto používá modul runtime Windows PowerShell a existující objekt .NET, což je dostačující k tomu, aby byl užitečný. Pojďme ho otestovat, abychom lépe pochopili, co Get-Proc a jak lze jeho výstup použít. Další informace o používání rutin z příkazového řádku najdete v tématu Začínáme s Windows PowerShell.

  1. Spusťte Windows PowerShell a získejte aktuální procesy spuštěné v počítači.

    get-proc
    

    Zobrazí se následující výstup.

    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. Pro snadnější manipulaci přiřaďte k výsledkům rutin proměnnou.

    $p=get-proc
    
  3. Získejte počet procesů.

    $p.length
    

    Zobrazí se následující výstup.

    63
    
  4. Načtení konkrétního procesu

    $p[6]
    

    Zobrazí se následující výstup.

    Handles  NPM(K)  PM(K)  WS(K)  VS(M)  CPU(s)  Id    ProcessName
    -------  ------  -----  -----  -----  ------  --    -----------
    1033     3       2400   3336   35     0.53    1588  rundll32
    
  5. Získejte čas zahájení tohoto procesu.

    $p[6].starttime
    

    Zobrazí se následující výstup.

    Tuesday, July 26, 2005 9:34:15 AM
    
    $p[6].starttime.dayofyear
    
    207
    
  6. Získejte procesy, pro které je počet popisovačů větší než 500, a seřažte výsledek.

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

    Zobrazí se následující výstup.

    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. K zobrazení Get-Member seznamu vlastností dostupných pro jednotlivé procesy použijte rutinu .

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

    Zobrazí se následující výstup.

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

Viz také

Vytvoření rutiny pro zpracování vstupu příkazového řádku

Vytvoření rutiny pro zpracování vstupu kanálu

Vytvoření rutiny Windows PowerShell

Rozšíření typů objektů a formátování

Jak Windows PowerShell funguje

Registrace rutin, poskytovatelů a hostitelských aplikací

Referenční informace k Windows PowerShellu

Ukázky rutin