Поиск между узлами TreeView Powershell - PullRequest
1 голос
/ 23 января 2020

TLDR: использовать древовидную структуру для поиска в сетевых папках и показывать результаты в пути к деревьям.

У меня есть инструмент, который устарел и нуждается в обновлении, но источник был потерян поэтому я его перестраивал. Это единственное, что я борюсь с воссозданием.

В Powershell ISE, имеющем древовидное представление, можно выполнять поиск, который обновляется с $ textbox.add_textchange по мере ввода, чтобы найти соответствующий текст.

Вот пример:

enter image description here


function Product-Function{
$Product.add_textchanged{
#idk what im doing
                        }
                         }

$Product                          = New-Object system.Windows.Forms.TextBox
$Product.multiline                = $false
$Product.CharacterCasing          = "Upper"
$Product.width                    = 235
$Product.height                   = 20
$Product.location                 = New-Object System.Drawing.Point(20,20)
$Product.Font                     = $MainFont
$Product.Text                     = ""
Product-Function

$TreeView                         = New-Object System.Windows.Forms.TreeView
$TreeView.Location                = New-Object System.Drawing.Point(20, 55)
$TreeView.Size                    = New-Object System.Drawing.Size(540, 320)

$WinNode                          = New-Object System.Windows.Forms.TreeNode
$WinNode.text                     = "Windows"
$WinNode.name                     = "Windows"
[void]$TreeView.Nodes.Add($WinNode).FullPath

$WinCommonNode                    = New-Object System.Windows.Forms.TreeNode
$WinCommonNode.text               = "Common"
$WinCommonNode.name               = "Common"
[void]$WinNode.Nodes.Add($WinCommonNode)

$WinCommonNCNode                  = New-Object System.Windows.Forms.TreeNode
$WinCommonNCNode.text             = "Non_Certified"
$WinCommonNCNode.name             = "Non_Certified"
[void]$WinCommonNode.Nodes.Add($WinCommonNCNode)

$WinLicensedNode                  = New-Object System.Windows.Forms.TreeNode
$WinLicensedNode.text             = "Licensed"
$WinLicensedNode.name             = "Licensed"
[void]$WinNode.Nodes.Add($WinLicensedNode)

$WinLicensedNCNode                = New-Object System.Windows.Forms.TreeNode
$WinLicensedNCNode.text           = "Non_Certified"
$WinLicensedNCNode.name           = "Non_Certified"
[void]$WinLicensedNode.Nodes.Add($WinLicensedNCNode)

$WinRestrictedNode                = New-Object System.Windows.Forms.TreeNode
$WinRestrictedNode.text           = "Restricted"
$WinRestrictedNode.name           = "Restricted"
[void]$WinNode.Nodes.Add($WinRestrictedNode)

$WinRestrictedNCNode              = New-Object System.Windows.Forms.TreeNode
$WinRestrictedNCNode.text         = "Non_Certified"
$WinRestrictedNCNode.name         = "Non_Certified"
[void]$WinRestrictedNode.Nodes.Add($WinRestrictedNCNode)


#macs

$MacNode                          = New-Object System.Windows.Forms.TreeNode
$MacNode.text                     = "Macaroni"
$MacNode.name                     = "Macaroni"
$Macaroni                         = "\\NetworkLocation\Macintosh"
[void]$TreeView.Nodes.Add($MacNode).FullPath

#=======================================================================================================================
                                                  #File Paths#
#=======================================================================================================================
$WinCommon = "\\NetworkLocation\DesktopServices\Common"
$WinLicensed = "\\NetworkLocation\DesktopServices\Licensed"
$WinRestricted = "\\NetworkLocation\DesktopServices\Restricted"
$WinCommonNC = "\\NetworkLocation\DesktopServices\Common\_Non-Certified"
$WinLicensedNC = "\\NetworkLocation\DesktopServices\Licensed\_Non-Certified"
$WinRestrictedNC = "\\NetworkLocation\DesktopServices\Restricted\_Non-Certified"

#=======================================================================================================================

$array                            = @(Get-ChildItem -Path $WinCommon)
   foreach ( $obj in $array ) {
$WCNode                           = New-Object System.Windows.Forms.TreeNode
$WCNode.text                      = $obj
[void]$WinCommonNode.Nodes.Add($WCNode).FullPath
     }
$array                            = @(Get-ChildItem -Path $WinLicensed)
   foreach ( $obj in $array ) {
$WLNode                           = New-Object System.Windows.Forms.TreeNode
$WLNode.text                      = $obj
[void]$WinLicensedNode.Nodes.Add($WLNode).FullPath
     }
$array                            = @(Get-ChildItem -Path $WinRestricted)
   foreach ( $obj in $array ) {
$WRNode                           = New-Object System.Windows.Forms.TreeNode
$WRNode.text                      = $obj
[void]$WinRestrictedNode.Nodes.Add($WRNode).FullPath
     }

$array                            = @(Get-ChildItem -Path $WinCommonNC)
   foreach ( $obj in $array ) {
$WCNCNode                         = New-Object System.Windows.Forms.TreeNode
$WCNCNode.text                    = $obj
[void]$WinCommonNCNode.Nodes.Add($WCNCNode).FullPath
     }
$array                            = @(Get-ChildItem -Path $WinLicensedNC)
   foreach ( $obj in $array ) {
$WLNCNode                         = New-Object System.Windows.Forms.TreeNode
$WLNCNode.text                    = $obj
[void]$WinLicensedNCNode.Nodes.Add($WLNCNode).FullPath
     }
$array                            = @(Get-ChildItem -Path $WinRestrictedNC)
   foreach ( $obj in $array ) {
$WRNCNode                         = New-Object System.Windows.Forms.TreeNode
$WRNCNode.text                    = $obj
[void]$WinRestrictedNCNode.Nodes.Add($WRNCNode).FullPath
     }

     #mac stuff

$array                            = @(Get-ChildItem -Path $Macaroni)
   foreach ( $obj in $array ) {
$SubMac                           = New-Object System.Windows.Forms.TreeNode
$SubMac.text                      = $obj
[void]$MacNode.Nodes.Add($SubMac).FullPath
     }
#======================================================================================================================= 

Итак, мой вопрос: как я могу сделать фильтр текстового поля все элементы в узлах, для имен совпадений и показывают, где они находятся внутри узлов

Причина, по которой у нас есть этот инструмент, состоит в том, что у нас есть сотни установок программного обеспечения в этих папках, и этот инструмент делает его легко найти точное местоположение. Это было сделано в прошлом, и мне просто нужно переделать его, но я не могу понять, как отфильтровать данные, извлеченные из узлов.

================== Все выше отвечено.

Дополнительный вопрос. Есть ли способ скрыть лишние несоответствующие элементы и сжать узлы, у которых нет совпадений. Наш старый инструмент делает, и это облегчает чтение местоположения. enter image description here

старый инструмент слева, мой новый инструмент справа.

1 Ответ

1 голос
/ 23 января 2020

Вы можете создать рекурсивный метод для получения всех узлов или поиска между всеми узлами и возврата первого вхождения текста в узлы:

enter image description here

Вот код:

Add-Type -AssemblyName System.Windows.Forms

function GetNodes([System.Windows.Forms.TreeNodeCollection] $nodes)
{
     foreach ($n in $nodes) {
        $n
        GetNodes($n.Nodes)
     }
}

$form = New-Object System.Windows.Forms.Form
$form.Text ="Test"
$form.Controls.AddRange(@(
    ($txt = [System.Windows.Forms.TextBox] @{
        Location = [System.Drawing.Point]::new(8, 8);
        Width = 100;
    }),
    ($btn = [System.Windows.Forms.Button] @{
        Location = [System.Drawing.Point]::new(120, 8);
        Width = 50;
        Text = "Search";
    }),
    ($tree = [System.Windows.Forms.TreeView] @{
        Location = [System.Drawing.Point]::new(8, 40);
        Width = 170;
        HideSelection = $false
    })
))
$form.AcceptButton= $btn

$tree.Nodes.Add("A1", "A1")
$tree.Nodes.Add("A2", "A2")
$tree.Nodes[0].Nodes.Add("A11", "A11")
$tree.Nodes[0].Nodes.Add("A12", "A12")
$tree.Nodes[1].Nodes.Add("A21", "A21")
$tree.Nodes[1].Nodes.Add("A22", "A22")

$btn.Add_Click({param($sender,$e)
    $nodes = GetNodes($tree.Nodes)
    foreach ($node in $nodes) {
        if($node.Text -like $txt.Text){
            $tree.SelectedNode = $node
            $node.EnsureVisible()
            break
        }
     }
})
$form.ShowDialog() | Out-Null
$form.Dispose()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...