因此,我尝试编写一个带有 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
如果有子文件夹,子程序将递归调用自身。