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

Creating parent and child nodes with a treeview and duplicate strings

我正在创建一个基于 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

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

感谢 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标记为Computers,我们将把所有的计算机添加到这个TreeNode 3.导入CSV文件 4. 遍历 CSV 并为 CSV 中的每台计算机添加一个节点。 Add-Node 函数检查是否存在标记等于计算机主机名的子节点,如果存在,我们只需将登录信息添加到该节点。如果不是,我们使用计算机的主机名创建一个新的子节点。接下来,我们select为新创建的节点添加登录信息。 5. 最后,脚本展开所有节点并显示表单。

希望这对您有所帮助。

感谢丹的帮助!