Geek School Práca s kolekciami v PowerShell
Vzhľadom k tomu, že PowerShell je založený na .Net Framework a zahŕňa rôzne iné technológie ako WMI a CIM, existuje vždy viac ako jeden spôsob, ako dosiahnuť to isté. Pridajte sa k nám na tento krátky príspevok, kde sa dozvieme, ako vybrať najlepšiu metódu na splnenie našich úloh.
Nezabudnite si prečítať predchádzajúce články v sérii:
- Naučte sa ako automatizovať systém Windows pomocou nástroja PowerShell
- Naučiť sa používať Cmdlets v PowerShell
- Učenie o používaní objektov v systéme PowerShell
- Formátovanie učenia, filtrovanie a porovnávanie v systéme PowerShell
- Naučte sa používať Remoting v PowerShell
- Použitie PowerShell na získanie informácií o počítači
A zostávajte celú týždeň na zvyšok seriálu.
Použitie šarží
Predtým v sérii, keď sme vás predstavili na potrubí, ukázali sme vám, ako môžete vziať objekty, ktoré jeden výstupy cmdlet a prenášať ako vstup do iného cmdlet pomocou niečo takéto:
Get-Process -Name notepad Stop-Process
Tým by zabili všetky procesy s názvom "poznámkový blok". 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 tom, že vám pomôže Stop-Process cmdlet.
pomôžte 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, to znamená, že parameter akceptuje jeden alebo viac predchádzajúceho typu. V tomto prípade akceptuje jeden alebo viac objektov procesu. Technicky by sme povedali, že cmodlet InputObject akceptuje proces rad. Kedykoľvek máte cmdlet, ktorý podporuje dávkové operácie týmto spôsobom, použite ho. Toto je voľba číslo jedna.
Používanie služby WMI
Hoci služba WMI nie je najlepšou technológiou na odosielanie z hlavného sídla spoločnosti Microsoft, prišiel na druhom mieste v zozname, ako pracovať so zbierkami predmetov. Mohli by sme ľahko získať zoznam bežiacich procesov z triedy Win32_Process takto:
Get-WmiObject - trieda Win32_Process
Keďže dotaz WMI vráti vlastný druh objektu, budete musieť hľadať metódu, ktorá môže zastaviť proces, a tak nechá to,.
Get-WmiObject - Trieda Win32_Process | Get-Člen
Zdá sa, ž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 objekt WMI, jednoducho ju pridajte na Invoke-WmiMethod a zadajte názov metódy.
Get-WmiObject - Trieda Win32_Process -Filter "name = 'notepad.exe'" | Invoke-WmiMethod-skončiť
Skvelý, to urobil trik. Kedykoľvek dostanete ReturnValue 0 v službe WMI, nezabudnite, že príkaz bol vykonaný úspešne.
výpočet
Pokiaľ nedosiahnete ostatné dve metódy, ak musíte urobiť niečo na 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-Process Metóda Get-Member -MemberType
Dokonalé, vyzerá to, že môžeme použiť metódu Kill a potom potrubie na ForEach-Object, aby sme ich všetko zabili.
Get-Process -Name notepad ForEach-Object -Process $ _.Kill ()
Tu sme vzali všetky procesné objekty, ktoré Get-Process vrátil a odovzdali ich do rutiny ForEach-Object. Rovnako ako cmdlet Kde-Object sme reprezentovali každý objekt v potrubí s $ _, ktoré sme mohli zavolať na metódu Kill (). So všetko, čo bolo povedané 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 jedna
Get-Process -Name notepad Stop-Process
Voľba dva
Get-WmiObject - Trieda Win32_Process -Filter "name = 'notepad.exe'" | Invoke-WmiMethod-skončiť
Výber 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.