2016-09-06 6 views
-1

Momentan stecke ich mit einem Projekt, wo ich versuche, die Ausgabe von Get-WmiObject -Class OperatinSsytem Ausgabe von mehreren Servern in ein DataGridView zu zeigen.DataGridview an die Server-Ausgabe anhängen. Wird gerade überschrieben

Im Folgenden finden Sie, was bisher geschehen ist:

$MainForm_Load = { 
    #TODO: Initialize Form Controls here 
} 

#region Control Helper Functions 
function Load-DataGridView 
{ 
    <# 
    .SYNOPSIS 
     This functions helps you load items into a DataGridView. 

    .DESCRIPTION 
     Use this function to dynamically load items into the DataGridView control. 

    .PARAMETER DataGridView 
     The DataGridView control you want to add items to. 

    .PARAMETER Item 
     The object or objects you wish to load into the DataGridView's items collection. 

    .PARAMETER DataMember 
     Sets the name of the list or table in the data source for which the DataGridView is displaying data. 

    .PARAMETER AutoSizeColumns 
     Resizes DataGridView control's columns after loading the items. 
    #> 
    Param (
     [ValidateNotNull()] 
     [Parameter(Mandatory=$true)] 
     [System.Windows.Forms.DataGridView]$DataGridView, 
     [ValidateNotNull()] 
     [Parameter(Mandatory=$true)] 
     $Item, 
     [Parameter(Mandatory=$false)] 
     [string]$DataMember, 
     [System.Windows.Forms.DataGridViewAutoSizeColumnMode]$AutoSizeColumns = 'None' 
    ) 
    $DataGridView.SuspendLayout() 
    $DataGridView.DataMember = $DataMember 

    if ($Item -is [System.Data.DataSet] -and $Item.Tables.Count -gt 0) 
    { 
     $DataGridView.DataSource = $Item.Tables[0] 
    } 
    elseif ($Item -is [System.ComponentModel.IListSource]` 
    -or $Item -is [System.ComponentModel.IBindingList] -or $Item -is [System.ComponentModel.IBindingListView]) 
    { 
     $DataGridView.DataSource = $Item 
    } 
    else 
    { 
     $array = New-Object System.Collections.ArrayList 

     if ($Item -is [System.Collections.IList]) 
     { 
      $array.AddRange($Item) 
     } 
     else 
     { 
      $array.Add($Item) 
     } 
     $DataGridView.DataSource = $array 
    } 

    if ($AutoSizeColumns -ne 'None') 
    { 
     $DataGridView.AutoResizeColumns($AutoSizeColumns) 
    } 

    $DataGridView.ResumeLayout() 
} 

function ConvertTo-DataTable 
{ 
    <# 
     .SYNOPSIS 
     Converts objects into a DataTable. 

     .DESCRIPTION 
     Converts objects into a DataTable, which are used for DataBinding. 

     .PARAMETER InputObject 
     The input to convert into a DataTable. 

     .PARAMETER Table 
     The DataTable you wish to load the input into. 

     .PARAMETER RetainColumns 
     This switch tells the function to keep the DataTable's existing columns. 

     .PARAMETER FilterWMIProperties 
     This switch removes WMI properties that start with an underline. 

     .EXAMPLE 
     $DataTable = ConvertTo-DataTable -InputObject (Get-Process) 
    #> 
    [OutputType([System.Data.DataTable])] 
    param(
    [ValidateNotNull()] 
    $InputObject, 
    [ValidateNotNull()] 
    [System.Data.DataTable]$Table, 
    [switch]$RetainColumns, 
    [switch]$FilterWMIProperties) 

    if($null -eq $Table) 
    { 
     $Table = New-Object System.Data.DataTable 
    } 

    if ($InputObject -is [System.Data.DataTable]) 
    { 
     $Table = $InputObject 
    } 
    elseif ($InputObject -is [System.Data.DataSet] -and $InputObject.Tables.Count -gt 0) 
    { 
     $Table = $InputObject.Tables[0] 
    } 
    else 
    { 
     if (-not $RetainColumns -or $Table.Columns.Count -eq 0) 
     { 
      #Clear out the Table Contents 
      $Table.Clear() 

      if ($null -eq $InputObject) { return } #Empty Data 

      $object = $null 
      #find the first non null value 
      foreach ($item in $InputObject) 
      { 
       if ($null -ne $item) 
       { 
        $object = $item 
        break 
       } 
      } 

      if ($null -eq $object) { return } #All null then empty 

      #Get all the properties in order to create the columns 
      foreach ($prop in $object.PSObject.Get_Properties()) 
      { 
       if (-not $FilterWMIProperties -or -not $prop.Name.StartsWith('__')) #filter out WMI properties 
       { 
        #Get the type from the Definition string 
        $type = $null 

        if ($null -ne $prop.Value) 
        { 
         try { $type = $prop.Value.GetType() } 
         catch { } 
        } 

        if ($null -ne $type) # -and [System.Type]::GetTypeCode($type) -ne 'Object') 
        { 
         [void]$table.Columns.Add($prop.Name, $type) 
        } 
        else #Type info not found 
        { 
         [void]$table.Columns.Add($prop.Name) 
        } 
       } 
      } 

      if ($object -is [System.Data.DataRow]) 
      { 
       foreach ($item in $InputObject) 
       { 
        $Table.Rows.Add($item) 
       } 
       return @(,$Table) 
      } 
     } 
     else 
     { 
      $Table.Rows.Clear() 
     } 

     foreach ($item in $InputObject) 
     { 
      $row = $table.NewRow() 

      if ($item) 
      { 
       foreach ($prop in $item.PSObject.Get_Properties()) 
       { 
        if ($table.Columns.Contains($prop.Name)) 
        { 
         $row.Item($prop.Name) = $prop.Value 
        } 
       } 
      } 
      [void]$table.Rows.Add($row) 
     } 
    } 

    return @(,$Table) 
} 
#endregion 

$buttonShow_Click = { 
    $Servers = Get-Content $textbox1.Text 
    foreach ($Server in $Servers) 
    { 
     $OS = Get-WmiObject -Class Win32_OperatingSystem -ComputerName $Server 
     for ($i = 0; $i -lt $Servers.count; $i++) 
     { 
      $table = ConvertTo-DataTable -InputObject $OS -FilterWMIProperties 
      Load-DataGridView -DataGridView $datagridview1 -Item $table 
      $datagridview1.DataSource = $table 
     } 
    } 
} 

Daten überschrieben immer an der frist Reihe und es ist nicht anhängt. Wie erhält man die Daten des nächsten Servers?

+0

Bitte reduzieren Sie diese Codewand auf das kürzeste Skript, das das Problem noch zeigt. –

+0

$ buttonShow_Click = { $ Server = Get-Content $ TextBox1.Text foreach ($ Server in $ Server) { $ OS = Get-WmiObject -Class Win32_OperatingSystem -ComputerName $ Server for ($ i = 0; $ i -lt $ Servers.count; $ i ++) { $ table = ConvertTo-Datatable -InputObject $ OS -FilterWMIProperties Lastdatagridview -DataGridView $ DataGridView1 -Item $ table $ datagridview1.DataSource = $ table } } } – Aamir

+0

Bitte bearbeiten Sie Ihre Frage. Code in Kommentaren ist nicht lesbar. –

Antwort

0

Vor allem diese beiden Linien tut nur etwa die gleiche:

 Load-DataGridView -DataGridView $datagridview1 -Item $table 
     $datagridview1.DataSource = $table 

ich Ihren Code geändert ein wenig so jetzt sollte es funktionieren.

$buttonShow_Click = { 
    $Servers = Get-Content $textbox1.Text 
    $set = @() 
    foreach ($Server in $Servers) 
    { 
     $set += Get-WmiObject -Class Win32_OperatingSystem -ComputerName $Server 
    } 
    $table = ConvertTo-DataTable -InputObject $set -FilterWMIProperties 
    $datagridview1.DataSource = $table 
} 
+0

Vielen Dank Freund .. das hilft wirklich .. eine letzte Abfrage .. – Aamir

+0

Was ist, wenn ich andere Tabellenüberschriften als tatsächliche WMI-Eigenschaftsnamen haben möchte? Beispiel: Ich erhalte Win32_Operativesystem-Eigenschaftsnamen als Header, aber ich möchte ServerName anstelle von PSComputerName und anstelle der WindowsDirectory-Eigenschaft meinen benutzerdefinierten Namen wie WinDir usw. haben. – Aamir

+0

Funktion Get-ServerInfo \t $ Servers = Get-Content $ textboxServers .Text \t $ Set = @() \t foreach ($ Server in $ Server) \t {OS $ = Get-WmiObject -Class Win32_OperatingSystem -ComputerName $ Server \t \t \t \t \t \t $ Prop = @ { \t \t \t \t 'ServerName' = $ Server; \t \t \t \t 'OS' = $ OS.Caption; \t \t \t \t 'InstallDir' = $ OS.WindowsDirectory; \t \t \t \t 'Version' = $ OS.version; \t \t \t \t 'ServicePack' = $ OS.CSDVersion \t \t \t} \t \t \t New-Object PSObject -Property $ Prop \t \t \t \t \t \t $ table = ConvertTo-Datatable -InputObject $ Set -FilterWMIProperties \t \t \t # Lastdatagridview -DataGridView $ DataGridView1 -Item $ Tabelle \t \t \t $ datagridview1.DataSource = $ Tabelle – Aamir