Out-GridView mit benutzerdefinierten Spalten / Sudo Null IT News

Das Cmdlet Out-GridView kann mit den Parametern -OutputMode und -PassThru als generische Dialogschnittstelle verwendet werden. Mit ihnen zeigt das Tabellenansichtsfenster (Raster) unten rechts zusätzliche Schaltflächen an, und Sie können die ausgewählten Zeilen an die folgenden Cmdlets übergeben.

Sie könnten den ausgewählten Dienst beispielsweise wie folgt stoppen:

Service erhalten | Where-Object CanStop | Out-GridView -Title ‘Service to stop?’ -OutputModeSingle | Stop-Service-WhatIf

Das Cmdlet Out-GridView bietet jedoch keine Kontrolle über den Satz von Eigenschaften, den es anzeigt. In diesem Beispiel müssen wir nur den Namen des Dienstes sehen und möglicherweise die Dienste, die davon abhängen.

Ja, Sie können das Cmdlet Select-Object verwenden, um anzuzeigende Eigenschaften auszuwählen. Jetzt zeigt das Raster genau die angeforderten Spalten, aber die folgenden Cmdlets können kaputt gehen, weil Sie andere Eigenschaften ausgelassen und den Objekttyp insgesamt geändert haben:

Service erhalten | Where-Object CanStop | Select-Object -Property DisplayName, DependentServices | Out-GridView -Title ‘Service to stop?’ -OutputModeSingle | Stop-Service-WhatIf

Jetzt sieht das Raster so aus, wie es sollte, aber das Stop-Service-Cmdlet kann den Dienst nicht stoppen, da das Select-Object-Cmdlet den Typ des Objekts geändert hat und es kein Dienst mehr ist:

Stop-Service : Das angegebene Platzhalterzeichenmuster ist ungültig: @{DisplayName=Windows Audio Endpoint Builder; DependentServices=System.ServiceProcess.ServiceController[]}

Wir haben bereits über eine verborgene Technologie gesprochen, mit der wir dem Cmdlet Out-GridView mitteilen könnten, welche Spalten wir sehen möchten – ohne andere Eigenschaften zu entfernen und den Objekttyp beizubehalten:

# Objekt erstellen, das PowerShell mitteilt, welche Spalte(n) sichtbar sein sollen: # “DisplayName” und “DependentServices” anzeigen
[string[]]$visible=”DisplayName”, ‘DependentServices’ $type=”DefaultDisplayPropertySet”
[System.Management.Automation.PSMemberInfo[]]$info =
[System.Management.Automation.PSPropertySet]::new($type,$visible) Get-Service | Where-Object CanStop | # Fügen Sie das geheime Objekt zu jedem Objekt hinzu, das Sie in Out-GridView leiten: Add-Member -MemberType MemberSet -Name PSStandardMembers -Value $info -PassThru | Out-GridView -Title ‘Service to stop?’ -OutputModeSingle | Stop-Service-WhatIf

Aber auch hier ist ein Mist mit roten Fehlermeldungen möglich. Einige PowerShell-Objekte (z. B. Dienste) werden selbst implementiert, indem die PSStandardMembers-Eigenschaft hinzugefügt wird, sodass wir sie nicht ein zweites Mal hinzufügen können. Um diese Hürde zu umgehen, klonen Sie einfach die Objekte, indem Sie sie durch das Cmdlet Select-Object * leiten:

# Objekt erstellen, das PowerShell mitteilt, welche Spalte(n) sichtbar sein sollen: # “DisplayName” und “DependentServices” anzeigen
[string[]]$visible=”DisplayName”, ‘DependentServices’ $type=”DefaultDisplayPropertySet”
[System.Management.Automation.PSMemberInfo[]]$info =
[System.Management.Automation.PSPropertySet]::new($type,$visible) Get-Service | Where-Object CanStop | # klonen Sie die Objekte, damit sie Ihnen gehören: Select-Object -Property * | # Fügen Sie das geheime Objekt zu jedem Objekt hinzu, das Sie in Out-GridView leiten: Add-Member -MemberType MemberSet -Name PSStandardMembers -Value $info -PassThru | Out-GridView -Title ‘Service to stop?’ -OutputModeSingle | Stop-Service-WhatIf

Jetzt funktioniert alles wieder und Out-GridView zeigt nur die ausgewählten Eigenschaften an. Gleichzeitig versteht Stop-Process immer noch seine Ausgabe und stoppt den ausgewählten Dienst (entfernen Sie dazu -WhatIf und stellen Sie sicher, dass Sie über Administratorrechte verfügen).

Obwohl die Übergabe von Objekten durch Select-Object ihren Typ ändert, bemerken die meisten nachfolgenden Cmdlets dies nicht, da die Objekte, die zu ihnen gelangen, alle Eigenschaften des Originals enthalten. Hier ist eine abschließende Illustration: Obwohl das Out-GridView-Cmdlet nur ausgewählte Eigenschaften anzeigt, bestehen Objekte aus einem vollständigen Satz von Eigenschaften:

# Objekt erstellen, das PowerShell mitteilt, welche Spalte(n) sichtbar sein sollen: # “Name”, “Description” und “MainWindowTitle” anzeigen
[string[]]$visible=”Name”, ‘Beschreibung’, ‘Titel des Hauptfensters’ $type=”DefaultDisplayPropertySet”
[System.Management.Automation.PSMemberInfo[]]$info =
[System.Management.Automation.PSPropertySet]::new($type,$visible) Get-Prozess | Where-Object MainWindowTitle | Sort-Object-Eigenschaftsname | # klonen Sie die Objekte, damit sie Ihnen gehören: Select-Object -Property * | # Fügen Sie das geheime Objekt zu jedem Objekt hinzu, das Sie in Out-GridView leiten: Add-Member -MemberType MemberSet -Name PSStandardMembers -Value $info -PassThru | Out-GridView -Title ‘Prozess auswählen’ -OutputMode Single | # noch alle Eigenschaften verfügbar: Select-Object -Property *

Similar Posts

Leave a Reply

Your email address will not be published.