Geek School Práce s kolekcemi v PowerShell
Vzhledem k tomu, že PowerShell je založen na .Net Frameworku 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ídá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 pomocí nástroje PowerShell
- Naučte se používat Cmdlets v PowerShell
- Učení o používání objektů v prostředí PowerShell
- Formátování učení, filtrování a porovnávání v prostředí PowerShell
- Naučte se používat Remoting v PowerShell
- 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žití šarží
Dříve v sérii, když jsme vás představili na potrubí, ukázali jsme vám, jak můžete vzít objekty, které mají výstupy jednoho cmdletu a předat je jako vstup do jiného cmdletu pomocí něčeho podobného:
Get-Process -Name poznámkový blok | Zastavit proces
Tím by zabili všechny procesy s názvem "poznámkový blok". 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-procesu cmdlet.
help Stop-Process -Full
Pokud se podíváte na poslední řádek kódu v sekci syntaxe, můžete vidět, že parametr InputObject přijímá objekt typu Process [] a vždy, když uvidíte typ následovaný dvěma hranatými závorkami, znamená to, že parametr akceptuje 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 InputObject cmdlet 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.
Pomocí služby WMI
Ačkoli WMI není nejlepším technologickým vybavením, které by bylo možné přenášet z ústředí společnosti Microsoft, přichází na druhé místo na seznamu, jak pracovat se sbírkami 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, a tak umožňuje potrubí,.
Get-WmiObject - třída Win32_Process | Získejte-člen
Zdá se, ž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 - ukončete
Skvělé, tohle trik. Kdykoli dostanete ReturnValue 0 v WMI, nezapomeňte, že příkaz byl proveden úspěšně.
Výčet
V případě selhání dalších dvou metod, pokud budete muset něco udělat na banda 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-Process | Metoda Get-Member -MemberType
Dokonalé, zdá se, že můžeme použít metodu zabíjení 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 představovali 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.
souhrn
Volba jedna
Get-Process -Name poznámkový blok | Zastavit proces
Volba dva
Get-WmiObject - třída Win32_Process -Filter "name = 'notepad.exe'" | Invoke-WmiMethod - ukončete
Tři volby
Get-Process -Name poznámkový blok | ForEach-Object -Process $ _. Kill ()
To je všechno pro lidi z této doby, uvidíme se příští týden za další zábavu PowerShell.