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
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
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
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
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ä
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 ()}
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.