使用树视图和重复字符串创建父节点和子节点

时间:2015-03-27 12:50:43

标签: powershell treeview treenode

我正在创建一个基于GUI的脚本,当用户输入用户名时,它会检索逗号分隔的日志文件,其中包含登录的日期和时间,他们登录的计算机等信息。 作为GUI的一部分,我想使用TreeView向他们显示他们输入的用户名已登录的MAC地址列表。 在某些情况下,有许多重复,在一年的时间内登录的不同时间。 我希望能够将唯一实例显示为父节点,然后对于每个重复实例,将其作为子节点添加到相应的父节点以及它们登录的时间。

我认为我认为是解决方案的一部分,添加了独特的节点,并且按照我的预期工作,但我很难将重复节点作为子节点添加到相应的父节点。

例如:如果用户已在整个日志文件中登录主机名COMP1 6次,我想将COMP1显示为父节点,如果用户按下+符号,他们将看到下面列出的6个实例和日期财产附加。

以下是.CSV日志文件中的示例,顶行属性:

Date,EventType,ConnectionType,UserDomain,UserLogonTime,LogonType,HostName,HostAddress,HostStartTime,RemoteStationName,RemoteStationAddress
3/24/2015 12:49:58 PM,Logon,Local,DOMAIN,3/24/2015 12:49:13 PM,CONSOLE,F0A8F0B01660,10.10.10.11,3/24/2015 12:27:15 PM,N/A,N/A
3/26/2015 12:32:56 PM,TS Session Connected,Remote-RDP,DOMAIN,3/24/2015 7:13:19 AM,CONSOLE,VFP3077V,10.10.10.10,3/23/2015 6:56:32 AM,Dingus,10.10.96.72

我从日志文件中选择的属性是主机名和日期。

以下是我目前的一些代码:

$array = Import-Csv $filepath\$username.txt | Where-Object {$_.EventType -eq  "TS   Session Connected" -or $_.EventType -eq "Logon"} | select -ExpandProperty     hostname | sort -Unique

$array2 = Import-Csv $filepath\$username.txt | Where-Object {$_.EventType -eq "TS Session Connected" -or $_.EventType -eq "Logon"} | select -ExpandProperty Date | sort -Unique

#Loops through and singles out each host name, and adds it as a treenode 
for ($i = 0; $i -lt $array.Count; $i++) {
$node = $treeviewHostnames.Nodes.Add($array[$i]) | Out-Null
}

树视图对象:

$treeviewHostnames = New-Object System.Windows.Forms.TreeView
$treeviewHostnames.size = New-Object drawing.Size @(300,378)
$treeviewHostnames.Location = New-Object drawing.Size @(380,165)
$treeviewHostnames.Scrollable = $true

这会为我的treeview对象添加一个唯一的主机名列表,但是我很难将特定的重复子主机名添加到唯一的父主机名。

1 个答案:

答案 0 :(得分:0)

感谢Dan在Powershell.org

解决了这个问题

他的榜样.CSV:

HostName,LastLogon
COMP1,032820151913
COMP1,032720151913
COMP2,032820151913
COMP2,032720151913

他的代码:

    function Add-Node { 
    param 
    ( 
        $RootNode, 
        $HostName,
        $LastLogon
    )

    $newNode = new-object System.Windows.Forms.TreeNode  
    $newNode.Name = "$HostName -- $LastLogon"
    $newNode.Text = "$HostName -- $LastLogon" 

    If(($RootNode.Nodes | Foreach-Object {$_.Tag}) -contains $HostName)
    {
        $HostNode = $RootNode.Nodes | ?{$_.Tag -eq $HostName}
    }
    Else
    {
        $newHostNode = new-object System.Windows.Forms.TreeNode
        $newHostNode.Name = $HostName
        $newHostNode.Text = $HostName
        $newHostNode.Tag = $HostName

        $Null = $RootNode.Nodes.Add($newHostNode)
        $HostNode = $RootNode.Nodes | ?{$_.Tag -eq $HostName}
    }

    $Null = $HostNode.Nodes.Add($newNode)
    }

    $Form = New-Object system.Windows.Forms.Form
    $Form.Text = "TreeView"

    $TreeView = New-Object System.Windows.Forms.TreeView
    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 224
    $System_Drawing_Size.Height = 200
    $TreeView.Size = $System_Drawing_Size

    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 13
    $System_Drawing_Point.Y = 37
    $TreeView.Location = $System_Drawing_Point

    $Form.Controls.Add($TreeView)

    $TreeNode = New-Object -TypeName System.Windows.Forms.TreeNode -ArgumentList 'Computers'
    $TreeNode.Tag = 'Computers'

    $CSV = Import-CSV .\LogonInfo.txt

    Foreach($Computer in $CSV)
    {
Add-Node -RootNode $TreeNode -HostName $Computer.HostName -LastLogon $Computer.LastLogon
    }

    $Null = $TreeView.Nodes.Add($TreeNode)

    $TreeView.ExpandAll()
    $Form.ShowDialog()

他的解释: 这个脚本基本上是做什么的 1.设置一个简单的表单以在TreeView中显示TreeNode 2.添加标记为计算机的根TreeNode,我们将所有计算机添加到此TreeNode 3.导入CSV文件 4.循环CSV并在CSV中添加一台foreach计算机节点。 Add-Node函数检查是否存在标记等于计算机主机名的子节点,如果存在,我们只需将登录信息添加到该节点。如果不是,我们使用计算机的主机名创建一个新的子节点。接下来,我们选择新创建的节点来添加登录信息。 5.最后,脚本展开所有节点并显示表单。

希望这有用。

感谢Dan的帮助!