Sdílet prostřednictvím


Vytvoření rutiny bez parametrů

Tato část popisuje, jak vytvořit rutinu, která načítá informace z místního počítače bez použití parametrů, a pak zapíše informace do kanálu. Zde popsaná rutina je rutina 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:

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

Pojmenování rutiny

Název rutiny se skládá z příkazu, který označuje akci, kterou rutina provede, a podstatné jméno označující položky, na které rutina působí. Vzhledem k tomu, že tato ukázková Get-Proc rutina načítá objekty procesu, používá příkaz "Get", definovaný System.Management.Automation.VerbsCommon výčtu a podstatné jméno "Proc" 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 jednodávné jméno s předponou zkrácené verze názvu produktu. Příklad názvu rutiny tohoto typu je "Get-SQLServer".

Výběr příkazu

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

Definování třídy rutiny

Jakmile zvolíte název rutiny, definujte třídu .NET pro implementaci rutiny. Tady je definice třídy pro tuto ukázkovou Get-Proc rutinu:

[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 atribut System.Management.Automation.CmdletAttribute s syntaxí [Cmdlet(verb, noun, ...)]slouží k identifikaci této třídy jako rutiny. Toto je jediný povinný atribut pro všechny rutiny a umožňuje, aby modul runtime Windows PowerShellu volal správně. V případě potřeby můžete nastavit klíčová slova atributů pro další deklaraci třídy. Mějte na paměti, že deklarace atributu pro naši ukázkovou GetProcCommand třída deklaruje pouze názvy podstatných jmen a sloves pro rutinu Get-Proc.

Poznámka:

Pro všechny třídy atributů Windows PowerShellu můžou klíčová slova, která můžete nastavit, odpovídají vlastnostem třídy atributu.

Při pojmenování třídy rutiny je vhodné odrážet název rutiny v názvu třídy. Uděláte to tak, že použijete tvar SlovesnýnCommand a nahradíte sloveso a podstatné jméno sloveso a podstatné jméno použité v názvu rutiny. Jak je znázorněno v předchozí definici třídy, ukázková Get-Proc rutina definuje třídu s názvem GetProcCommand, která je odvozena od System.Management.Automation.Cmdlet základní třídy.

Důležité

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

Poznámka:

Třída rutiny 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 nebudou nalezeny modulem runtime Prostředí Windows PowerShell.

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

Přepsání metody zpracování vstupu

Třída System.Management.Automation.Cmdlet poskytuje tři hlavní metody zpracování vstupu, z nichž nejméně jedna musí přepsat vaši rutinu. Další informace o tom, jak Windows PowerShell zpracovává záznamy, naleznete v tématu Jak windows PowerShell funguje.

Pro všechny typy vstupu volá modul runtime Prostředí Windows PowerShell System.Management.Automation.Cmdlet.BeginProcessing pro povolení zpracování. Pokud vaše rutina musí provést některé předběžné zpracování nebo nastavení, může to udělat 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 zavolání rutiny.

Pokud vaše rutina přijímá vstup kanálu, musí přepsat System.Management.Automation.Rutin.ProcessRecord metoda a volitelně System.Management.Automation.Cmdlet.EndProcessing metoda. Rutina může například přepsat obě metody, pokud shromáždí všechny vstupy pomocí System.Management.Automation.ProcessRecord a pak pracuje se vstupem jako celek, nikoli s jedním prvkem najednou, jak to dělá rutina Sort-Object.

Pokud vaše rutina nepřebere vstup 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 současně pracovat s jedním prvkem, stejně jako u rutiny řazení.

Vzhledem k tomu, že tato ukázková rutina Get-Proc musí přijímat vstup kanálu, přepisuje metodu System.Management.Automation.ProcessRecord a používá výchozí implementace pro System.Management.Automation.Cmdlet.BeginProcessing a System.Management.Automation.Cmdlet.EndProcessing. System.Management.Automation.Cmdlet.ProcessRecord přepsání 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 potřeba pamatovat na zpracování vstupu

Důležité

Rutiny by nikdy neměly volat System.Console.Writeline* nebo 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čovací chybě v jakékoli části rutiny. Rutina, která vyžaduje vyčištění objektu, by proto měla implementovat úplný vzor System.IDisposable, včetně finalizátoru, aby modul runtime mohl volat System.Management.Automation.Cmdlet.EndProcessing a System.IDisposable.Dispose* na konci zpracování.

Ukázka kódu

Úplný vzorový kód jazyka C# najdete v tématu GetProcessSample01 Sample.

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

Windows PowerShell předává informace mezi rutinami pomocí objektů .NET. Proto může být potřeba, aby rutina definovala vlastní typ, nebo může být potřeba rozšířit existující typ poskytovaný jinou rutinou. Další informace o definování nových typů nebo rozšíření existujících typů naleznete v tématu Rozšíření typů objektů a formátování.

Sestavení rutiny

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

Testování rutiny

Když je vaše rutina zaregistrovaná ve Windows PowerShellu, 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 stále používá modul runtime Prostředí Windows PowerShell a existující objekt .NET, který stačí k tomu, aby byl užitečný. Pojďme to otestovat, abychom lépe pochopili, co Get-Proc může dělat a jak se dá použít jeho výstup. Další informace o používání rutin z příkazového řádku najdete v tématu Začínáme s prostředím 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. Přiřaďte proměnné výsledkům rutiny pro snadnější manipulaci.

    $p=Get-Proc
    
  3. Získejte počet procesů.

    $p.Length
    

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

    63
    
  4. Načtěte konkrétní proces.

    $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 počáteční čas 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. Pomocí rutiny Get-Member zobrazíte seznam vlastností dostupných pro jednotlivé procesy.

    $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í vstupních příkazového řádku

Vytvoření rutiny pro zpracování vstupních kanálu

Vytvoření rutin prostředí Windows PowerShell

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

jak funguje windows PowerShell

registrace rutin, poskytovatelů a hostitelských aplikací

referenční prostředí Windows PowerShell

ukázky rutin