11Sep

Geek School: Práca s kolekciami v PowerShell

Keďže PowerShell je založený na. Net Framework a obsahuje rôzne iné technológie ako WMI a CIM, vždy existuje viac ako jeden spôsob, ako dosiahnuť to isté.Pridajte sa k nám na tento krátky príspevok, kde sa naučíme vybrať najlepšiu metódu na splnenie našich úloh.

Uistite sa, že ste si prečítali predchádzajúce články v sérii:

  • Naučte sa automatizovať systém Windows s PowerShell
  • Naučiť sa používať cmdlety v PowerShell
  • Učenie ako používať objekty v PowerShell
  • Formovanie, filtrovanie a porovnávanie učení v PowerShell
  • Naučte sa používať Remoting inPowerShell
  • Použitie programu PowerShell na získanie informácií o počítači

A zostávajte celú týždeň na zvyšok série.

Použitie šarže

Predtým, ako sme v sérii, keď sme vás uviedli do potrubia, ukázali sme vám, ako môžete vziať objekty, ktoré majú jeden výstup cmdlet a odovzdať ich ako vstup do iného cmdlet pomocou niečoho takto:

Get-Process -Meno poznámkaStop-Process

Tým by sa zablokoval každý proces s názvom "notepad".Ale pravdepodobne sa zaujímate o to, ako je PowerShell schopný zabiť každú inštanciu poznámkového bloku jediným príkazom. Odpoveď spočíva v pomoci stop-process cmdlet.

help Stop-Process-Full

Ak sa pozriete na posledný riadok kódu v sekcii syntaxe, môžete vidieť, že parameter InputObject akceptuje objekt typu Process [] a vždy, keď uvidíte typ nasledovaný dvoma hranatými zátvorkamiže to znamená, že parameter akceptuje jeden alebo viac predchádzajúceho typu. V tomto prípade prijíma jeden alebo viac objektov procesu. Technicky by sme povedali, že cmodlet InputObject akceptuje proces pole .Kedykoľvek máte cmdlet, ktorý týmto spôsobom podporuje dávkové operácie, použite ho. Toto je voľba číslo jedna.

Použitie WMI

Hoci WMI nie je najlepšou technológiou na prenášanie z HQ spoločnosti Microsoft, prišiel na druhú stranu na zozname, ako pracovať so zbierkami predmetov. Mohli by sme ľahko získať zoznam bežiacich procesov z triedy Win32_Process takto:

Get-WmiObject -lass Win32_Process

Keďže dotaz WMI vráti vlastný typ objektu, budete musieť hľadať spôsob, ktorý môže zastaviť proces, takžeumožňuje potrubie, aby získal-člen.

Get-WmiObject - trieda Win32_Process |Get-Member

Vyzerá to, že najbližšia vec, ktorú treba zastaviť, je metóda ukončenia, takže musí byť tá, ktorá je ukončená.Ak chcete zavolať metódu na objekte WMI, jednoducho ju nasmerujte na Invoke-WmiMethod a zadajte názov metódy.

Get-WmiObject - trieda Win32_Process -Filter "name = 'notepad.exe'" |Invoke-WmiMethod -Name Terminate

Skvelý, to urobil trik. Kedykoľvek dostanete ReturnValue 0 v službe WMI, nezabudnite, že príkaz bol vykonaný úspešne.

Vymenovanie

Pokiaľ nedosiahnete ostatné dve metódy, ak musíte urobiť niečo pre veľa objektov, môžete vymenovať celý objekt a konať na každom jednotlivom objekte. Najprv musíte nájsť metódu, ktorú by ste použili na zastavenie jedného procesu.

Get-ProcessGet-Member -MemberType Metóda

Dokonalé, vyzerá to, že môžeme použiť metódu Kill a potom potrubie do objektu ForEach, aby sme ich všetko zabili.

Get-Process -Name notepadForEach-Object-Process( $ _.Kill()}

Tu sme vzali všetky procesné objekty, ktoré Get-Process vrátil a odovzdal ich do rutiny ForEach-Object. Rovnako ako cmdlet Kde-Objekt sme predstavovali každý objekt v potrubí s $ _, ktorý sme mohli zavolať na metódu Kill() .So všetko, čo bolo uvedené a urobené, vyčíslenie kolekcie je oveľa pomalšie ako vyššie uvedené metódy a malo by byť použité len ako posledný výsledok.

Zhrnutie

Voľba Jeden

Get-Process -Name notepadZastavenie procesu

Voľba dvoch

Get-WmiObject - trieda Win32_Process -Filter "name = 'notepad.exe" "|Invoke-WmiMethod -Name Terminovať

Voľba Tri

Get-Process -Name notepad |ForEach-Object -Process{ $ _. Kill()}

To je všetko pre túto chvíľu ľudia, uvidíme vás budúci týždeň pre viac zábavy PowerShell.