/ / Geek School: Työskentely kokoelmien kanssa PowerShellissä

Geek-koulu: Työskentely kokoelmien kanssa PowerShellissä

Koska PowerShell perustuu.Net Framework ja sisältää useita muita tekniikoita, kuten WMI ja CIM, on aina enemmän kuin yksi tapa toteuttaa sama asia. Tule mukaan lyhyt viesti, jossa opimme valitsemaan parhaan tavan suorittaa tehtävämme.

Muista lukea sarjan aiemmat artikkelit:

  • Opi kuinka automatisoida Windows PowerShellin avulla
  • Cmdlettien käytön oppiminen PowerShellissä
  • Objektien käytön oppiminen PowerShellissä
  • Alustuksen, suodattamisen ja vertailun oppiminen PowerShellissä
  • Opi käyttämään etäkäyttöä PowerShellissä
  • PowerShellin käyttäminen tietokoneiden tietojen hankkimiseen

Ja pysy kuulolla koko viikon ajan.

Erämomenttien käyttäminen

Aikaisemmin sarjasta, kun esittelimme sinulle putkilinjan, osoitimme sinulle, kuinka voit ottaa objektit, jotka yksi cmdlet tulostaa, ja siirtää ne tuloksi toiseen cmdlet käyttämällä jotain tällaista:

Get-Process -Name -muistio | Stop-prosessi

Se tappaa kaikki prosessit nimellä"muistilehtiö". Mutta ihmettelet todennäköisesti kuinka PowerShell pystyy tappamaan jokaisen muistilappun ilmentymän yhdellä komennolla. Vastaus löytyy Stop-Process-cmdlet-sovelluksen avulla.

ohje Stop-Process - Täydellinen

kuva

Jos katsot koodin viimeistä riviäsyntaksi-osiossa voit nähdä, että InputObject-parametri hyväksyy prosessityyppisen objektin [], ja aina kun näet tyypin, jota seuraa kaksi hakasulketta, kuten se tarkoittaa, että parametri hyväksyy yksi tai useampi edellisen tyyppisiä. Tässä tapauksessa se hyväksyy yhden tai useamman prosessiobjektin. Teknisesti sanomme, että InputObject-cmdlet hyväksyy prosessin ryhmä. Aina kun sinulla on cmdlet, joka tukee erätoimintoja tällä tavalla, käytä sitä. Tämä on valinta numero yksi.

WMI: n käyttö

Vaikka WMI ei ole paras tekniikkaJos haluat lähettää sen Microsoft HQ: lta, se tulee toisessa vaiheessa luetteloon siitä, kuinka työskennellä esinekokoelmien kanssa. Voimme helposti saada luettelon käynnissä olevista prosesseista Win32_Process-luokalta kuten:

Get-WmiObject - luokka Win32_Process

kuva

Koska WMI-kysely palauttaa oman tyyppisen objektinsa, joudut etsimään menetelmää, joka voi pysäyttää prosessin, joten päästää sen Get-Memberiin.

Get-WmiObject –luokan Win32_Process | Get-jäsen

kuva

Näyttää siltä, ​​että lähin asia lopettaa on lopettaa menetelmä, joten sen on oltava yksi. Jos haluat kutsua menetelmää WMI-objektista, lähetä se vain Invoke-WmiMethod -sovellukseen ja määritä menetelmän nimi.

Get-WmiObject -Class Win32_Process -Suodatin “name = 'notepad.exe'” | Invoke-WmiMethod -Nimi Lopeta

kuva

Hienoa, se teki tempun. Aina kun saat ReturnValue-arvon 0 WMI: ssä, muista vain, että komento suoritettiin onnistuneesti.

luettelointi

Kaksi muuta tapaa epäonnistuu, jos sinun täytyy tehdäjotain joukolle esineitä, voit luetella koko objektin ja toimia jokaisen yksittäisen objektin kohdalla. Ensin on löydettävä menetelmä, jolla voit pysäyttää yhden prosessin.

Hanki prosessi | Hanki jäsen -MemberType-menetelmä

kuva

Täydellinen, näyttää siltä, ​​että voimme käyttää tappaa -menetelmää ja sitten putoaa ForEach-Objectiin tappaakseen heidät kaikki.

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

kuva

Täältä otimme kaikki prosessiobjektit, jotkaGet-Process palautti ja välitti ne ForEach-Object-cmdlet-sovellukseen. Aivan kuten Where-Object-cmdlet, me edusimme kutakin valmisteilla olevaa objektia painikkeella $ _, jonka pystyimme käyttämään Kill () -menetelmään. Kaikella sanotulla ja tehdyllä tavalla kokoelman luetelma on paljon hitaampaa kuin yllä olevat menetelmät, ja sitä tulisi käyttää vain viimeisenä tuloksena.

Yhteenveto

Valinta Yksi

Get-Process -Name -muistio | Stop-prosessi

Vaihtoehto kaksi

Get-WmiObject -Class Win32_Process -Suodatin “name = 'notepad.exe'” | Invoke-WmiMethod -Nimi Lopeta

Vaihtoehto kolme

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

Tämä on kaikki tällä kertaa, nähdään ensi viikolla lisää PowerShell-hauskaa.