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:
Ja pysy kuulolla koko sarjan koko viikon ajan.
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.
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.
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.
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.