11Sep

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.

Lees de vorige artikelen in de reeks:

  • Leer hoe u Windows kunt automatiseren met PowerShell
  • Leren gebruik van cmdlets in PowerShell
  • Leren gebruiken van objecten in PowerShell
  • Leren opmaken, filteren en vergelijken in PowerShell
  • Leer hoe u remodeling in kunt stellenPowerShell
  • PowerShell gebruiken om computerinformatie te krijgen

En de rest van de serie de hele week op de hoogte blijven.

Batch-Cmdlets gebruiken

Eerder in de serie, toen we u aan de pijplijn introduceerden, hebben we u laten zien hoe u de objecten die een cmdlet uitvoert kunt uitvoeren en deze als invoer kunt doorgeven aan een andere cmdlet met zoiets als dit:

Get-Process -Geef notepad op |Stop-proces

Dit zou elk proces met de naam "notepad" doden. Maar je vraagt ​​je waarschijnlijk af hoe PowerShell elk exemplaar van Kladblok met één 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 zoalsdat dit betekent dat de parameter één of meer van het voorgaande type accepteert. In dit geval accepteert het een of meer procesobjecten. Technisch gezien zouden we zeggen dat de InputObject-cmdlet een proces -array accepteert. 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, staat het toch op de tweede plaats in de lijst met werken met verzamelingen objecten. We zouden gemakkelijk een lijst van lopende processen uit de Win32_Process-klasse kunnen krijgen zoals:

Get-WmiObject -Class Win32_Process

Omdat de WMI-query zijn eigen soort object retourneert, moet je een methode zoeken die het proces kan stoppen, duslaat dat naar Get-Member leiden.

Get-WmiObject -Class Win32_Process |Get-member

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, bedenk dan dat de opdracht met succes is uitgevoerd.

Enumeration

Als de andere twee methoden niet worden toegepast, als u iets moet doen aan een aantal objecten, kunt u het gehele object opsommen en op elk afzonderlijk object reageren. 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, presenteerden we elk object in de pijplijn met $ _, waarmee we de methode Kill() 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 Eé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 tijd mensen, zie je volgende week voor meer PowerShell-plezier.