none
Powershell GUI Button Klick dann Aktion RRS feed

  • Frage

  • Hallo liebe Foren Gemeinde

    Ich habe ein schwerliegendes problem und komme nicht mehr weiter. Ich bin ein totaler Anfänger was Powershell betrifft!

    Was ich brauche? 

    Ich muss ein GUI erstellen mittels Powershell, unsere Idee war ein GUI zu erstellen für die auslesung der CPU auslaustung usw. Doch wir kommen leider nicht mehr weiter, da wir nichts wissen was wir beim Button click, eine aktion starten können. Ich brauche von euch nur ein Beispiel wo zeigt wie man das anwenden kann.

    Als beispiel:

    Wenn ich auf CPU Button klicke sollte ich die CPU Auslastung direkt im GUI angezeigt bekommen.

    Was wir bisher haben:


    Add-Type -AssemblyName System.Windows.Forms




    ###### Variabeln der Buttons


    $Prozessor = dini muetter




    ##### GUI selber

    $Form = New-Object system.Windows.Forms.Form


    $Form.Text = "PC-Infos"

    $Form.TopMost = $true

    $Form.Width = 612

    $Form.Height = 418



    ###### Textfeld

     $listView1 = New-Object system.windows.Forms.ListView


    $listView1.Text = "listView"

    $listView1.Width = 398

    $listView1.Height = 167

    $listView1.location = new-object system.drawing.point(74,184)

    $Form.controls.Add($listView1)





    #### Computer Button

     $button1 = New-Object system.windows.Forms.Button


    $button1.Text = "Computer"

    $button1.Width = 147

    $button1.Height = 32

    $button1.location = new-object system.drawing.point(75,44)

    $button1.Font = "Microsoft Sans Serif,10"

    $Form.controls.Add($button1)




    ####### Festplatte Button


     $button2 = New-Object system.windows.Forms.Button


    $button2.Text = "Festplatte"

    $button2.Width = 147

    $button2.Height = 32

    $button2.location = new-object system.drawing.point(314,44)

    $button2.Font = "Microsoft Sans Serif,10"

    $Form.controls.Add($button2)


            
            
    ###### Graphics Button
            
     $button3 = New-Object system.windows.Forms.Button


    $button3.Text = "Graphics"

    $button3.Width = 147

    $button3.Height = 32

    $button3.location = new-object system.drawing.point(75,94)

    $button3.Font = "Microsoft Sans Serif,10"

    $Form.controls.Add($button3)


     


     
       

    ###### Prozessor Button

    $button4 = New-Object system.windows.Forms.Button


    $button4.Text = "Prozessor"

    $button4.Width = 147

    $button4.Height = 32

    $button4.location = new-object system.drawing.point(313,93)

    $button4.Font = "Microsoft Sans Serif,10"

    $Form.controls.Add($button4)















    #### damit das GUI angezeigt wird.
     [void]$Form.ShowDialog()

     $Form.Dispose()
     
     
     
     
     
     

    Montag, 18. Dezember 2017 08:53

Antworten

  • Dem kann ich mich anschliessen. GUI-Applikationen sind für das Lernen von Powershell ungeeignet, da sie verschiedenste Strukturen in sich vereinen. Klar ist es lustig, wenn man ein GUI zusammenbasteln kann. Um den Zweck/Sinn von Powershell zu verstehen, gibt es aber sicherlich bessere Mittel und Wege. 

    Falls dein Lehrer unbedingt bei dem Auftrag bleiben will, kann ich dir ein paar Tipps geben. 

    Mittels Add_Click kannst du einem Button eine Aufgabe geben, was er beim Klick darauf machen soll.

    $button4.Add_Click({
        Write-Host $true
    })

    Obiger Codeblock schreibt beim Klick auf den "Prozessor"-Button "True" in die Kommandozeile. Spielt keine Rolle ob ISE oder normale Powershell. 

    CPU-Informationen erhältst du mittels 

    Get-WmiObject win32_processor
    Falls es die CPU-Auslastung sein soll, geht das entweder über LoadPercentage oder alternativ über Get-Counter. Ein Beispiel: 
    Get-Counter -computername "localhost" '\Processor(*)\% Processor Time'

    Finde ich persönlich aber doch recht happig, vor allem für Anfänger. 

    • Als Antwort markiert secure127001 Dienstag, 19. Dezember 2017 06:29
    Montag, 18. Dezember 2017 09:45
  • Bei ListView kannst du verschiedene Spalten in der Box darstellen. Wenn du bei deinem Skript folgende Zeilen hinzufügst, erhältst du eine Spalte "Usage" mit Titel in der ListView. 

    $listView1.View = "Details"
    $listView1.Columns.Add("Usage")

    Möchtest du dann Werte an diese Spalte hinzufügen, so kannst du unter dem Add_Click-Event folgende Zeile hinzufügen: 

    $listView1.Items.AddRange("<Irgendetwas>")

    Wenn du mehrere Spalten hast, musst du mehrere von den $listview1.columns.add machen, jeweils mit den verschiedenen Spaltennamen. Möchtest du sie dann hinzufügen, musst du mit SubItems arbeiten. Folgendes Skript von hier gibt dazu einen sehr guten Einblick. 

    # Create the form
    $sampleForm = New-Object System.Windows.Forms.Form
    $sampleForm.Width = 300
    $sampleForm.Height = 300
    # Create three ListViewItems
    $item1 = New-Object System.Windows.Forms.ListViewItem('Item 1')
    $item1.SubItems.Add('John')
    $item1.SubItems.Add('Smith')
    $item2 = New-Object System.Windows.Forms.ListViewItem('Item 2')
    $item2.SubItems.Add('Jane')
    $item2.SubItems.Add('Doe')
    $item3 = New-Object System.Windows.Forms.ListViewItem('Item 3')
    $item3.SubItems.Add('Uros')
    $item3.SubItems.Add('Calakovic')
    
    # Create a ListView, set the view to 'Details' and add columns
    $listView = New-Object System.Windows.Forms.ListView
    $listView.View = 'Details'
    $listView.Width = 300
    $listView.Height = 300
    $listView.Columns.Add('Item')
    $listView.Columns.Add('First Name')
    $listView.Columns.Add('Last Name')
    # Add items to the ListView
    $listView.Items.AddRange(($item1, $item2, $item3))
    
    # Add the ListView to the form and show the form
    $sampleForm.Controls.Add($listView)
    [void] $sampleForm.ShowDialog()

    • Als Antwort markiert secure127001 Dienstag, 19. Dezember 2017 06:29
    Montag, 18. Dezember 2017 10:35
  • Etwas Google sollte doch schon möglich sein? 

    Alternativ kannst du in der ISE auch die verschiedenen Optionen ansehen, die die Powershell bietet. 

    Zu deiner Frage: 

    $listView1.Items.Clear()

    Das hier sollte es tun. 

    • Als Antwort markiert secure127001 Dienstag, 19. Dezember 2017 06:29
    Montag, 18. Dezember 2017 11:59
  • Das liegt am Typ. Am besten kannst du das anschauen, wenn du die WMI-Query in eine Variable speicherst und den Typ dann anschaust. 

    $a = Get-WmiObject win32_processor
    $a.GetType()

    Ergibt als Typ "System.Management.ManagementBaseObject". Erwartet wird allerdings ein "System.Windows.Forms.ListViewItem". Entweder änderst du den Output von Get-WmiObject so ab, dass er als String interpretiert werden kann, oder du machst eine Aufteilung (z.B. mit $a.xxxx) und gibst das dann als String an das ListViewItem mit. 

    Beispiel: 

    $a = Get-WmiObject win32_Processor | Out-String

    oder alternativ mit 

    [string]$a = (Get-WmiObject win32_Processor).Name

    Das oben sind beides nur Beispiele. Was du genau brauchst, weiss ich nicht. Das musst du allerdings auch selber rausfinden ;-) 
    Ich hoffe doch, dass es dir wenigstens etwas geholfen hat. Wenn ja, markiere die "beste" Antwort für dich doch auch als Antwort des Threads. 

    • Als Antwort markiert secure127001 Dienstag, 19. Dezember 2017 06:29
    Montag, 18. Dezember 2017 14:42
  • Mit SubItems meine ich deine $1 - $6. Die hast du soweit richtig, aber du definierst die Variable $Item1 überhaupt nicht als ListViewItem. Ohne dies wird es nicht richtig interpretiert von der Powershell. 

    Richtig: 

    $Item1 = New-Object System.Windows.Forms.ListViewItem($1)
    $Item1.SubItems.Add($2)
    etc. etc. 

    Ausserdem hast du wieder nicht die Columns vor dem Hinzufügen der Range gemacht. Wie soll man etwas an einen Ort hintun können, der noch nicht existiert? 

    $listView1.Columns.Add("<Caption>")
    $listView1.Columns.Add("<DeviceID>")
    etc. 
    
    $1 = (Get-WmiObject win32_processor).Caption
    $2 = (Get-WmiObject win32_processor).DeviceID
    etc. 
    
    $Item1 = New-Object System.Windows.Forms.ListViewItem($1)
    $Item1.SubItems.Add($2)
    etc...
    
    $listView1.Items.AddRange(($Item1))

    So müsste deines aussehen. Ich habe das gerade bei mir getestet und es funktioniert. 
    In Excel erstellst du ja auch nicht erst die Zellinhalte und dann erst die Spalten, oder? ;-)

    Edit: Noch ein kleines Bild, wie es bei mir aussieht, wenn ich auf den Prozessor-Knopf drücke. 

    • Bearbeitet Fahiko Dienstag, 19. Dezember 2017 16:47
    • Als Antwort markiert secure127001 Mittwoch, 20. Dezember 2017 06:45
    Dienstag, 19. Dezember 2017 16:46

Alle Antworten

  • .... Ich bin ein totaler Anfänger was Powershell betrifft!

    Ich muss ein GUI erstellen mittels Powershell,  .....

    Auch auf die Gefahr hin als Nörgler oder Bremser da zu stehen. Für die Erstellung von GUI's ist die Powershell primär nicht gedacht. Und wenn man schon Anfänger ist, sollte man da nicht erst mal mit etwas Einfacherem anfangen? Wie wär's mit den Grundlagen von Powershell?  ;-)

    Get Started with Microsoft PowerShell

    Wenn man das Gewünschte in der Konsole hinbekommt, kann man ja dann um eine Oberfläche erweitern.

    ... und nur aus Neugier: Wozu soll das Ganze gut sein? Genügen die Windows-Bordmittel dafür nicht?

    Zum Schluss noch eine Bitte: Wenn Du hier Code postest, formatier den doch bitte als auch als Code. So werden ungewollte Zeilenumbrüche vermieden und der Code ist leichter zu lesen und zu kopieren und so.


    Best regards,

    (79,108,97,102|%{[char]$_})-join''

    Montag, 18. Dezember 2017 09:10
  • Das ist ein Schulauftrag und wie gesagt komme leider nicht weiter, leider habe ich auch kaum Zeit die Grundlagen anzuschauen muss es bis Donenrstag abgeben und Präsentiert haben.

    Es tut mir leid für die schlechte Darstellung des Codes, nächstes mal formatiere ich es auch als Code.

    Montag, 18. Dezember 2017 09:16
  • Das ist ein Schulauftrag ...

    Du solltest meiner Meinung nach dringend mit Deinem Lehrer darüber sprechen. Du darfst mich auch gern zitieren. Natürlich kann man einen Wohnungsumzug mit einem Handwagen machen, aber das ist unnötig umständlich und aufwändig - dafür ist er nicht gemacht. So ist es meiner Meinung nach auch mit Powershell und GUIs.

    Best regards,

    (79,108,97,102|%{[char]$_})-join''

    Montag, 18. Dezember 2017 09:29
  • Natürlich habe ich dies auch am Lehrer mitgeteilt, dass Powershell nicht dafür geeignet ist. Ich wollte es zuerst mit Python programmieren. 
    Montag, 18. Dezember 2017 09:44
  • Dem kann ich mich anschliessen. GUI-Applikationen sind für das Lernen von Powershell ungeeignet, da sie verschiedenste Strukturen in sich vereinen. Klar ist es lustig, wenn man ein GUI zusammenbasteln kann. Um den Zweck/Sinn von Powershell zu verstehen, gibt es aber sicherlich bessere Mittel und Wege. 

    Falls dein Lehrer unbedingt bei dem Auftrag bleiben will, kann ich dir ein paar Tipps geben. 

    Mittels Add_Click kannst du einem Button eine Aufgabe geben, was er beim Klick darauf machen soll.

    $button4.Add_Click({
        Write-Host $true
    })

    Obiger Codeblock schreibt beim Klick auf den "Prozessor"-Button "True" in die Kommandozeile. Spielt keine Rolle ob ISE oder normale Powershell. 

    CPU-Informationen erhältst du mittels 

    Get-WmiObject win32_processor
    Falls es die CPU-Auslastung sein soll, geht das entweder über LoadPercentage oder alternativ über Get-Counter. Ein Beispiel: 
    Get-Counter -computername "localhost" '\Processor(*)\% Processor Time'

    Finde ich persönlich aber doch recht happig, vor allem für Anfänger. 

    • Als Antwort markiert secure127001 Dienstag, 19. Dezember 2017 06:29
    Montag, 18. Dezember 2017 09:45
  • Vielen Dank für das Beispiel wird mir bestimmt helfen!

    Wie kann ich aber jetzt die Informationen von "Get-WmiObject win32_processor" im GUI anzeigen lassen?

    Ich will dass die Informationen in einem Textfeld, dass ich im GUI erstellt habe dort angezeigt wird.


    Montag, 18. Dezember 2017 09:56
  • Bei ListView kannst du verschiedene Spalten in der Box darstellen. Wenn du bei deinem Skript folgende Zeilen hinzufügst, erhältst du eine Spalte "Usage" mit Titel in der ListView. 

    $listView1.View = "Details"
    $listView1.Columns.Add("Usage")

    Möchtest du dann Werte an diese Spalte hinzufügen, so kannst du unter dem Add_Click-Event folgende Zeile hinzufügen: 

    $listView1.Items.AddRange("<Irgendetwas>")

    Wenn du mehrere Spalten hast, musst du mehrere von den $listview1.columns.add machen, jeweils mit den verschiedenen Spaltennamen. Möchtest du sie dann hinzufügen, musst du mit SubItems arbeiten. Folgendes Skript von hier gibt dazu einen sehr guten Einblick. 

    # Create the form
    $sampleForm = New-Object System.Windows.Forms.Form
    $sampleForm.Width = 300
    $sampleForm.Height = 300
    # Create three ListViewItems
    $item1 = New-Object System.Windows.Forms.ListViewItem('Item 1')
    $item1.SubItems.Add('John')
    $item1.SubItems.Add('Smith')
    $item2 = New-Object System.Windows.Forms.ListViewItem('Item 2')
    $item2.SubItems.Add('Jane')
    $item2.SubItems.Add('Doe')
    $item3 = New-Object System.Windows.Forms.ListViewItem('Item 3')
    $item3.SubItems.Add('Uros')
    $item3.SubItems.Add('Calakovic')
    
    # Create a ListView, set the view to 'Details' and add columns
    $listView = New-Object System.Windows.Forms.ListView
    $listView.View = 'Details'
    $listView.Width = 300
    $listView.Height = 300
    $listView.Columns.Add('Item')
    $listView.Columns.Add('First Name')
    $listView.Columns.Add('Last Name')
    # Add items to the ListView
    $listView.Items.AddRange(($item1, $item2, $item3))
    
    # Add the ListView to the form and show the form
    $sampleForm.Controls.Add($listView)
    [void] $sampleForm.ShowDialog()

    • Als Antwort markiert secure127001 Dienstag, 19. Dezember 2017 06:29
    Montag, 18. Dezember 2017 10:35
  • Vielen dank! Das hat bisher wundervoll geklappt.

    Wie kann ich jetzt die angezeigten inhalte im Textfeld wieder löschen...

    Als beispiel:

    GUI poppt auf, Prozessor Button auswählen infos werden im Textfeld angezeigt. Jetzt will man aber die Graffikkarte anschauen, wie soll ich das jetzt am besten lösen?

    Montag, 18. Dezember 2017 10:48
  • Etwas Google sollte doch schon möglich sein? 

    Alternativ kannst du in der ISE auch die verschiedenen Optionen ansehen, die die Powershell bietet. 

    Zu deiner Frage: 

    $listView1.Items.Clear()

    Das hier sollte es tun. 

    • Als Antwort markiert secure127001 Dienstag, 19. Dezember 2017 06:29
    Montag, 18. Dezember 2017 11:59
  • Vielen dank für die Rasche Antwort!

    Ich habe leider noch ein kleines problem. wenn ich "Get-WmiObject win32_processor" im Textfeld anzeigen will, zeigt es mir nicht das gleiche wie als würde ich es im Powershell Fenster selbst eingeben. Wo liegt hier das problem ich erhalte das:

    \\"computername"\root\cimv2:Win32_Processor.DeviceID="CPU0"

    anstelle von:


    DisplayIndex : 0
    Index        : 0
    ImageIndex   : -1
    ImageList    :
    ImageKey     :
    ListView     : System.Windows.Forms.ListView, Items.Count: 0
    Name         :
    Text         : Usage
    TextAlign    : Left
    Tag          :
    Width        : 60
    Site         :
    Container    :


    Montag, 18. Dezember 2017 14:27
  • Das liegt am Typ. Am besten kannst du das anschauen, wenn du die WMI-Query in eine Variable speicherst und den Typ dann anschaust. 

    $a = Get-WmiObject win32_processor
    $a.GetType()

    Ergibt als Typ "System.Management.ManagementBaseObject". Erwartet wird allerdings ein "System.Windows.Forms.ListViewItem". Entweder änderst du den Output von Get-WmiObject so ab, dass er als String interpretiert werden kann, oder du machst eine Aufteilung (z.B. mit $a.xxxx) und gibst das dann als String an das ListViewItem mit. 

    Beispiel: 

    $a = Get-WmiObject win32_Processor | Out-String

    oder alternativ mit 

    [string]$a = (Get-WmiObject win32_Processor).Name

    Das oben sind beides nur Beispiele. Was du genau brauchst, weiss ich nicht. Das musst du allerdings auch selber rausfinden ;-) 
    Ich hoffe doch, dass es dir wenigstens etwas geholfen hat. Wenn ja, markiere die "beste" Antwort für dich doch auch als Antwort des Threads. 

    • Als Antwort markiert secure127001 Dienstag, 19. Dezember 2017 06:29
    Montag, 18. Dezember 2017 14:42
  • Vielen dank hat wunderbar geklappt!

    Ich möchte mich noch Allgemein bedanken für die schnellen Antworten, durch deine Hilfe bin ich Heute schnell vorwärts gekommen.

    Montag, 18. Dezember 2017 15:19
  • .... und  trotzdem schaffst Du es nicht, Code als Code zu formatieren und Antworten, die Dir geholfen haben, auch als solche zu markieren.  :-/

    Google doch bitte mal Netiquette! ;-)


    Best regards,

    (79,108,97,102|%{[char]$_})-join''

    Montag, 18. Dezember 2017 15:53
  • Guten Morgen

    Gestern bin ich sehr weit gekommen, bin aber jetzt auf dieses problem gestossen mit den mehreren Kolonen. Ich habe das beispiel angesehen, auch von der Seite, die Sie als Link makriert haben. Komme leider trotzdem nicht ganz draus wie ich das umsetzten soll :/

    Dienstag, 19. Dezember 2017 06:43
  • Was möchtest du denn genau tun? Ein Praxisbeispiel kann hier helfen. Ansonsten rate ich hier nur ins Blaue hinein. ;-)
    Dienstag, 19. Dezember 2017 07:14
  • Also die Ausgabe die ich in der Textbox erhalte werden alle Inofrmationen in einer waagerechte Linie angezeigt.

     

    So will ich es erhalten:

    Get-WmiObject -class win32_Processor | Out-String

    Caption : Intel64 Family 6 Model 78 Stepping 3

    DeviceID : CPU0

    Manufacturer : GenuineIntel

    MaxClockSpeed : 2592

    Name : Intel(R) Core(TM) i7-6500U CPU @ 2.50GHz

    SocketDesignation : U3E1


    Erhalte aber bei der Ausgabe die Informationen in einer Linie.

    Dienstag, 19. Dezember 2017 08:06
  • Ich vermute mal, das liegt daran, dass du die Informationen alle in einem direkt in einer Variablen als ListViewItem mitgibst. 
    Es ist so: Die ListView besitzt mehrere Spalten. Damit die Prozessorinformationen (Caption, DeviceID etc) richtig in diesen Spalten angezeigt werden, musst du diese als ListViewItem hinzufügen. Beispiel: 

    $a = Get-Counter -computername "localhost" '\Processor(*)\% Processor Time'
    $Item1 = New-Object System.Windows.Forms.ListViewItem($a.CounterSamples[4].CookedValue.ToString())
    $b = (Get-WmiObject win32_processor).Name
    $Item1.SubItems.Add($b)
    $c = (Get-WmiObject win32_processor).DeviceID
    $Item1.SubItems.Add($c)
    $listView1.Items.AddRange(($Item1))

    Obiges Beispiel fügt zu drei Spalten (Usage, Name, ID) die dazugehörigen Werte hinzu. Diese Spalten wurden mit 

    $listView1.Columns.Add("<Name>")

    hinzugefügt. 
    Wenn du die Spalten entfernen möchtest, machst du das mittels der "Clear"-Funktion, die im ListView-Objekt aufgerufen werden kann. 

    Dienstag, 19. Dezember 2017 08:48
  • Ich habe das bis jetzt einmal studiert, komme aber trotdem nicht weiter :/ es funktioniert irgendwie nicht.

    als Ausgabe erhalte ich dann einfach <>

    Was mache ich wieder falsch? :/

    Dienstag, 19. Dezember 2017 09:35
  • Welcher Teil funktioniert denn nicht? Ohne Code kann ich nichts anfangen. 
    Poste mal den relevanten Code, ohne die GUI-Struktur. Nur das, was nicht funktioniert. 
    Dienstag, 19. Dezember 2017 09:46

  • #Prozessor#
    $Prozessor = Get-WmiObject -class win32_Processor | Out-String

    ########################Prozessor####################

    $button4.Add_Click({

    ### löscht die bisherigen informationen im Textfeld.

    $listView1.Items.Clear()   

    Write-Host $true       

    #### Hier können wir den inhalt vom Prozessor im Textfeld anzeigen lassen   

    $listView1.Items.AddRange("<$Prozessor>")})

    momentan habe ich es einmal so gelassen wie ich es hatte, aber wenn ich es halt genau so mache werden die Informationen in einer Linie dargestellt.

        
    Dienstag, 19. Dezember 2017 10:44
  • Wie schon gesagt. Du musst ListViewItems erstellen (siehe obiger Post von mir). 
    Die .AddRange(xxx) fügt eine neue Zeile hinzu. Diese Zeile besitzt mehrere "Zellen", wovon jede zuerst mittels .SubItems.Add hinzugefügt werden muss (auch obiges Beispiel). Ansonsten wird alles in einer Zelle in einer Zeile ausgegeben. 

    Und die <> erscheinen, weil du sie im String in .AddRange() drin hast. Die waren von mir eigentlich als Platzhalter gedacht, sodass es etwas einfacher zum Erkennen ist, was du dort reintun solltest. 

    Bitte benutz Google auch ein bisschen, denn der ist weitaus mächtiger als ich. Wenn notwendig auch auf Englisch. Und versuch die Powershell Basics zu lernen. Ansonsten rede ich hier an eine Wand und müsste dir dein Projekt vorkauen, damit es funktioniert. Das ist aber nicht das Ziel der Sache. Das Ziel ist, dass du dabei etwas lernst. Und das kannst du nicht tun, wenn du nicht verstehst was ich mache. 

    Falls du es anders machen willst, erstelle eine Textbox, formatier den anzuzeigenden Text so wie du möchtest und füge ihn dann hinzu. Die ListView ist ziemlich komplex. 

    Dienstag, 19. Dezember 2017 10:54
  • Ich habe ihr Kommentar zu herzen genommen und das ganze nochmals gut angeschaut. Bis jetzt ging alles, aber ich weiss immernoch nicht was beim .AddRange() reinkommt.

    Bis jetzt habe ich das...

    $1 = (Get-WmiObject win32_processor).Caption

    $2 = (Get-WmiObject win32_processor).DeviceID

    $3 = (Get-WmiObject win32_processor).Manufacturer

    $4 = (Get-WmiObject win32_processor).MaxClockSpeed

    $5 = (Get-WmiObject win32_processor).Name

    $6 = (Get-WmiObject win32_processor).SocketDesignation

    $Item1.SubItems.Add($1)

    $Item1.SubItems.Add($2)

    $Item1.SubItems.Add($3)

    $Item1.SubItems.Add($4)

    $Item1.SubItems.Add($5)

    $Item1.SubItems.Add($6)

    $listView1.Items.AddRange(($Item1))

    $listView1.Columns.Add("<Prozessor>")



    Dienstag, 19. Dezember 2017 14:23
  • Das Anzeige, was jetzt noch fehlt, sind verschiedene Spalten. Füge doch bitte mehrere der Spalten hinzu, und zwar bevor du die SubItems hinzufügst. Mache alle Spalten mit Namen, die du auch beim Prozessor auslesen bekommst (Spalte SocketDesignation, Name etc.). 

    Beispiel: 

    $ListView1.Columns.Add("Name")
    $ListView1.Columns.Add("MaxClockSpeed")
    $ListView1.Columns.Add("SocketDesignation")

    Zum Schluss dann noch die SubItems und fertig.
    Dienstag, 19. Dezember 2017 14:57
  • Ich habe es Jetzt verstanden wie das funktioniert, aber was meinst du mit SubItems?

    mein code sieht jetzt so aus, aber geht trotzdem nicht


    $1 = (Get-WmiObject win32_processor).Caption

    $2 = (Get-WmiObject win32_processor).DeviceID

    $3 = (Get-WmiObject win32_processor).Manufacturer

    $4 = (Get-WmiObject win32_processor).MaxClockSpeed

    $5 = (Get-WmiObject win32_processor).Name

    $6 = (Get-WmiObject win32_processor).SocketDesignation

    $Item1.SubItems.Add($1)

    $Item1.SubItems.Add($2)

    $Item1.SubItems.Add($3)

    $Item1.SubItems.Add($4)

    $Item1.SubItems.Add($5)

    $Item1.SubItems.Add($6)

    $listView1.Items.AddRange(($Item1))

    $listView1.Columns.Add("<Caption>")

    $listView1.Columns.Add("<DeviceID>")

    $listView1.Columns.Add("<Manufacturer>")

    $listView1.Columns.Add("<MaxClockSpeed>")

    $listView1.Columns.Add("<Name>")

    $listView1.Columns.Add("<SocketsDesignation>")


    Was fehlt noch und warum erhalte ich eine Fehlermeldung??

    Dienstag, 19. Dezember 2017 15:37
  • Mit SubItems meine ich deine $1 - $6. Die hast du soweit richtig, aber du definierst die Variable $Item1 überhaupt nicht als ListViewItem. Ohne dies wird es nicht richtig interpretiert von der Powershell. 

    Richtig: 

    $Item1 = New-Object System.Windows.Forms.ListViewItem($1)
    $Item1.SubItems.Add($2)
    etc. etc. 

    Ausserdem hast du wieder nicht die Columns vor dem Hinzufügen der Range gemacht. Wie soll man etwas an einen Ort hintun können, der noch nicht existiert? 

    $listView1.Columns.Add("<Caption>")
    $listView1.Columns.Add("<DeviceID>")
    etc. 
    
    $1 = (Get-WmiObject win32_processor).Caption
    $2 = (Get-WmiObject win32_processor).DeviceID
    etc. 
    
    $Item1 = New-Object System.Windows.Forms.ListViewItem($1)
    $Item1.SubItems.Add($2)
    etc...
    
    $listView1.Items.AddRange(($Item1))

    So müsste deines aussehen. Ich habe das gerade bei mir getestet und es funktioniert. 
    In Excel erstellst du ja auch nicht erst die Zellinhalte und dann erst die Spalten, oder? ;-)

    Edit: Noch ein kleines Bild, wie es bei mir aussieht, wenn ich auf den Prozessor-Knopf drücke. 

    • Bearbeitet Fahiko Dienstag, 19. Dezember 2017 16:47
    • Als Antwort markiert secure127001 Mittwoch, 20. Dezember 2017 06:45
    Dienstag, 19. Dezember 2017 16:46
  • Super hat bisher alles wunderbar geklappt, mitlerweile sieht es auch bei mir so aus, aber ich habe nur noch ein kleines Problem. Wie kann ich jetzt die Balken wieder Löschen wenn ich jetzt auf einen anderen Button draufklicke?

    $listView1.Items.Clear() -----> Mit dem hat es leider nicht funktioniert.

    Mittwoch, 20. Dezember 2017 07:03
  • ??????
    Mittwoch, 20. Dezember 2017 14:10
  • Nur um das nochmal klarzustellen: die Leute helfen Dir hier freiwillig in ihrer Freizeit. Es gibt hier keine Service-Level und keine garantierte Antwort-Zeit oder Antwort überhaupt. Wir haben alle die gleichen Suchmaschinen wie Du. Du darfst Dich gern selbst einbringen indem Du selber ein bissl "Jugend forscht" betreibst und Sachen für Dich selbst herausbekommst.  :-/

    Best regards,

    (79,108,97,102|%{[char]$_})-join''


    • Bearbeitet BOfH-666 Mittwoch, 20. Dezember 2017 14:27
    Mittwoch, 20. Dezember 2017 14:26
  • Das ist mir bewusst es tut mir leid dass das so rüber kommt :/ Das ist halt das einzige Problem wo ich noch habe und komme einfach nicht weiter Google kann mir dabei auch nicht helfen, finde nichts ähnliches.

    Mittwoch, 20. Dezember 2017 14:31
  • Also mein Google spuckt freudig Ergebnisse aus :-)

    Listview.Clear() ist das, was du brauchst. Anwenden tust du es bei dir so: 

    $ListView1.Clear()

    Das dürfte aber jetzt nicht wirklich so schwierig gewesen sein. 

    Mittwoch, 20. Dezember 2017 17:02
  • Geht eben nicht ich will ja die balken wieder löschen dieser befehl funktioniert dabei nicht.
    Donnerstag, 21. Dezember 2017 12:44
  • Welche Aktion möchtest du denn machen? 
    Wenn ich bei mir $ListView1.Clear() in irgendeine Knopf-Aktion packe, funktioniert es ohne Probleme. Der Inhalt der ListView wird weiss, als wäre nie etwas drin gewesen. 

    Wo hast du es denn überhaupt drin? Im gleichen Ort wie dort wo du die Spalten hinzufügst ist das nicht sonderlich hilfreich.

    Am besten postest du nochmals den Code, welcher bei dir nicht funktioniert. Mit der Aussage "Funktioniert nicht" kann ich hier auch nichts anfangen. 

    Donnerstag, 21. Dezember 2017 16:43