So verwenden Sie die PowerShell-Eigenschaft für das Auswählen von Objekten

Der PowerShell Select-Object-Cmdlet ermöglicht es Ihnen, nahtlos Objekte und Eigenschaften aus einer Eingabegruppe von Objekten auszuwählen. Aber manchmal müssen Sie einfach mehr wissen. Der ExpandProperty ist ein Schalter für Select-Object, der Details zu einer bestimmten Eigenschaft erweitert.

Entdecken Sie die Leistung des PowerShell Expand Property (-ExpandProperty)-Schalters in diesem beispielgeführten Tutorial.

Voraussetzungen

Dieses Tutorial wird eine praktische Demonstration sein. Wenn Sie mitmachen möchten, benötigen Sie lediglich eine Windows-Maschine mit PowerShell 5.1 und höher. Dieser Artikel verwendet eine Windows 10-Maschine mit PowerShell 5.1.

Extrahieren von Werten aus Eigenschaftsobjekten mit PowerShell Expand Property

Melden Sie sich an Ihrer Windows-Maschine an und starten Sie ein PowerShell-Terminal. In diesem Abschnitt lernen Sie das Select-Object-Cmdlet und seinen ExpandProperty-Schalter kennen.

1. Führen Sie das Get-Service-Cmdlet aus, um eine Liste aller Dienste auf Ihrem System zu erhalten. Leiten Sie die Ausgabe an das Select-Object-Cmdlet weiter, um nur die Name-Eigenschaft jedes Dienstobjekts auszuwählen und anzuzeigen, wie unten dargestellt.

Get-Service | Select-Object -Property Name

Sie sollten jetzt eine einzelne Spalte von Objekten sehen, die eine Liste von Namen der Dienste auf Ihrem System repräsentieren, wie im abgeschnittenen Screenshot unten.

Selecting the names of the existing system services

2. Führen Sie das Get-Member-Cmdlet am Ende des vorherigen Pipelines aus, um den Typ der Objekte zu bestätigen, die Select-Object zurückgibt, wie unten dargestellt. Die Kenntnis des Objekttyps hilft beim Schreiben von Funktionen oder Cmdlets, um Ihre Pipelines zu erweitern.

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

Beziehen Sie sich auf den Screenshot unten, und Sie werden feststellen, dass der -Property-Schalter zwar eine Liste von Zeichenfolgen auszugeben scheint, es sich jedoch um die ausgewählte Liste von System.ServiceProcess.ServiceController-Objekten handelt.

Viewing the type of a ServiceController object with Get-Member

3. Ersetzen Sie das Get-Member-Cmdlet durch mkdir, um automatisch für jeden Dienst einen Ordner zu erstellen. Der -first 5-Schalter begrenzt die Anzahl der zurückzugebenden Objekte. Die mkdir-Funktion erstellt ihrerseits nur fünf Ordner basierend auf den Objekten in der Pipeline.

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

Sie sollten eine Ausgabe ähnlich dem untenstehenden Screenshot sehen, was einen erfolgreichen Versuch anzeigt.

Creating a folder for the services on your system

4. Entfernen Sie die Ordner, indem Sie mkdir durch rmdir wie im folgenden Ausschnitt ersetzen. Schalten Sie den -Verbose-Schalter ein, um detaillierte Ausgaben in Ihrem Terminal anzuzeigen.

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

Der rmdir-Befehl erwartet Zeichenfolgen und kann die Hashtable-Repräsentation der ServiceController-Objekte nicht verarbeiten. Ihr Versuch sollte mit mehreren Fehlern scheitern, wie im folgenden Screenshot.

Demonstrating that some cmdlets expect string values instead of hashtables

Ändern Sie den -Property-Schalter in den -ExpandProperty-Schalter wie im folgenden Ausschnitt. Dadurch können Sie den Wert einer Eigenschaft als Zeichenfolge erhalten, wenn Sie nur eine Zeichenfolge benötigen.

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

In Kombination mit rmdir sollte Ihr Versuch, die Ordner automatisch zu entfernen, ohne Fehler erfolgreich sein, wie im folgenden Screenshot.

Deleting folders named after the services expanded

Erstellen eines Satzes ausgewählter Objekte mit bestimmten Eigenschaften

Um die Codeausschnitte in den Abschnitten zu verkürzen, erstellen Sie eine Variable für die ersten 20 Dienste auf Ihrem Computer wie folgt.

Führen Sie den Befehl Get-Service aus, wählen Sie die ersten 20 Objekte über den Select-Object-Befehl aus und speichern Sie die Objekte in einer Variablen mit dem Namen $testServices. Wählen Sie nur die Eigenschaften Name, Status und DependentServices wie folgt aus.

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

Der PowerShell Expand Property-Schalter kann immer nur eine Eigenschaft gleichzeitig erweitern, im Gegensatz zum Property-Schalter, der mehrere Eigenschaften gleichzeitig auswählen kann.

Führen Sie die Variable mit dem Namen $testServices aus, um die Struktur ihrer Inhalte anzuzeigen.

$testServices

Sie sollten eine Tabelle sehen, die die Eigenschaften der von Ihnen ausgewählten Dienste ähnlich wie im folgenden Screenshot anzeigt.

Displaying the contents of $testServices

Erweitern einer Sammeleigenschaft mit 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.

Führen Sie das Select-Object-Cmdlet auf der Variable $testServices aus und erweitern Sie die Eigenschaft DependentServices jedes Dienstes.

$testServices | Select-Object -ExpandProperty DependentServices

Da DependentServices eine Sammeleigenschaft ist, ist die Ausgabe eine Liste der Dienste in allen bevölkerten Sammlungen, wie unten gezeigt. Beachten Sie die Duplikate in der Liste aufgrund der Verknüpfung von Ergebnissen aus den erweiterten DependentServices.

Expanding the DependentServices property

Kombination von Eigenschaften mit PowerShell Expand Property für kategorisierte Ausgabe

Jetzt haben Sie eine Liste von abhängigen Diensten, aber wie wissen Sie, von welchem Dienst sie abhängen? In diesem Abschnitt lernen Sie, den Schalter -Property zu verwenden, um eine erweiterte Eigenschaft zu kategorisieren.

Führen Sie den folgenden Befehl aus, um die Eigenschaften DependentServices nach Name zu kategorisieren.

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

Da die abhängigen Dienste bereits eine Name-Eigenschaft haben, schlägt der Kategorisierungsschritt fehl, wie unten gezeigt.

Der untenstehende Fehler zeigt Ihnen, dass die ursprüngliche Liste der Dienste (in $testServices) bereits eine Name-Eigenschaft hat, die mit einer Name-Eigenschaft in der erweiterten DependentServices-Eigenschaft in Konflikt steht.

Attempting to group an expanded property by the parent object name

Eine Möglichkeit besteht darin, Calculated Properties zu erstellen, um die Bezeichnungseigenschaft wie folgt umzubenennen.

Speichern Sie die vorherige Befehlsausgabe, die zur Spezifizierung einer berechneten Eigenschaft namens „Depends On“ als Bezeichnungseigenschaft in einer Variable namens $depServ modifiziert wurde. „Depends On“ wird den Namenswert für jeden Dienst in $testService enthalten.

Der Eigenschaftsname, Depends on, wurde in diesem Tutorial willkürlich gewählt und kann durch jeden Ausdruck Ihrer Wahl ersetzt werden.

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

Geben Sie das Objekt in $depServ durch Select-Object weiter, um abhängige Diensteigenschaften Name, Status und Depends On auszuwählen.

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

Sie können nun erkennen, welche Dienste von den Diensten in $testServices abhängig sind, wie unten gezeigt.

Grouping an expanded property using a calculated property

Kombinieren Sie Format-List mit dem PowerShell Expand Property für mehr Übersichtlichkeit

PowerShell kann die anzuzeigenden Objekteigenschaften einschränken, insbesondere in tabellarischer Ausgabe, und die Ausgabe des Schalters -ExpandProperty kann dasselbe Problem verursachen. Als Umgehung können Sie die erweiterten Eigenschaften stattdessen in einer Liste anzeigen lassen.

Führen Sie den folgenden Get-Process-Befehl aus, um alle Module abzurufen, die der explorer-Prozess verwendet. Schalten Sie den Schalter -ExpandProperty ein, um die Eigenschaften der Module anzuzeigen.

Get-Process explorer | select-object -ExpandProperty Modules

Die Ausgabe auf Ihrem Bildschirm sollte der folgenden Abbildung ähneln, automatisch auf drei Eigenschaften beschränkt.

Viewing the truncated output of an expanded property

Leiten Sie die Objekte an das Format-List-Cmdlet weiter, um alle Werte für die Modulobjekte in einer übersichtlicheren Liste anzuzeigen.

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

Wie unten gezeigt, werden alle Eigenschaften und ihre Werte aufgelistet. Sie können die Daten weiterhin in einer Datei speichern oder sie an ein anderes Cmdlet für weitere Verarbeitung übergeben.

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

Abschluss

Indem Sie es erfolgreich bis hierhin geschafft haben, haben Sie gesehen, wie Sie von dem PowerShell-Schalter für Eigenschaften erweitern (-ExpandProperty) des Cmdlets Select-Object profitieren können. PowerShell bietet eine Vielzahl nützlicher Cmdlets für viele gängige Aufgaben. Sie können Ihr neues Wissen erweitern, indem Sie lernen, wie Sie Dateien schnell mit PowerShell Cat anzeigen.

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