使用服务器输出附加DataGridview ..当前被覆盖

时间:2016-09-06 16:00:14

标签: windows forms powershell datagridview

目前我遇到了一个项目,因为我试图将多个服务器的Get-WmiObject -Class OperatinSsytem输出显示为DataGridView。

以下是迄今为止所做的工作:

$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
        }
    }
}

数据在第一行被覆盖,并且没有追加。如何获取附加服务器的数据?

1 个答案:

答案 0 :(得分:0)

首先,这两行几乎相同:

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

我稍微更改了您的代码,现在它应该可以正常工作。

$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
}