PowerShell:使用目录层次结构填充 TreeView

PowerShell:使用目录层次结构填充 TreeView

因此,我尝试编写一个带有 GUI 输入的 PowerShell 脚本;想法是让最终用户看到文件系统的嵌套 TreeView。他们勾选一些文件夹,点击一个按钮,...奇迹发生了。

我有挂载点(不确定 C 发生了什么),问题是我似乎无法弄清楚/找到如何枚举并添加为嵌套节点。

我的搜索结果似乎都指向 C#、C++ 等示例;但没用。

有想法吗?


这就是我得到的

我得到了什么

这就是我想要的(但要继续深入)

我想要的是

这是我目前的代码

$objDriveLetters = GET-WMIOBJECT –query "SELECT * from win32_logicaldisk"
$form = New-Object System.Windows.Forms.Form
$treeView = New-Object System.Windows.Forms.TreeView
$treeView.Dock = 'Fill'
$treeView.CheckBoxes = $true

foreach ($iDrive in $objDriveLetters)
    {
        $DriveRoot = Get-Item $iDrive.DeviceID
        #$FolderRoot = Get-ChildItem -Path $iDrive.DeviceID
        $FolderRoot = Get-Item -Path $iDrive.DeviceID
        $treeView.Nodes.Add($FolderRoot.FullName, $FolderRoot.FullName)
    }

$form.Controls.Add($treeView)
$form.ShowDialog()

答案1

很简单treeView.Nodes.Add方法返回树节点添加到集合中,即[System.Windows.Forms.TreeNode]类型的对象。因此,您可以对其应用Add方法来创建与文件系统嵌套项相对应的新树节点,如下所示:

Set-StrictMode -Version latest
Function AddNodes ( $Node, $FSObject ) {
    $NodeSub = $Node.Nodes.Add($FSObject.FullName, $FSObject.Name)
    if ( $FSObject -is [System.IO.DirectoryInfo] ) {
        $FSObjSub = $FSObject | 
                Get-ChildItem <#-Directory<##> -ErrorAction SilentlyContinue
        foreach ( $FSObj in $FSObjSub ) {
            AddNodes $NodeSub $FSObj
        }
    }
}

$objDriveLetters = GET-WMIOBJECT –query "SELECT * from win32_logicaldisk where Drivetype=4"
$form = New-Object System.Windows.Forms.Form
$treeView = New-Object System.Windows.Forms.TreeView
$treeView.Dock = 'Fill'
$treeView.CheckBoxes = $true

foreach ($iDrive in $objDriveLetters)
{
    # ensure that a drive is accessible (e.g. a medium is inserted into DVD drive)
    if ( Test-Path $iDrive.DeviceID ) {
        # get a drive root e.g. C:\ as C: refers to current directory
        $DriveRootPath = Join-Path -ChildPath \ -Path $iDrive.DeviceID
        $DriveRoot = Get-Item -Path $DriveRootPath
        AddNodes $treeView $DriveRoot
    }
}

[void]$form.Controls.Add($treeView)
[void]$form.ShowDialog()

结果

文件系统树视图

解释(还请注意代码中的注释行):主要注意:

  • 上面的例子仅限于网络驱动器使用where Drivetype=4条款我的调试目的,以及
  • AddNodes如果有子文件夹,子程序将递归调用自身。

相关内容