none
Inhalt einer Spalte in einer Tabelle ändern RRS feed

  • Frage

  • Guten Tag,

    ich bin noch ein Anfänger, was das scripten mit PS angeht, habe jedoch nach langem Suchen nichts gefunden, dass mir bei meinem Anliegen helfen kann.

    Situation:

    Ich pipe Informationen zu einer Format-Table Anweisung, welche ich mit "-Property" einschränke. Am Ende werden mir also in der Tabelle 8 verschiedene Spalten angezeigt.

    Problem:

    Die Informationen einer bestimmten Zeile sind wichtig, jedoch werden sie sehr unübersichtlich angezeigt. Beispiel: 

    Identity

    domain.local/xx_users/Max Mustermann/blabla/blublub

    Nun möchte ich im Idealfall in dieser Spalte nur "Max Mustermann" stehen haben.

    Gibt es also eine Möglichkeit die Informationen einer formatierten Tabelle zu ändern?

    Freue mich über jegliche Hilfe,

    Gruß,

    Tizian

    Montag, 12. Oktober 2015 08:07

Antworten

  • Ich würde mir den Benutzer für das entsprechende Gerät direkt aus der UserList schnappen, dann brauche ich nichts mit Split oder Regex basteln. Mit den verschiedenen Informationen wird dann ein Custom Objekt erzeugt. Anbei mal ein kurzes Beispiel

    $UserList = Get-CASMailbox -Filter {hasactivesyncdevicepartnership -eq $true -and -not displayname -like "CAS_{*"} | Get-Mailbox
    
    Foreach ($User in $UserList) {
        $Device = Get-MobileDeviceStatistics -Mailbox $User
        New-Object psobject -Property @{DeviceID=$Device.DeviceID; Alias=$User.Alias}
    }

    Das Ergebnis daraus kann man dann z. B. an ein Out-File pipen um es in eine Textdatei zu schreiben, bzw. zum Import in z. B. Excel über ConvertTo-CSV vorher noch in ein CSV Format umwandeln.

    Gruß,

    Olaf

    Dienstag, 13. Oktober 2015 10:00
  • Ich meinte die verschachtelt Variante du musst beim Custom Objekt dann aber auch das aktuelle Gerät verwenden, z. B. $DeviceID.Status anstatt $Device.Status. In der Variable $Device sind ja alle Geräte des Benutzers drin, in der jeweiligen $DeviceID Variable sollte immer nur ein Gerät enthalten sein.

    Gruß,

    Olaf

    Dienstag, 13. Oktober 2015 19:42

Alle Antworten

  • Hallo Tizian,

    zunächst empfehle ich statt Format-Table lieber Out-Gridview. Dort bekommst du die Ausgabe in einer Excel-artigen Umgebung präsentiert und hast Filter- und Sortierfunktionen.

    Falls dein "Max Mustermann" immer an der gleichen Stelle steht, kannst du am "/" splitten. Vom entstandenen Array wählst du dann die n.te -Position aus, bei deinem Beispiel wäre n = 2.

    ($String -split "/")[2]

    Wenn du es für alle Objekte in einem Array (Zeilen in deiner Tabelle) machen möchtest, solltest du vorher mit Add-Member ein neues Datenfeld anlegen und dieses über eine foreach-Schleife füllen.

    Darüber hinaus solltest du dich mit PowerShell-Grundlagen beschäftigen.

    Montag, 12. Oktober 2015 09:53
  • Hi,

    alternativ zum Split könnte man auch immer mit Regex arbeiten, was jedoch in diesem Beispiel zuviel des Guten wäre. 

    Außerdem ist es auch immer ganz gut, den eigenen Code mal mit zu posten. Ggf. können wir dir da direkt Hilfe geben und mittels anderer Wege die Tabelle direkt sauber ausgeben lassen, sodass du nicht nacharbeiten musst.


    Greetings,

    David das Neves

    Technology Specialist - Consulting Services
    Computacenter AG & Co. oHG - München

    Blog    

    Caution: This post may contain errors.

    Montag, 12. Oktober 2015 11:37
  • Hallo Tizian,

    zunächst empfehle ich statt Format-Table lieber Out-Gridview. Dort bekommst du die Ausgabe in einer Excel-artigen Umgebung präsentiert und hast Filter- und Sortierfunktionen.

    Falls dein "Max Mustermann" immer an der gleichen Stelle steht, kannst du am "/" splitten. Vom entstandenen Array wählst du dann die n.te -Position aus, bei deinem Beispiel wäre n = 2.

    ($String -split "/")[2]

    Wenn du es für alle Objekte in einem Array (Zeilen in deiner Tabelle) machen möchtest, solltest du vorher mit Add-Member ein neues Datenfeld anlegen und dieses über eine foreach-Schleife füllen.

    Darüber hinaus solltest du dich mit PowerShell-Grundlagen beschäftigen.

    Hi, danke für deine Antwort.

    Leider habe ich es nicht geschafft die Split-Funktion in mein Script mit einzubauen. Out-Gridview hilft mir in meinem Fall leider auch nicht weiter. Die erstellte Tabelle soll später in eine Datei geschrieben werden, welche per Mail an die IT weitergeleitet wird.

    Montag, 12. Oktober 2015 12:57
  • Hi,

    alternativ zum Split könnte man auch immer mit Regex arbeiten, was jedoch in diesem Beispiel zuviel des Guten wäre. 

    Außerdem ist es auch immer ganz gut, den eigenen Code mal mit zu posten. Ggf. können wir dir da direkt Hilfe geben und mittels anderer Wege die Tabelle direkt sauber ausgeben lassen, sodass du nicht nacharbeiten musst.


    Greetings,

    David das Neves

    Technology Specialist - Consulting Services
    Computacenter AG & Co. oHG - München


    Caution: This post may contain errors.

    Hi, danke für deine Hilfe.

    Hier mal mein bisheriges Skript: (größten Teils aus technet rauskopiert)

    Vielleicht anzumerken ist, dass ich auf der Exchange Management Shell arbeite.

    $UserList = Get-CASMailbox -Filter {hasactivesyncdevicepartnership -eq $true -and -not displayname -like "CAS_{*"} | Get-Mailbox
    
    $UserList | foreach { Get-MobileDeviceStatistics -Mailbox $_} | Format-Table -Property DeviceID, Devicemodel, DeviceOS, Status, DeviceAccessState, FirstsyncTime, LastSucces
    sSync, Identity -autosize

    Der Output sie ca. so aus:

    LastSuccessSync     Identity
    ---------------     --------
    11.10.2015 11:07:35 domain.local/11_Users/Max Mustermann/Exchan...
    10.10.2015 11:18:24 domain.local/11_Users/Peter Lustig/Exchan...


    Natürlich mit mehr Spalten und mehr Inhalt (wegen Platzmangel eingegrenzt)

    Der springende Punkt ist diese "Identity"-Spalte, in welcher ich gerne den Text cutten/splitten/bearbeiten möchte.

    Hoffe ihr könnt mir nochmal weiterhelfen :)

    Gruß,

    Tizian


    • Bearbeitet Tizian121 Montag, 12. Oktober 2015 13:16
    Montag, 12. Oktober 2015 13:13
  • Du hast nicht geschrieben, dass es in eine Datei ausgeleitet werden soll. Dann ist Format-Table überhaupt nicht sinnvoll, da das Cmdlet (nur) für die Ausgabe in der Console gedacht ist.

    Für die Ausgabe in eine Datei nimmst du Export-Csv.

    Du hast leider nicht geschrieben, wie deine Variable heißt oder wie die Eigenschaft heißt, die du verändern willst.

    Montag, 12. Oktober 2015 13:20
  • wenn ich diesen Output weiterpipe oder erst in einer Variablen speicher ($a) und diese dann in eine Datei speicher ($a >> test.txt), habe ich genau das Ergebnis, das ich haben möchte. Nur eben das mir der Inhalt der einen Spalte nicht passt.
    Montag, 12. Oktober 2015 13:33
  • Dann nehmen wir an, deine Spalte heißt Spalte1. Du musst dann den Namen ändern. Dann fügst du in deine Pipeline folgendes ein:

    ... | foreach{$_.Spalte1 = ($_.Spalte1 -split "/")[2]} | ... | Format-Table ...
    Trotzdem ist Format-Table mit Output über ">>" ganz schlechter Stil. 
    Montag, 12. Oktober 2015 14:01
  • Ich nehme mal an meine Spalte heist standardmäßig "Identity", denn Namen für die Spalten habe ich nicht vergeben (wüsste auch nicht wie).

    Habe versucht deinen Vorschlag umzusetzen:

    [PS] C:\Windows\system32>$a=$UserList | foreach { Get-MobileDeviceStatistics -Mailbox $_}| foreach{$_.Identity =($_.Identity -split "/")[2]} | Format-Table -Property DeviceID, Devicemodel, DeviceOS, S
    tatus, DeviceAccessState, FirstsyncTime, LastSuccessSync, Identity -autosize

    Jedoch bekomme ich leider folgende Fehlermeldung:

    foreach : Exception setting "Identity": "Cannot convert the "Max Mustermann" value of type "System.String" to type "Microsoft.Exchange.Data.ObjectId"."
    At line:1 char:67

    Was genau das zu bedeuten hat, weiß ich nicht.

    Habe herausgefunden, dass $userlist.Name eine Liste von allen betroffenen Mitarbeitern ausgibt. Kann ich die irgendwie in die Tabelle integrieren? Oder gibt es vlt. einen komplett anderen Ansatz mein Problem zu lösen?

    Montag, 12. Oktober 2015 14:14
  • Also, dann ganz von vorne. PowerShell besteht nicht aus Tabellen, sondern aus Objekten mit beliebig vielen Dimensionen bzw. Eigenschaften. Das sind deine Spalten. Jede Eigenschaft hat zwingend einen Namen. Diese kann man mit dem Cmdlet Get-Member abfragen. Außerdem steht er in deiner mit Format-Table erzeugten Tabelle ganz oben im Kopf.

    Ich glaube, deine Fragestellung ist für deinen momentanen Lernfortschritt zu weitführend. Du musst dich zwangsläufig mit den Grundlagen befassen, sonst wird das nichts.

    Dienstag, 13. Oktober 2015 05:45
  • Habe mein Skript nun erstellt, ohne diese eine Spalte zu kürzen. Schaut zwar nicht sehr übersichtlich aus, den Zweck erfüllt es jedoch.

    Danke für die angebotene Hilfe.

    Gruß,

    Tizian

    • Bearbeitet Tizian121 Dienstag, 13. Oktober 2015 09:51
    Dienstag, 13. Oktober 2015 09:51
  • Ich würde mir den Benutzer für das entsprechende Gerät direkt aus der UserList schnappen, dann brauche ich nichts mit Split oder Regex basteln. Mit den verschiedenen Informationen wird dann ein Custom Objekt erzeugt. Anbei mal ein kurzes Beispiel

    $UserList = Get-CASMailbox -Filter {hasactivesyncdevicepartnership -eq $true -and -not displayname -like "CAS_{*"} | Get-Mailbox
    
    Foreach ($User in $UserList) {
        $Device = Get-MobileDeviceStatistics -Mailbox $User
        New-Object psobject -Property @{DeviceID=$Device.DeviceID; Alias=$User.Alias}
    }

    Das Ergebnis daraus kann man dann z. B. an ein Out-File pipen um es in eine Textdatei zu schreiben, bzw. zum Import in z. B. Excel über ConvertTo-CSV vorher noch in ein CSV Format umwandeln.

    Gruß,

    Olaf

    Dienstag, 13. Oktober 2015 10:00
  • Hallo Olaf,

    Danke für deine Antwort. Das geht geht genau in die Richtung, die ich mir vorgestellt habe :)

    Damit könnte ich mir nun eine Tabelle erzeugen, in der der Name korrekt dargestellt wird.

    Leider ergeben sich dadurch neue Probleme. Manche User haben mehrere Devices. Das stellt sich in der Tabelle schlecht dar:

    Alias                                              DeviceOS
    ----                                              --------
    Max Mustermann                                 {iOS 9.x.x blub2, iOS 9.x.x Blabla...

    Gibt es ne Möglichkeit anstatt jeden User durchzugehen, jedes Gerät in $Userlist durchzugehen und dann in der Tabelle den $Device.Alias anzugeben? Dann müsste ich andere Informationen in die $Userlist laden oder?

    Außerdem, wenn ich mehr als 3 Properties hinzufüge, kann PS die Eigenschaften nicht mehr nebeneinander anzeigen, sonder stellt auf ein anderes Format um, und schreibt untereinander. Gibt es hier auch eine Möglichkeit sowas wie "-autosize" einzubauen?

    Trotzdem schon mal Danke für die Hilfe! Mein Ausbilder wäre auch schon mit meiner derzeitigen Lösung zufrieden. Schöner wärs natürlich, wenn ich den Namen besser anzeigen könnte und auch mich selbst würde es in PS ein bisschen weiterbringen :)

    Gruß,

    Tizian




    • Bearbeitet Tizian121 Dienstag, 13. Oktober 2015 11:21
    Dienstag, 13. Oktober 2015 11:15
  • Ohne es jetzt getestet zu haben, würde ich darauf tippen, das du es mit einer zweiten Schleife umgehen kannst, mit der du die Variable $Device durchgehst und erst in dieser das Custom Objekt baust.

    Bzgl. der Anzeige kannst du es natürlich auch an Filter-Table (ft) mit Parameter -AutoSize pipen um es in Tabellenform zu forcieren.

    Gruß,

    Olaf

    Dienstag, 13. Oktober 2015 13:46
  • Meinst du mit 2 ineinander verschachtelten Schleifen oder mit 2 aufeinanderfolgenden Schleifen?

    Habe es mit beiden Möglichkeiten einmal probiert:

    Verschachtelt:

    $a=Foreach ($User in $UserList) {
        $Device = Get-MobileDeviceStatistics -Mailbox $User
    	Foreach($DeviceID in $Device){
    		New-Object psobject -Property @{DeviceID=$Device.DeviceID;DeviceOS=$Device.DeviceOS;Status=$Device.Status;Status2=$Device.Status; Name=$User.Name}
    	}
    } 
    $a | ft -autosize

    Ergebnis: Wieder mehrere Einträge in einer Zeile ( wie in meinem Letzten Post beschrieben)

    Hintereinander:

    Foreach ($User in $UserList) {
        $Device = Get-MobileDeviceStatistics -Mailbox $User
    } 
    
    Foreach($DeviceID in $Device){
    	New-Object psobject -Property @{DeviceID=$Device.DeviceID;DeviceOS=$Device.DeviceOS;Status=$Device.Status;Status2=$Device.Status; Name=$User.Name}
    }
    Ergebnis: In der ersten Schleife wird $Device immer überschreiben und hat am Ende nur 1 Objekt drinnen stehen -> nur eine Zeile in der Tabelle

    Wäre cool wenn wir das noch hinbekommen, wenn es zu aufwendig wird, wäre es auch kein Beinbruch. :-)


    • Bearbeitet Tizian121 Dienstag, 13. Oktober 2015 14:50
    Dienstag, 13. Oktober 2015 14:49
  • Ich meinte die verschachtelt Variante du musst beim Custom Objekt dann aber auch das aktuelle Gerät verwenden, z. B. $DeviceID.Status anstatt $Device.Status. In der Variable $Device sind ja alle Geräte des Benutzers drin, in der jeweiligen $DeviceID Variable sollte immer nur ein Gerät enthalten sein.

    Gruß,

    Olaf

    Dienstag, 13. Oktober 2015 19:42
  • Hi Olaf,

    "$DeviceID anstatt $Device" genau da war mein Denkfehler (der auch eigentlich nicht sein muss <.<), danke. Nun funktioniert es wunderbar. In jeder Spalte steht immer nur ein Wert und Benutzer wird jetzt wie gewünscht dargestellt.

    Hier der fertige Code:

    $UserList = Get-CASMailbox -Filter {hasactivesyncdevicepartnership -eq $true -and -not displayname -like "CAS_{*"} | Get-Mailbox
    
    $a=Foreach ($User in $UserList) {
        $Device = Get-MobileDeviceStatistics -Mailbox $User
    	Foreach($DeviceID in $Device){
    		New-Object psobject -Property @{DeviceID=$DeviceID.DeviceID;DeviceOS=$DeviceID.DeviceOS;DeviceModel=$DeviceID.DeviceModel;Status=$DeviceID.Status; Name=$User.Name;AccState=$DeviceID.DeviceAccessState;LastSucSync=$DeviceID.LastSuccessSync;FirstSync=$DeviceID.FirstSyncTime;}
    	}
    } 
    
    $a | ft -property DeviceID, Deviceos, DeviceModel, Status, AccState, Name, LastSucSync, FirstSync -autosize

    Danke nochmal Olaf. Du hast mir sehr geholfen.

    Gruß,

    Tizian


    • Bearbeitet Tizian121 Mittwoch, 14. Oktober 2015 07:37
    Mittwoch, 14. Oktober 2015 07:32
  • Bitte markiere noch die Antworten.

    Blog: http://bytecookie.wordpress.com

    Kostenloser Powershell Snippet Manager v4: Link ! Neue Version !
    (Schneller, besser + komfortabler scripten.)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.

    Donnerstag, 15. Oktober 2015 13:46
    Moderator