If-Koubou

Geek-koulu: PowerShell-kokoelmien käsittely

Geek-koulu: PowerShell-kokoelmien käsittely (Miten)

Koska PowerShell perustuu .Net Framework -järjestelmään ja sisältää useita muita tekniikoita, kuten WMI ja CIM, on olemassa aina useampi kuin yksi tapa tehdä sama asia. Tule mukaan tähän lyhyeen viestiin, jossa opimme valitsemaan paras tapa toteuttaa tehtäviä.

Muista lukea sarjan aiemmat artikkelit:

  • Opi käyttämään automaattista Windowsia PowerShellillä
  • Learning käyttämään Cmdlets PowerShellissä
  • Oppiminen esineiden käyttämisessä PowerShellissä
  • Oppimisen muotoilu, suodatus ja vertailu PowerShellissä
  • Opi käyttämään etäisyyttä PowerShellissä
  • PowerShellin käyttäminen tietokoneen tietojen saantiin

Ja pysy kuulolla koko sarjan koko viikon ajan.

Eräiden Cmdlettien käyttäminen

Aikaisemmin sarjassa, kun esittelemme sinut putkijonoon, näytimme, kuinka voit ottaa esineitä, jotka yksi cmdlet tulostaa ja siirtää ne syötteeksi toiseen cmdlettiin käyttäen jotain tällaista:

Get-Process -Name muistilehtiö Stop-prosessi

Tämä hävisi minkä tahansa prosessin nimeltä "notepad". Mutta olet luultavasti miettimässä, miten PowerShell pystyy taputtamaan jokaisen notepad-esiintymän yhdellä komennolla. Vastaus on Stop-Process-cmdletin avulla.

help Stop-Process -Full

Jos tarkastelet koodin viimeistä rivin syntaksio-osassa, näet, että InputObject-parametri hyväksyy tyypillisen prosessin [] prosessin, ja aina, kun näet tyypin, jota seuraa kaksi hakasulkeita, se tarkoittaa, että parametri hyväksyy yksi tai useampi edellisestä tyypistä. Tässä tapauksessa se hyväksyy yhden tai useamman prosessiesineen. Teknisesti sanomme, että InputObject-cmdlet hyväksyy prosessin ryhmä. Aina, kun sinulla on cm-osa, joka tukee erätoimintoja tällä tavalla, käytä sitä. Tämä on valinnan numero yksi.

WMI: n käyttäminen

Vaikka WMI ei ole paras tekniikka, joka toimitetaan Microsoftin pääkonttorista, se tulee toiseksi luettelossa siitä, miten käsitellä esineiden kokoelmia. Voimme helposti saada luettelon käynnissä olevista prosesseista Win32_Process-luokasta kuten:

Get-WmiObject -Class Win32_Process

Koska WMI-kysely palauttaa oman tyyppisen esineen, sinun on etsittävä menetelmää, joka voi lopettaa prosessin, joten antaa putken Get-jäsenelle.

Get-WmiObject -Class Win32_Process | Get-jäsen

Näyttää siltä, ​​että lähinnä lopettaa on lopettaa menetelmä, joten se on yksi. Jos haluat kutsua menetelmän WMI-objektille, siirrä se vain Invoke-Wmi-menetelmäksi ja määritä sen nimi.

Get-WmiObject -Class Win32_Process -Filter "name = 'notepad.exe'" | Kutsu-WmiMethod -Name Lopeta

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

luettelointi

Kahden muun menetelmän puuttuminen, jos joudut tekemään jotain joukolle objekteja, voit luetella koko objektin ja toimia kunkin yksittäisen objektin suhteen. Ensin sinun on löydettävä menetelmä, jonka avulla lopetat yhden prosessin.

Get-Process | Get-jäsen-jäsentyypin menetelmä

Täydellinen, näyttää siltä, ​​että voimme käyttää Kill-menetelmää ja sitten putkea ForEach-Objectiksi tappaaksemme ne kaikki.

Get-Process -Name muistilehtiö ForEach-Object -Prosessi $ _. Kill ()

Täällä otimme kaikki Process-kohteet, jotka Get-Process palautti ja välittäneet ne ForEach-Object-cmdlettiin. Paljon kuin esimerkiksi Where-Object-cmdlet, edustelimme jokaisen putkijohdon $ _ kanssa, jonka pystyimme soittamaan Kill () -menetelmään. Kaikkien, jotka sanovat ja tekevät, kokoelman laskeminen on paljon hitaampaa kuin edellä mainitut menetelmät, ja sitä pitäisi käyttää vain viimeisenä tuloksena.

Yhteenveto

Choice One

Get-Process -Name muistilehtiö Stop-prosessi

Vaihtoehto kaksi

Get-WmiObject -Class Win32_Process -Filter "name = 'notepad.exe'" | Kutsu-WmiMethod -Name Lopeta

Valintana kolme

Get-Process -Name muistilehtiö ForEach-Object -Prosessi $ _. Kill ()

Kaikki tämä tänä aikana ihmiset, näet ensi viikolla enemmän PowerShell-hauskaa.