Swap-Table

PowerShell ist genial und einfache Commandlets liefern gerne komplette Listen. So z.B. Get-ReceiveConnector oder Ger-Process, die beide mit "Format-Table" eine schöne Tabelle liefern oder mit "Format-List" eben eine Aufzählung, die aber "untereinander" steht. Gerade beim Thema Empfangsconnectoren finde ich das unschön.

Normale Ausgaben

Damit es deutlicher wird, habe ich hier mal eine einfache Ausgabe von Get-Process generiert:

PS C:\group\Technik\Skripte> Get-Process iex* | ft id,name,handles,cpu -AutoSize

   Id Name     Handles         CPU
   -- ----     -------         ---
 3048 iexplore     897 165,3922602
12128 iexplore    1011 233,0186937
13428 iexplore    1220 976,3478586
22064 iexplore    1019 301,9243354
22596 iexplore     813 225,2498439

Sie sehen, schön jeden Prozess als Zeile und die Properties als Spalte. ich würde mir aber auch eine Ausgabe wünschen, bei der Spalte und Zeile gerade vertauscht sind. Also die Ausgabe wie folgt aussieht.

ID     3048          12128        
----   ------------- ----------   
Name   iexplore      iexplore     
Handles 897          1011         
CPU     165,3922602  233,0186937  

Prozesse sind nun nicht gerade das beste Beispiel aber dies können Sie auf jedem PC mit PowerShell einfach nachvollziehen. Interessanter wird das natürlich wenn Sie z.B. zwei Exchange Receive Connectoren vergleichen wollen oder Lync Konferenzrichtlinien etc. Dann ist es schon sinnvoll die Menge an Properties nicht als Spalten in einer Zeile sondern als eigene Zeilen auszugeben und die Objekte dahinter als eigene Spalten.

Funktion

Ich habe keine Funktion in PowerShell gefunden, die genau so ein "Swap" der Felder durchführt. Aber so schwer ist das gar nicht, diese Transformation vorzunehmen. Idealerweise nutze ich einfach die Pipeline dazu und als einzigen Parameter den Namen des Feldes in dem die Spaltenüberschriften stehen.

Diese Transformation mit Ausgabe auf dem Bildschirm macht natürlich nur Sinn, wenn die Anzahl der Objekte gering ist und damit die Anzahl der Spalten überschaubar bleibt. Filtern Sie daher vorher die Menge der Eingabeobjekte.

Get-Process iex* | swap-table id | ft

Das PowerShell Skript bekommt per Pipeline alle vorgefilterten Objekte mit allen Properties und Filtert selbst dann auf Properties vom Typ "Property" oder "NoteProperty". Methoden eines Objekts werden also nicht weiter betrachtet.

Ausgabe

Exemplarisch habe ich dann hier einfach die Ausgabe von Get-process aller "ConHost"-Prozesse erstellt.

PS > Get-Process con* | select pro*,peak*| .\swap-table2.ps1 | ft -AutoSize
0                       1        2
-                       -        -

PeakPagedMemorySize     1216512  2027520
PeakPagedMemorySize64   1216512  2027520
PeakVirtualMemorySize   26873856 78299136
PeakVirtualMemorySize64 26873856 78299136
PeakWorkingSet          2940928  6078464
PeakWorkingSet64        2940928  6078464
ProcessName             conhost  conhost
ProcessorAffinity                15
Product                          Betriebssystem Microsoft® Windows®
ProductVersion                   6.1.7600.16385

Natürlich lässt sich die Ausgabe auch mit einem "convertto-html | out-file" in eine HTML-Datei schreiben.

Genauso einfach kann die Ausgabe mit (Export-CSV) auch als CSV-Datei für weitere Verarbeitungen exportiert werden.

Code

Der Code ist sehr übersichtlich und sicher nicht besonders schön geschrieben aber er ist bislang meinen Anforderungen gerecht geworden. Er Enthält keine großen Fehlerabsicherungen. Eventuell müssen Sie daher etwas nachbessern, wenn ihre Daten damit nicht gedreht werden können.

swap-table.1.0.ps1

Sie können das kleine Skript einfach in ein Verzeichnis kopieren und dann direkt über die Pipeline einbinden. Wer mag kann den gesamten Code natürlich auch in eine Funktion oder ein Modul einbinden und so vorhalten.

Weiterentwicklung

Aktuell habe ich keine Weiterentwicklung geplant.

Weitere Links