使用树视图和重复字符串创建父节点和子节点
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. 最后,脚本展开所有节点并显示表单。
希望这对您有所帮助。
感谢丹的帮助!
我正在创建一个基于 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. 最后,脚本展开所有节点并显示表单。
希望这对您有所帮助。
感谢丹的帮助!