1 votes

PowerShell : Remplir le TreeView avec la hiérarchie des répertoires

J'essaie donc d'écrire un script PowerShell avec une entrée GUI ; l'idée étant que les utilisateurs finaux voient une arborescence imbriquée du système de fichiers. Ils cochent quelques dossiers, appuient sur un bouton, ...la magie opère.

J'ai les points de montage (je ne suis pas encore sûr de ce qui se passe avec C), le problème est que je n'arrive pas à comprendre / trouver comment énumérer et ajouter comme des nœuds imbriqués.

Les résultats de mes recherches semblent tous m'orienter vers des exemples de C#, C++, etc. qui ne sont pas utiles.

Des idées ?


Voici ce que j'ai obtenu

What i got

C'est ce que je veux (mais cela ne cesse de s'aggraver).

What i want

Voici donc mon code jusqu'à présent

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

0 votes

Lien vers le code c#. Le C# peut être converti en powershell. Par ailleurs, quelle version de powershell utilisez-vous ?

1voto

JosefZ Points 1465

C'est aussi simple que treeView.Nodes.Add méthode renvoie le TreeNode qui a été ajouté à la collection, c'est-à-dire un objet du type [System.Windows.Forms.TreeNode] type. Par conséquent, vous pouvez appliquer Add pour créer de nouveaux nœuds d'arbre correspondant aux éléments imbriqués dans le système de fichiers, comme suit :

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

Résultat :

File System Tree View

Explication (notez aussi les lignes de commentaires à l'intérieur du code) : remarquez surtout que :

  • L'exemple ci-dessus est limité aux lecteurs réseau utilisant where Drivetype=4 simplement pour mon à des fins de débogage, et
  • AddNodes La sous-routine s'appelle elle-même récursivement pour les sous-dossiers s'il y en a.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X