11Sep

Geek School: Práce s kolekcemi v PowerShell

click fraud protection

Vzhledem k tomu, že PowerShell je založen na. Net Framework a obsahuje různé další technologie jako WMI a CIM, existuje vždy více než jeden způsob, jak dosáhnout stejné věci. Přijďte se připojit k tomuto krátkému příspěvku, kde se dozvíme, jak si vybrat nejlepší způsob, jak splnit naše úkoly.

Ujistěte se, že jste si přečetli předchozí články v sérii:

  • Naučte se automatizovat systém Windows s PowerShell
  • Naučte se používat cmdlety v PowerShellu
  • Učíme se používat objekty ve formátu PowerShell
  • Formátování učení, filtrování a porovnávání v PowerShell
  • Naučte se používat Remoting inPowerShell
  • Použití funkce PowerShell pro získání informací o počítači

A zůstaňte v klidu po zbytek série celý týden.

Používání dávkových skladeb

Dříve jsme v řadě, když jsme vás představili na potrubí, jsme vám ukázali, jak můžete vzít objekty, které jeden výstupy cmdlet a předat je jako vstup do jiného cmdlet pomocí něčeho takto:

Get-Process -Jméno poznámkového blokuStop-Process

instagram viewer

Tím by byl zabit každý proces s názvem "notepad".Ale asi se zajímáte, jak PowerShell dokáže zabít každou instanci poznámkového bloku jediným příkazem. Odpověď spočívá v nápovědě Stop-Process cmdlet.

help Stop-Process -Full

Pokud se podíváte na poslední řádek kódu v sekci syntaxe, uvidíte, že parametr InputObject přijímá objekt typu Process [] a kdykoli vidíte typ, za nímž následují dvě hranaté závorkyže to znamená, že parametr přijímá jeden nebo více předchozího typu. V tomto případě přijímá jeden nebo více objektů procesu. Technicky bychom říkali, že cmdlet InputObject přijímá proces pole .Kdykoli máte cmdlet, který tímto způsobem podporuje dávkové operace, použijte ho. Toto je volba číslo jedna.

Používání služby WMI

Přestože služba WMI není nejlepší technologií, která by mohla být odeslána z ústředí společnosti Microsoft, přichází na druhé místo v seznamu, jak pracovat s kolekcemi objektů.Mohli bychom snadno získat seznam běžících procesů z třídy Win32_Process takto:

Get-WmiObject - třída Win32_Process

Vzhledem k tomu, že dotaz WMI vrací svůj vlastní typ objektu, budete muset hledat metodu, která může zastavit proces, takžeumožňuje potrubí, aby se dostal-člen.

Get-WmiObject - třída Win32_Process |Get-Member

Vypadá to, že nejbližší věc, kterou chcete zastavit, je metoda ukončení, takže to musí být jedna. Chcete-li volat metodu na objekt WMI, jednoduše ji přetočte na Invoke-WmiMethod a zadejte název metody.

Get-WmiObject - třída Win32_Process -Filter "name = 'notepad.exe'" |Invoke-WmiMethod -Name Terminate

Skvělé, to dělá trik. Kdykoli dostanete ReturnValue 0 v WMI, nezapomeňte, že příkaz byl proveden úspěšně.

Výčet

V případě selhání ostatních dvou metod, pokud musíte udělat něco pro spoustu objektů, můžete vyčíslit celý objekt a jednat na každém jednotlivém objektu. Nejprve musíte najít způsob, který byste použili k zastavení jednoho procesu.

Get-ProcessGet-Member -MemberType Method

Perfektní, zdá se, že můžeme použít metodu Kill a pak potrubí do objektu ForEach, abychom je všechny zabili.

Get-Process -Name poznámkový blok |ForEach-Object -Process{ $ _. Kill()}

Zde jsme vzali všechny procesní objekty, které Get-Process vrátili a předali je do rutiny ForEach-Object. Stejně jako cmdlet Kde-Objekt jsme reprezentovali každý objekt v potrubí s $ _, který jsme mohli zavolat na metodu Kill() .S tím, co bylo řečeno a provedeno, vyčíslení kolekce je mnohem pomalejší než výše uvedené metody a mělo by být použito pouze jako poslední výsledek.

Shrnutí

Volba Jeden

Get-Process -Name notepadStop-Process

Volba dvě

Get-WmiObject - třída Win32_Process -Filter "name = 'notepad.exe'" |Invoke-WmiMethod - ukončení

Volba tři

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

To je vše pro lidi této doby, uvidíme příští týden další zábavu PowerShell.