locked
Column in Listview wird nicht gefüllt RRS feed

  • Frage

  • Wenn ich in meiner Listview folgenden code benutze werden die Zellen nicht gefüllt.

    	        foreach ($SysEvent in $SysEvents) {
    		    $Member = New-Object PSObject -Property @{
                    
                    Index = [String]$SysEvent.Index
                    InstanceID = [String]$SysEvent.InstanceID
                    TimeGenerated = [String]$SysEvent.TimeGenerated
    		        EntryType = [String]$SysEvent.EntryType
                    Source = [String]$SysEvent.Source
                    Message = [String]$SysEvent.Message
                    	     
        }

    Benutze ich den folgenden code wird mir der Index angezeigt aber dafür der Computername nicht.

    	        foreach ($SysEvent in $SysEvents) {
    		    $Member = New-Object PSObject -Property @{
                    PSComputerName = [String]$SysEvent.PSComputerName
                    Index = [String]$SysEvent.Index
                    InstanceID = [String]$SysEvent.InstanceID
                    TimeGenerated = [String]$SysEvent.TimeGenerated
    		        EntryType = [String]$SysEvent.EntryType
                    Source = [String]$SysEvent.Source
                    Message = [String]$SysEvent.Message
                    	     
        }

      'PSComputerName','Index','InstanceID','TimeGenerated','EntryType','Source','Message'| %{Add-Column $_}
    
               'Index','InstanceID','TimeGenerated','EntryType','Source','Message'| %{Add-Column $_}

    Verstehe einfach nicht was ich da falsch mache.

    Hier ist der complete code:

            $btnSysEvents_Click={
            
                # Empty process bar
                $Progressbar.value = 0
                # Empty StatusBox
                $StatusBox.Text = ""
                # Empty StatusBoxTools
                $StatusBoxTools.Text = ""
                # Close Excel button
                CloseExcelBtn
    
    	        getcomp
    	        Initialize-Listview
    	        $StatusBox.Text = "Machine Status:  Retrieving System Events from Computer $Comp..."
    	       	    
                'PSComputerName','Index','InstanceID','TimeGenerated','EntryType','Source','Message'| %{Add-Column $_}
    
             #  'Index','InstanceID','TimeGenerated','EntryType','Source','Message'| %{Add-Column $_}
    
    
                Resize-Columns
    #	        Col0 = $lvMain.Columns[0].Text
    	        
                $Info = @()
    	        
                $SysEvents = Get-EventLog -ComputerName $Comp -LogName System -EntryType Error,Warning -Newest 50  #| select-object Index,InstanceID,TimeGenerated,EntryType,Source,Message
    
    
                $i=0
                ForEach ($SysEvent in $SysEvents) {
                $i++
                (($i / $SysEvents.count)*100)
    
                $progressbar.PerformStep()
            
        }
    	        foreach ($SysEvent in $SysEvents) {
    		    $Member = New-Object PSObject -Property @{
                    PSComputerName = [String]$SysEvent.PSComputerName
                    Index = [String]$SysEvent.Index
                    InstanceID = [String]$SysEvent.InstanceID
                    TimeGenerated = [String]$SysEvent.TimeGenerated
    		        EntryType = [String]$SysEvent.EntryType
                    Source = [String]$SysEvent.Source
                    Message = [String]$SysEvent.Message
                    	     
        }
    
    		    $Info += $Member
    	}
    
    	        Start-Sleep -m 250
    	            
                if ($SysError){$StatusBox.Text = "Machine Status:  [$Comp] $SysError"}	        
                
                else{
    
    		    $Info | %{
    			$Item = New-Object System.Windows.Forms.ListViewItem($_.$Col0)
               
                $Item.UseItemStyleForSubItems = $False
    			ForEach ($Col in ($lvMain.Columns | ?{$_.Index -ne 0})){
                    $Field = $Col.Text
                    $SubItem = $Item.SubItems.Add($_.$Field)
                    If($Field -eq "EntryType") {
                    If($_.EntryType -eq "Error") {
                    $SubItem.BackColor = "red"       # Hintergrundfarbe Fehlermeldung
        }
        
                    else {
        
                    $SubItem.BackColor = "yellow"     # Hintergrundfarbe Warnmeldung
        
        }
        
    }
                    Else {
    
        }
    
    }
    			$lvMain.Items.Add($Item)
    
                CountProgress
    
        }
    
                $btnSysEventExcel.visible = $true
    
                $StatusBox.Text = "Machine Status:  50 newest System errors and warnings on Computer $Comp"
    		
        }
                      
                # besseres column resize
    		    ForEach($Column in $lvMain.Columns) {
    			$lvMain.AutoResizeColumn($Column.Index,([System.Windows.Forms.ColumnHeaderAutoResizeStyle]::ColumnContent))
    	}
            
    }




    • Bearbeitet 001fred Freitag, 4. März 2016 15:36
    Freitag, 4. März 2016 08:56

Antworten

  • Ich weiß nicht wo die Klammer herkommt, oben in meinem Code steht sie nicht. :)
    Ohne Klammer und vor allem ohne die Bedingung
    ?{$_.Index -ne 0}
    funktioniert der Code.
    ForEach ( $Col in $lvMain.Columns ) {
     
    Möglicherweise hast du irgendwo einen neuen Fehler beim rumprobieren eingebaut.
    Ich würde mal jeden Befehl, jede Bedingung Schritt für Schritt durchgehen und überprüfen was da genau passiert. Dann findest du das Problem.                                   
      
    Was die Formatierung betrifft:
    Vergleiche mal, ein Abschnitt deines Codes:
     
    	            
                if ($SysError){$StatusBox.Text = "Machine Status:  [$Comp] $SysError"}	        
                
                else{
    
    		    $Info | %{
    			$Item = New-Object System.Windows.Forms.ListViewItem($_.$Col0)
               
                $Item.UseItemStyleForSubItems = $False
    			ForEach ($Col in ($lvMain.Columns | ?{$_.Index -ne 0})){
                    $Field = $Col.Text
                    $SubItem = $Item.SubItems.Add($_.$Field)
                    If($Field -eq "EntryType") {
                    If($_.EntryType -eq "Error") {
                    $SubItem.BackColor = "red"       # Hintergrundfarbe Fehlermeldung
        }
        
                    else {
        
                    $SubItem.BackColor = "yellow"     # Hintergrundfarbe Warnmeldung
        
        }
        
    }
                    Else {
    
        }
    
    }
    			$lvMain.Items.Add($Item)
    
                CountProgress
    
        }
    
                $btnSysEventExcel.visible = $true
    
                $StatusBox.Text = "Machine Status:  50 newest System errors and warnings on Computer $Comp"
    		
        }
     
    Und nun der gleiche Abschnitt vernünftig formatiert:
     
    	if ($SysError){
    		$StatusBox.Text = "Machine Status:  [$Comp] $SysError"
    	}	        
    	else{ 
    		$Info | %{
    			$Item = New-Object System.Windows.Forms.ListViewItem($_.$Col0)
    			$Item.UseItemStyleForSubItems = $False
    			ForEach ($Col in ($lvMain.Columns | ?{$_.Index -ne 0})){
    				$Field = $Col.Text
    				$SubItem = $Item.SubItems.Add($_.$Field)
    				If($Field -eq "EntryType") {
    					If($_.EntryType -eq "Error") {
    						$SubItem.BackColor = "red"       # Hintergrundfarbe Fehlermeldung
    					}
    					else {
    						$SubItem.BackColor = "yellow"     # Hintergrundfarbe Warnmeldung
    					}
    				}
    				Else {}
    			}
    			$lvMain.Items.Add($Item)
    			CountProgress
    		}
    		$btnSysEventExcel.visible = $true
    		$StatusBox.Text = "Machine Status:  50 newest System errors and warnings on Computer $Comp"
    	}
     
    Siehst du einen Unterschied? Die Codebox killt offenbar ein paar Leerzeichen, aber ich denke du siehst die Idee des Ganzen. So kann man viel leichter nachvollziehen, welche Code zu welcher Bedingung oder Schleife gehört.
    Ob man die öffnenden Klammern hinter den Befehl oder in die nächste Zeile setzt, ist Geschmackssache. Ich finde es so am übersichtlichsten.
    Das ist nur eine Maßnahme. Wenn man viele ineinander verschachtelte Bedingungen oder Schleifen hat  lohnt es sich auch manchmal hinter die schließenden Klammern einen Kommentar zu setzen. (Das gilt auch für Schleifen oder Bedingungen deren Inhalt größer ist als dein Bildschirm Zeilen darstellen kann.) z.b. so:
     
    } #End Foreach 
     
    Du solltest außerdem in Scripten keine Aliase benutzen (%, ?). Auch wenn man deren Übersetzung genau kennt, es stört den Lesefluss und das schnelle erfassen der Funktion. Die Pipeline solltest du in Scripten nebenbei generell vermeiden, die ist deutlich schlechter Schritt für Schritt zu debuggen als normale Schleifen. Nebenbei ist sie oft auch deutlich langsamer.
    Kommentare helfen auch zu erkennen bzw. zu erinnern was genau eine Funktion, ein Abschnitt im Code tut. Anfangs hast du jede Zeile kommentiert, dann gar nicht mehr.
     
    Gruß, Denniver




    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.



    Sonntag, 6. März 2016 14:22
    Moderator
  • Du hast ihn ja auch editiert. Vorher waren die Zeilen noch nicht auskommentiert. :)

       

    Unabhängig davon, ich hab noch ein drittes und hoffentlich jetzt endgültig das eigentlich Problem gefunden: Die Zuweisung der Subitems funktioniert so nicht (richtig).
    Beim Erstellen eines Listviewitems, wird automatisch auch bereits ein leeres Subitem erstellt. Wenn du nun per add() die anderen Subitems hinzufügst, bleibt das erste, leere unangetastet. Dieses kannst du nur ändern indem du es direkt adressieren würdest ala ...subitems[0].text = "blah". Ich hab es jetzt einfacher und ganz anders gelöst, indem wir direkt beim Erstellen des Items das Array mit Subitems mitgeben:
     

    if ($SysError){
    	$StatusBox.Text = "Machine Status:  [$Comp] $SysError"
    }	        
    else{ 
    	foreach ($evt in $info){  
    		$Item = New-Object System.Windows.Forms.ListViewItem([System.String[]](@($evt.Index,$evt.InstanceID,$evt.TimeGenerated,$evt.EntryType,$evt.Source,$evt.Message)),$null) 
    		$Item.UseItemStyleForSubItems = $False
    		if ($evt.EntryType -eq "Error") {
    			 $Item.SubItems[3].BackColor = "red"  
    		}
    		else {
    			$Item.SubItems[3].BackColor = "yellow"
    		}		
    		[Void]$lvMain.Items.Add($Item)
    		CountProgress
    	}
    	$btnSysEventExcel.visible = $true
    	$StatusBox.Text = "Machine Status:  50 newest System errors and warnings on Computer $Comp"
    }
     
    Grüße, Denniver

    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.

    Montag, 7. März 2016 22:19
    Moderator

Alle Antworten

  • Der Code den du oben gepostet hast, ist in Ordnung. Daher liegt nahe das der Fehler in dem Teil liegt, den du weggelassen hast. :)
    Poste mal den Rest der Pipeline aus der Box unten, sowie deine "Add-Column" Funktion.

    Kleiner Tipp nebenbei: ich weiß nicht wer die blöde Idee hatte, den Leuten zu erzählen man solle seine Funktionen in der Art wie CMDlets benennen: Mach das nicht. Der Benefit ist null. Aber in Anbetracht der Tatsache, das die Anzahl der CMDlets und mitgelieferten Funktionen mit jedem PoSh-Release steigt (bei v4 schon ~1273), ist die Chance groß, das wenn du in einem Jahr ein altes Script von dir anschaust, du Funktionsaufrufe nicht von CMDlets unterscheiden kannst. Insbesondere beim Debugging von großen Scripten kann das echt nervig sein. Benenne Funktionen eindeutig mit z.b. "F" oder "FN" davor.

     
    Grüße, Denniver


    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.


    Freitag, 4. März 2016 14:14
    Moderator
  • Hallo Denniver,

     code habe ich oben eingefügt.

    Leider weiss ich nicht was Du meinst mit

    seine Funktionen wie CMDlets benennen.

    Mir ist nicht bewusst in dem code den Namen eines CMDlets benutzt zu haben.

    Oder ich kenne das CMDlet noch nicht. ;-)

    Freitag, 4. März 2016 15:51
  • Dein Problem liegt hier:
     
    ForEach ( $Col in ($lvMain.Columns | ?{$_.Index -ne 0}) ){
     
    Du lässt jedes Mal beim Zuweisen der Texte, die Spalte mit dem Index 0 aus. Das ist die erste Spalte!  :-)
    So gehts:
      
    ForEach ( $Col in $lvMain.Columns ) {
     
    Aber mein Lieber, es ist kein Wunder das du da nicht mehr durchblickst. Keine Abschnitte, keine Kommentare, eine einheitliche Formatierung, Klammern mal hier mal da, keine Ahnung was zueinander gehört. Das nächste Mal, das sag ich dir jetzt schon, wühl' ich mich durch sowas nicht mehr durch. :-/
     
    Grüße, Denniver
     


    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.


    Freitag, 4. März 2016 20:15
    Moderator
  • Hallo Denniver,

    wenn ich den Code von dir nehme erhalte ich einen Fehler zwischen den zwei letzten Klammern ){ am Ende.

     ForEach($Colin($lvMain.Columns){

    Bei folgendem Code verschwindet der Fehler

     ForEach($Colin($lvMain.Columns)){

    aber der Index wird trotzdem nicht angezeigt. :-(


    Zu der Formattierung meines codes. Mir ist nicht bewusst, dass daran etwas falsch ist. ?? In den letzten 2 Jahren seit dem ich mich PS beschäftige habe ich reichlich codes/scripts im netz gesehen/gelesen wo ich als (mehr oder weniger) Anfänger keine Durchblick habe. Gut in meinem fehlen vielleicht Beschreibungen aber von der Auflistung her find ich das übersichtlich und lesbar. Vielleicht kannst du mir ja ein paar Tips geben wie man(n) das besser macht/ machen könnte?Danke und SWE!

    • Bearbeitet 001fred Samstag, 5. März 2016 15:44
    Samstag, 5. März 2016 15:24
  • Ich weiß nicht wo die Klammer herkommt, oben in meinem Code steht sie nicht. :)
    Ohne Klammer und vor allem ohne die Bedingung
    ?{$_.Index -ne 0}
    funktioniert der Code.
    ForEach ( $Col in $lvMain.Columns ) {
     
    Möglicherweise hast du irgendwo einen neuen Fehler beim rumprobieren eingebaut.
    Ich würde mal jeden Befehl, jede Bedingung Schritt für Schritt durchgehen und überprüfen was da genau passiert. Dann findest du das Problem.                                   
      
    Was die Formatierung betrifft:
    Vergleiche mal, ein Abschnitt deines Codes:
     
    	            
                if ($SysError){$StatusBox.Text = "Machine Status:  [$Comp] $SysError"}	        
                
                else{
    
    		    $Info | %{
    			$Item = New-Object System.Windows.Forms.ListViewItem($_.$Col0)
               
                $Item.UseItemStyleForSubItems = $False
    			ForEach ($Col in ($lvMain.Columns | ?{$_.Index -ne 0})){
                    $Field = $Col.Text
                    $SubItem = $Item.SubItems.Add($_.$Field)
                    If($Field -eq "EntryType") {
                    If($_.EntryType -eq "Error") {
                    $SubItem.BackColor = "red"       # Hintergrundfarbe Fehlermeldung
        }
        
                    else {
        
                    $SubItem.BackColor = "yellow"     # Hintergrundfarbe Warnmeldung
        
        }
        
    }
                    Else {
    
        }
    
    }
    			$lvMain.Items.Add($Item)
    
                CountProgress
    
        }
    
                $btnSysEventExcel.visible = $true
    
                $StatusBox.Text = "Machine Status:  50 newest System errors and warnings on Computer $Comp"
    		
        }
     
    Und nun der gleiche Abschnitt vernünftig formatiert:
     
    	if ($SysError){
    		$StatusBox.Text = "Machine Status:  [$Comp] $SysError"
    	}	        
    	else{ 
    		$Info | %{
    			$Item = New-Object System.Windows.Forms.ListViewItem($_.$Col0)
    			$Item.UseItemStyleForSubItems = $False
    			ForEach ($Col in ($lvMain.Columns | ?{$_.Index -ne 0})){
    				$Field = $Col.Text
    				$SubItem = $Item.SubItems.Add($_.$Field)
    				If($Field -eq "EntryType") {
    					If($_.EntryType -eq "Error") {
    						$SubItem.BackColor = "red"       # Hintergrundfarbe Fehlermeldung
    					}
    					else {
    						$SubItem.BackColor = "yellow"     # Hintergrundfarbe Warnmeldung
    					}
    				}
    				Else {}
    			}
    			$lvMain.Items.Add($Item)
    			CountProgress
    		}
    		$btnSysEventExcel.visible = $true
    		$StatusBox.Text = "Machine Status:  50 newest System errors and warnings on Computer $Comp"
    	}
     
    Siehst du einen Unterschied? Die Codebox killt offenbar ein paar Leerzeichen, aber ich denke du siehst die Idee des Ganzen. So kann man viel leichter nachvollziehen, welche Code zu welcher Bedingung oder Schleife gehört.
    Ob man die öffnenden Klammern hinter den Befehl oder in die nächste Zeile setzt, ist Geschmackssache. Ich finde es so am übersichtlichsten.
    Das ist nur eine Maßnahme. Wenn man viele ineinander verschachtelte Bedingungen oder Schleifen hat  lohnt es sich auch manchmal hinter die schließenden Klammern einen Kommentar zu setzen. (Das gilt auch für Schleifen oder Bedingungen deren Inhalt größer ist als dein Bildschirm Zeilen darstellen kann.) z.b. so:
     
    } #End Foreach 
     
    Du solltest außerdem in Scripten keine Aliase benutzen (%, ?). Auch wenn man deren Übersetzung genau kennt, es stört den Lesefluss und das schnelle erfassen der Funktion. Die Pipeline solltest du in Scripten nebenbei generell vermeiden, die ist deutlich schlechter Schritt für Schritt zu debuggen als normale Schleifen. Nebenbei ist sie oft auch deutlich langsamer.
    Kommentare helfen auch zu erkennen bzw. zu erinnern was genau eine Funktion, ein Abschnitt im Code tut. Anfangs hast du jede Zeile kommentiert, dann gar nicht mehr.
     
    Gruß, Denniver




    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.



    Sonntag, 6. März 2016 14:22
    Moderator
  • Hallo Denniver,

    irgendwie scheine ich einen Fehler zu machen den ich immer wieder übersehen.

    Habe den code jetz angepasst aber die Index Column bleibt immer noch leer.

            $btnSysEvents_Click={
            
                # Empty process bar
                $Progressbar.value = 0
                # Empty StatusBox
                $StatusBox.Text = ""
                # Empty StatusBoxTools
                $StatusBoxTools.Text = ""
                # Close Excel button
                CloseExcelBtn
    
    	        getcomp
    	        Initialize-Listview
    	        $StatusBox.Text = "Machine Status:  Retrieving System Events from Computer $Comp..."
    	       	    
           #     'PSComputerName','Index','InstanceID','TimeGenerated','EntryType','Source','Message'| %{Add-Column $_}
    
                'Index','InstanceID','TimeGenerated','EntryType','Source','Message'| %{Add-Column $_}
    
    
                Resize-Columns
    #	        Col0 = $lvMain.Columns[0].Text
    	        
                $Info = @()
    	        
                $SysEvents = Get-EventLog -ComputerName $Comp -LogName System -EntryType Error,Warning -Newest 50  #| select-object Index,InstanceID,TimeGenerated,EntryType,Source,Message
    
    
                $i=0
                ForEach ($SysEvent in $SysEvents) {
                $i++
                (($i / $SysEvents.count)*100)
    
                $progressbar.PerformStep()
            
        }
    	        foreach ($SysEvent in $SysEvents) {
    		    $Member = New-Object PSObject -Property @{
                 #   PSComputerName = [String]$SysEvent.PSComputerName
                    Index = [String]$SysEvent.Index
                    InstanceID = [String]$SysEvent.InstanceID
                    TimeGenerated = [String]$SysEvent.TimeGenerated
    		        EntryType = [String]$SysEvent.EntryType
                    Source = [String]$SysEvent.Source
                    Message = [String]$SysEvent.Message
                    	     
        }
    
    		    $Info += $Member
    	}
    
    	        Start-Sleep -m 250
    	            
                if ($SysError){
                    $StatusBox.Text = "Machine Status:  [$Comp] $SysError"
                }	        
                
                else{
                    $Info | %{
    			        $Item = New-Object System.Windows.Forms.ListViewItem($_.$Col0)
                        $Item.UseItemStyleForSubItems = $False
    		
            #	ForEach ($Col in ($lvMain.Columns | ?{$_.Index -ne 0})){
    
                        ForEach ( $Col in $lvMain.Columns ) {
    
                            $Field = $Col.Text
                            $SubItem = $Item.SubItems.Add($_.$Field)
                            If($Field -eq "EntryType") {
                                If($_.EntryType -eq "Error") {
                                    $SubItem.BackColor = "red"       # Hintergrundfarbe Fehlermeldung
                                }
        
                                else {
        
                                    $SubItem.BackColor = "yellow"     # Hintergrundfarbe Warnmeldung
        
                                }
        
                            }
                            Else {}
    
                        }
    			        $lvMain.Items.Add($Item)
                        CountProgress
    
                }
    
                $btnSysEventExcel.visible = $true
                $StatusBox.Text = "Machine Status:  50 newest System errors and warnings on Computer $Comp"
    		
            }
                      
                # besseres column resize
    		    ForEach($Column in $lvMain.Columns) {
    			$lvMain.AutoResizeColumn($Column.Index,([System.Windows.Forms.ColumnHeaderAutoResizeStyle]::ColumnContent))
    	}
            
    }


    • Bearbeitet 001fred Montag, 7. März 2016 12:24
    Montag, 7. März 2016 12:23
  •  

    Ja ich sehe gerade, du hast tatsächlich noch einen zweiten Fehler drin:

    $SysEvent.PSComputerName

     

    gibt es nicht als Eigenschaft. Was ist gibt ist:
     

    $SysEvent.MachineName

    Gruß, Denniver

     

    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.

    Montag, 7. März 2016 12:54
    Moderator
  • $SysEvent.PSComputerName ist ausgeblendet

    # $SysEvent.PSComputerName....

    und dürfte normal nicht erkannt/beachtet werden


    • Bearbeitet 001fred Montag, 7. März 2016 13:54
    Montag, 7. März 2016 13:53
  • Du hast ihn ja auch editiert. Vorher waren die Zeilen noch nicht auskommentiert. :)

       

    Unabhängig davon, ich hab noch ein drittes und hoffentlich jetzt endgültig das eigentlich Problem gefunden: Die Zuweisung der Subitems funktioniert so nicht (richtig).
    Beim Erstellen eines Listviewitems, wird automatisch auch bereits ein leeres Subitem erstellt. Wenn du nun per add() die anderen Subitems hinzufügst, bleibt das erste, leere unangetastet. Dieses kannst du nur ändern indem du es direkt adressieren würdest ala ...subitems[0].text = "blah". Ich hab es jetzt einfacher und ganz anders gelöst, indem wir direkt beim Erstellen des Items das Array mit Subitems mitgeben:
     

    if ($SysError){
    	$StatusBox.Text = "Machine Status:  [$Comp] $SysError"
    }	        
    else{ 
    	foreach ($evt in $info){  
    		$Item = New-Object System.Windows.Forms.ListViewItem([System.String[]](@($evt.Index,$evt.InstanceID,$evt.TimeGenerated,$evt.EntryType,$evt.Source,$evt.Message)),$null) 
    		$Item.UseItemStyleForSubItems = $False
    		if ($evt.EntryType -eq "Error") {
    			 $Item.SubItems[3].BackColor = "red"  
    		}
    		else {
    			$Item.SubItems[3].BackColor = "yellow"
    		}		
    		[Void]$lvMain.Items.Add($Item)
    		CountProgress
    	}
    	$btnSysEventExcel.visible = $true
    	$StatusBox.Text = "Machine Status:  50 newest System errors and warnings on Computer $Comp"
    }
     
    Grüße, Denniver

    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.

    Montag, 7. März 2016 22:19
    Moderator
  • Dear Denniver,

    die Lösung und natürlich auch die Erklärung ist wie immer in eurem Forum Spitzenklasse!!!

    Vielen Dank und schönen Tag noch!!

    Dienstag, 8. März 2016 11:03