Hoe de PowerShell Expand Property te gebruiken voor Select-Object

De PowerShell Select-Object cmdlet stelt je in staat om naadloos objecten en eigenschappen te selecteren uit een invoergroep van objecten. Maar soms moet je gewoon meer weten. De ExpandProperty is een schakelaar voor Select-Object die details over een specifieke eigenschap uitbreidt.

Ontdek de kracht van de PowerShell Expand Property (-ExpandProperty) schakelaar in deze voorbeeldgeleide zelfstudie.

Vereisten

Deze zelfstudie zal een praktische demonstratie zijn. Als je wilt volgen, heb je alleen een Windows-machine met PowerShell 5.1 en hoger nodig. Dit artikel maakt gebruik van een Windows 10-machine met PowerShell 5.1.

Property-objectwaarden extraheren met PowerShell Expand Property

Meld je aan bij je Windows-machine en start een PowerShell-terminal. In deze sectie maak je kennis met de Select-Object cmdlet en zijn ExpandProperty schakelaar.

1. Voer de Get-Service cmdlet uit om een lijst van alle services op je systeem te krijgen. Leid de uitvoer door naar de Select-Object cmdlet om alleen de naam eigenschap van elk serviceobject te selecteren en weer te geven, zoals hieronder getoond.

Get-Service | Select-Object -Property Name

Je zou nu een enkele kolom van objecten moeten zien die een lijst van namen van services op je systeem vertegenwoordigen, zoals in de onderstaande verkorte weergave.

Selecting the names of the existing system services

2. Voer het Get-Member cmdlet uit aan het einde van de vorige \textit{pipeline} om het type objecten te bevestigen dat select-object retourneert zoals hieronder. Het kennen van het type object helpt bij het schrijven van functies of cmdlets om uw \textit{pipelines} uit te breiden.

Get-Service | Select-Object -Property Name | Get-Member

Verwijs naar de onderstaande schermafbeelding en je zult opmerken dat hoewel de -Property schakelaar lijkt te resulteren in een lijst van strings, dit de Geselecteerde lijst is van \textit{System.ServiceProcess.ServiceController} objecten.

Viewing the type of a ServiceController object with Get-Member

3. Vervang het Get-Members cmdlet door mkdir om automatisch een map te maken voor elke service. De -first 5 schakelaar beperkt het aantal objecten dat wordt geretourneerd. Op zijn beurt zal de mkdir functie slechts vijf mappen maken op basis van de objecten in de \textit{pipeline}.

Get-Service | Select-Object -Property Name -First 5 | mkdir

Je zou een uitvoer moeten zien die vergelijkbaar is met de schermafbeelding hieronder, wat wijst op een succesvolle poging.

Creating a folder for the services on your system

4. Verwijder de mappen door mkdir te vervangen door rmdir zoals in het onderstaande fragment. Schakel de -Verbose schakelaar in om uitgebreide uitvoer te tonen in je terminal.

Get-Service | Select-Object -Property Name -First 5 | rmdir -Verbose

De rmdir-cmdlet verwacht teksten en kan de hashtable-representatie van de ServiceController-objecten niet verwerken. Je poging zou moeten mislukken met verschillende fouten, zoals te zien is in de onderstaande schermafbeelding.

Demonstrating that some cmdlets expect string values instead of hashtables

5. Verander de -Property-schakelaar naar de -ExpandProperty-schakelaar zoals in het volgende fragment. Hierdoor kun je de waarde van een eigenschap als een tekst krijgen wanneer je alleen een tekst nodig hebt.

Get-Service | Select-Object -ExpandProperty Name -First 5 | rmdir -Verbose

Gecombineerd met rmdir zou je moeten zien dat je poging om de mappen automatisch te verwijderen slaagt zonder fouten, zoals te zien is in de onderstaande schermafbeelding.

Deleting folders named after the services expanded

Het maken van een set geselecteerde objecten met specifieke eigenschappen

Om de codefragmenten in de secties te verkorten, maak een variabele voor de eerste 20 services op je machine als volgt.

Voer de opdracht Get-Service uit, selecteer de eerste 20 objecten via de Select-Object-cmdlet en sla de objecten op in een variabele met de naam $testServices. Selecteer alleen de eigenschappen Name, Status en DependentServices als volgt.

$testServices = Get-Service | Select-Object -Property Name,Status,DependentServices -First 20

De PowerShell Expand Property-schakelaar kan slechts één eigenschap tegelijk uitbreiden, in tegenstelling tot de Property-schakelaar, die meer dan één eigenschap tegelijk kan selecteren.

Voer de variabelenaam, `$testServices`, uit om de structuur van de inhoud ervan te bekijken.

$testServices

Je zou een tabel moeten zien die de eigenschappen van de services weergeeft die je geselecteerd hebt, vergelijkbaar met de onderstaande screenshot.

Displaying the contents of $testServices

Het uitbreiden van een Collectie-eigenschap met PowerShell Expand Property

A PowerShell object can have properties that are collections of objects, also known as collection properties. In this section, you will learn how to use PowerShell Expand Property to expand a collection property to view its members’ properties.

Voer het cmdlet Select-Object uit op de variabele $testServices en breid de eigenschap DependentServices van elke service uit.

$testServices | Select-Object -ExpandProperty DependentServices

Aangezien DependentServices een collectie-eigenschap is, is de output een lijst van de services in alle gevulde collecties, zoals hieronder weergegeven. Let op de duplicaten in de lijst als gevolg van het samenvoegen van resultaten uit de uitgebreide DependentServices.

Expanding the DependentServices property

Het combineren van Eigenschap met PowerShell Expand Property voor Gecategoriseerde Output

Nu heb je een lijst van afhankelijke services, maar hoe weet je op welke service ze afhankelijk zijn? In dit gedeelte leer je de -Property-schakelaar te gebruiken om een uitgebreide eigenschap te categoriseren.

Voer de onderstaande opdracht uit om de eigenschappen van DependentServices te categoriseren op Name.

$testServices | Select-Object -ExpandProperty DependentServices -Property Name

Aangezien de afhankelijke services al een Name-eigenschap hebben, mislukt de categorisatiestap, zoals hieronder weergegeven.

De onderstaande fout vertelt je dat de oorspronkelijke lijst met services (in $testServices) al een Naam-eigenschap heeft die conflicteert met een Naam-eigenschap in de uitgebreide DependentServices-eigenschap.

Attempting to group an expanded property by the parent object name

Een workaround is om Berekende Eigenschappen te maken om de identificatie-eigenschap als volgt te hernoemen.

Sla de vorige opdrachtuitvoer gewijzigd op om een berekende eigenschap genaamd Afhankelijk van als de identificatie-eigenschap in een variabele genaamd $depServ op te geven. Afhankelijk van zal de Naamwaarde bevatten voor elke service in $testService.

De eigenschapsnaam, Afhankelijk van, werd willekeurig gekozen in deze zelfstudie en kan elke expressie naar keuze zijn.

$depServ = $testServices | Select-Object -ExpandProperty DependentServices -Property @{name="Depends On"; expr={$_.Name}}

Geef het object in $depServ door aan Select-Object om afhankelijke service Naam, Status en Afhankelijk van eigenschappen te selecteren.

$depServ | Select-Object -Property Name,Status,"Depends On"

U kunt nu zien welke services afhankelijk zijn van de services in $testServices, zoals hieronder weergegeven.

Grouping an expanded property using a calculated property

Combineer Format-List met PowerShell Expand Property voor Uitgebreidheid

PowerShell kan beperken welke objecteigenschappen worden weergegeven, vooral in tabeluitvoer, en de uitvoer van de -ExpandProperty schakelaar kan hetzelfde ervaren. U kunt de uitgebreide eigenschappen als workaround in plaats daarvan in een lijst weergeven.

Voer de Get-Process cmdlet hieronder uit om alle modules op te halen die het explorer proces gebruikt. Schakel de -ExpandProperty schakelaar in om de eigenschappen van de modules weer te geven.

Get-Process explorer | select-object -ExpandProperty Modules

De uitvoer op uw scherm moet lijken op de volgende screenshot, automatisch afgekapt om slechts drie eigenschappen weer te geven.

Viewing the truncated output of an expanded property

Leid de objecten door naar de Format-List cmdlet om alle waarden voor de module-objecten te bekijken in een meer beheersbare lijst.

Get-Process explorer | select-object -ExpandProperty Modules | Format-List

Zoals hieronder getoond, worden alle eigenschappen en hun waarden vermeld. U kunt de gegevens verder opslaan in een bestand of deze doorgeven aan een andere cmdlet voor verdere verwerking.

Converting the output of an expanded property to a list with Format-List

Conclusie

Door het succesvol tot hier te halen, hebt u gezien hoe u kunt profiteren van de PowerShell Expand Property-schakelaar (-ExpandProperty) van de Select-Object cmdlet. PowerShell biedt een scala aan handige cmdlets voor veelvoorkomende taken. U kunt uw nieuwe kennis verder uitbreiden door te leren hoe u snel bestanden kunt weergeven met PowerShell Cat.

Source:
https://adamtheautomator.com/powershell-expand-property/