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.
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
- PowerShell
- PS Pipeline
- Verwenden des Cmdlet "Compare-Object"
http://technet.microsoft.com/de-de/library/ee156812.aspx - COMPARING LYNC POLICIES – OR
HOW TO FLIP JUST ABOUT ANY ARRAY
OF HASHTABLES IN PowerShell
http://mandie.net/2014/09/10/comparing-lync-policies-or-how-to-flip-just-about-any-array-of-hashtables-in-PowerShell/