Geek School Werken met collecties in PowerShell
Omdat PowerShell is gebaseerd op het .Net Framework en verschillende andere technologieën zoals WMI en CIM bevat, is er altijd meer dan één manier om hetzelfde te bereiken. Kom bij ons langs voor deze korte post waarin we leren hoe we de beste methode kunnen kiezen om onze taken te volbrengen.
Zorg ervoor dat u de vorige artikelen in de serie leest:
- Leer hoe u Windows kunt automatiseren met PowerShell
- Leren gebruik te maken van cmdlets in PowerShell
- Leren hoe objecten in PowerShell te gebruiken
- Leren opmaken, filteren en vergelijken in PowerShell
- Leer hoe u Remoting kunt gebruiken in PowerShell
- PowerShell gebruiken om computerinformatie te verkrijgen
En blijf op de hoogte voor de rest van de serie de hele week.
Batch-cmdlets gebruiken
Eerder in de serie, toen we je aan de pijplijn introduceerden, hebben we je laten zien hoe je de objecten die een cmdlet uitvoert kunt uitvoeren en deze als invoer kunt doorgeven aan een andere cmdlet met zoiets als dit:
Get-Process -Name notepad | Stop-proces
Dit zou elk proces met de naam "notepad" doden. Maar u vraagt zich waarschijnlijk af hoe PowerShell elk exemplaar van Kladblok met één enkele opdracht kan doden. Het antwoord ligt in de hulp van de Stop-Process cmdlet.
Help Stop-Process -Full
Als u de laatste regel met code in de syntaxisectie bekijkt, kunt u zien dat de parameter InputObject een object van het type Process [] accepteert, en telkens wanneer u een type ziet gevolgd door twee vierkante haken, betekent dit dat de parameter accepteert een of meer van het voorgaande type. In dit geval accepteert het een of meer procesobjecten. Technisch gezien zouden we zeggen dat de InputObject-cmdlet een proces accepteert rangschikking. Wanneer u een cmdlet hebt die batchbewerkingen op deze manier ondersteunt, gebruikt u deze. Dit is keuze nummer één.
WMI gebruiken
Hoewel WMI niet het beste stuk technologie is dat wordt verzonden vanaf het hoofdkantoor van Microsoft, komt het toch op de tweede plaats in de lijst met hoe te werken met verzamelingen objecten. We zouden gemakkelijk een lijst van lopende processen van de Win32_Process-klasse kunnen krijgen, zoals zo:
Get-WmiObject -Class Win32_Process
Omdat de WMI-query zijn eigen soort object retourneert, moet u op zoek naar een methode die het proces kan stoppen, dus laat pipe dat doen om lid te worden.
Get-WmiObject -Class Win32_Process | Get-Member
Het lijkt erop dat het dichtsbijzijnde om te stoppen de terminate-methode is, dus dat moet het zijn. Om een methode op een WMI-object aan te roepen, hoeft u deze alleen maar naar Invoke-WmiMethod te pipen en de naam van de methode op te geven.
Get-WmiObject -Class Win32_Process -Filter "name = 'notepad.exe'" | Invoke-WmiMethod -Name Terminate
Geweldig, dat heeft de truc gedaan. Wanneer u een ReturnValue van 0 krijgt in WMI, onthoud dan dat de opdracht met succes is uitgevoerd.
Opsomming
Bij het ontbreken van de andere twee methoden, als u iets moet doen aan een aantal objecten, kunt u het gehele object opsommen en op elk afzonderlijk object inwerken. Eerst moet je de methode vinden die je zou gebruiken om een enkel proces te stoppen.
Get-Process | Get-Member-MemberType-methode
Perfect, het lijkt erop dat we de Kill-methode kunnen gebruiken en dan naar ForEach-Object kunnen pipen om ze allemaal te doden.
Get-Process -Name notepad | ForEach-Object -Process $ _. Kill ()
Hier hebben we alle procesobjecten die Get-Process hebben geretourneerd en deze doorgegeven aan de cmdlet ForEach-Object. Net zoals de Where-Object-cmdlet, representeerden we elk object in de pijplijn met $ _, waarmee we de Kill () -methode konden aanroepen. Met dat alles gezegd en gedaan, is het opsommen van een verzameling veel langzamer dan de bovenstaande methoden en zou alleen als een laatste resultaat moeten worden gebruikt.
Samenvatting
Keuze één
Get-Process -Name notepad | Stop-proces
Keuze twee
Get-WmiObject -Class Win32_Process -Filter "name = 'notepad.exe'" | Invoke-WmiMethod -Name Terminate
Keuze Drie
Get-Process -Name notepad | ForEach-Object -Process $ _. Kill ()
Dat is alles voor deze keer mensen, tot volgende week voor meer PowerShell-plezier.