PowerShell: preenchendo o TreeView com a hierarquia de diretórios

1

Então, estou tentando escrever um script do PowerShell com uma entrada da GUI; idéia sendo que os usuários finais vêem um TreeView aninhado do sistema de arquivos. Eles marcam algumas pastas, apertem um botão ... a mágica acontece.

Eu tenho os pontos de montagem (ainda não sei o que está acontecendo com C), o problema é que não consigo descobrir / encontrar como enumerar e adicionar como nós aninhados.

Todos os meus resultados de pesquisa parecem apontar-me para exemplos C #, C ++, etc; não é o útil.

Idéias?

Isso é o que eu consegui

Istoéoqueeuquero(mascontinuaindomaisafundo)

Entãoesteéomeucódigoatéagora

$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()
    
por Conan1989 22.12.2015 / 10:13

1 resposta

1

É simples, pois treeView.Nodes.Add method retorna o < em> TreeNode que foi adicionado à coleção, ou seja, um objeto de [System.Windows.Forms.TreeNode] type. Portanto, você pode aplicar o método Add para criar novos nós de árvore correspondendo a itens aninhados no sistema de arquivos da seguinte forma:

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()

Resultado :

Explicação (observe as linhas de comentário dentro do código também): observe principalmente que:

  • o exemplo acima é limitado a unidades de rede que usam a cláusula where Drivetype=4 apenas para fins de depuração my e
  • A sub-rotina AddNodes chama-se recursivamente para subpastas, se houver.
por 27.04.2018 / 21:26

Tags