IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Scripts/Batch Discussion :

Récupération de noms cochés dans un treeview [PowerShell]


Sujet :

Scripts/Batch

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2016
    Messages : 9
    Points : 9
    Points
    9
    Par défaut Récupération de noms cochés dans un treeview
    Bonjour à tous,

    Je n'ai pas énormément d'expérience dans le scripting mais en m’intéressant à PowerShell j'en suis arrivé à vouloir utiliser treeview dans le but de sélectionner des fichiers et répertoires à sauvegarder ensuite avec la commande robocopy.
    Sur le web, j'ai pu récupérer des bouts de scripts que j'ai assemblés pour essayer de faire quelque chose qui fonctionne.
    Je suis loin de comprendre toutes les lignes et je commence à en avoir un peu marre de tourner en rond, cependant j'aurais aimé le "finir" avant de travailler quelque chose de beaucoup moins costaud pour mon niveau ! Peut-être que vous pourriez m'apporter un peu d'aide.

    Donc lorsqu'on coche un nœud parent, les nœuds enfants sont tous cochés (ceci est vrai uniquement lorsque l'arborescence est dépliée) et lorsque tous les nœuds enfants sont cochés, le nœud parent l'est également.
    Ce que j'aimerais faire, au clique du bouton "OK", c'est récupérer le nom du dossier parent uniquement, lorsque tous les nœuds enfants sont cochés. Quand tous les nœuds enfants ne sont pas cochés, j'aimerais dans ce cas récupérer ceux qui le sont.
    Quand un nœud est décoché, bien sûr dans ce cas je ne souhaiterais pas récupérer son nom.

    Pour le moment je ne vois même pas comment récupérer une de ces valeurs et entre autres, je ne comprends pas bien la commande (le terme exact ne semble pas me venir) "AfterCheck".

    Voilà donc le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
        $nul = "<NULL>"
        $type = "Directory", "File"
    
         
        function Show-Error([string]$mes) {
          [Windows.Forms.MessageBox]::Show($mes, "Error",
            [Windows.Forms.MessageBoxButtons]::OK,
            [Windows.Forms.MessageBoxIcon]::Exclamation
          )
        }
         
        function Add-RootsTree {
          [IO.Directory]::GetLogicalDrives() | % {
            $nod = $tvRoots.Nodes.Add($_)
            $nod.Nodes.Add($nul)
          }
        }
         
        function Add-Folders {
          $_.Node.Nodes.Clear()
         
          try {
            foreach ($i in [IO.Directory]::GetDirectories($_.Node.FullPath)) {
              $node = $_.Node.Nodes.Add([IO.Path]::GetFileName($i))
              $node.Tag = $type[0]
              $node.Nodes.Add($nul)
            }
          }
          catch {
            Show-Error $_.Exception.Message
          }
        }
         
        function Add-Files {
          try {
            foreach ($i in [IO.Directory]::GetFiles($_.Node.FullPath)) {
              $node = $_.Node.Nodes.Add([IO.Path]::GetFileName($i))
              $node.Tag = $type[1]
            }
          }
          catch {}
        }
         
         
        $tvRoots_BeforeExpand= {
          Add-Folders
          Add-Files
        }
         
    
    
    
         function checkChildNode($node) {
     $checkStatus = $node.checked
      foreach ($n in $node.nodes) {
       $n.checked = $checkstatus
       checkChildNode($n)
      }
    }
    
    function checkParentNode($node) {
     $parent = $node.parent
     if($parent -eq $null) {
       return
     }
     $parent.checked = $true
     foreach ($n in $parent.nodes) {
        if(!$n.checked) {
          $parent.checked = $false
          break
        }  
      }
      checkparentNode($parent)
    }
    
    
        function frmMain_Show {
          Add-Type -AssemblyName System.Windows.Forms
          [Windows.Forms.Application]::EnableVisualStyles()
         
          $ico = [Drawing.Icon]::ExtractAssociatedIcon(($PSHome + '\powershell.exe'))
         
          $frmMain = New-Object Windows.Forms.Form
          $tvRoots = New-Object Windows.Forms.TreeView
          #
          #tvRoots
          #
          $tvRoots.Dock = "Fill"
          $tvRoots.CheckBoxes = $true
          $tvRoots.Add_AfterSelect($tvRoots_AfterSelect)
     
          $tvRoots.Add_BeforeExpand($tvRoots_BeforeExpand)
          
          
          
          
          $TV_AfterCheck = {
        $tvRoots.Remove_AfterCheck($TV_AfterCheck)
        checkChildNode($_.node)
        checkParentNode($_.node)
    
        $tvRoots.Add_AfterCheck($TV_AfterCheck)
    }
    $tvRoots.Add_AfterCheck($TV_AfterCheck)
          
          
    $ButtonOK = New-Object System.Windows.Forms.Button
    $ButtonOK.DialogResult = 'OK'
    $ButtonOK.Location = New-Object System.Drawing.Point(245,300)
    $ButtonOK.Size = New-Object System.Drawing.Size(75,23) 
    $ButtonOK.Name = 'ButtonOK'
    $ButtonOK.Text = 'OK'
    $ButtonOK.UseVisualStyleBackColor = $True
          
          
          #frmMain
          #
          $frmMain.ClientSize = New-Object Drawing.Size(350, 350)
          $frmMain.Controls.AddRange(@($tvRoots, $sbPanel))
          $frmMain.FormBorderStyle = "FixedSingle"
          $frmMain.Icon = $ico
          $frmMain.StartPosition = "CenterScreen"
          $frmMain.Text = "Explorer Style Script"
          $frmMain.Add_Load({Add-RootsTree})
         
     
    
    $frmMain.Controls.Add($ButtonOK)
    $frmMain.Controls.Add($tvroots)
    
    
    
    
          [void]$frmMain.ShowDialog()
    
        }
         
        frmMain_Show

  2. #2
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Salut,
    Citation Envoyé par je0AA Voir le message
    j'aurais aimé le "finir" avant de travailler quelque chose de beaucoup moins costaud pour mon niveau
    C'est l'objet qui nécessite ce type de code. C'est de débuter avec ce type de traitement qui pose pb à mon avis.

    Rapido, essaie qq chose comme ça :
    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    ...
    #-->
      #Ajout
    function Get-CheckedNodes {
     param( $nodes)
       foreach($aNode in $nodes)
       {
        if($aNode.Checked)
        { Write-host  $aNode.Text }
        if ($aNode.Nodes.Count -ne 0)
        { Get-CheckedNodes $aNode.Nodes }
       }
    } 
     #<---
     
    function frmMain_Show {
      ...
     
     [void]$frmMain.ShowDialog()
      #Ajout 
     Get-CheckedNodes $tvRoots.nodes          
     
    }
    En passant, on peut créer des GUI avec Powershell mais ce n'est pas pas son objectif premier qui est justement d'automatiser des traitements sans nécessiter de GUI
    Visual Studio gratuit et C# sont bien plus efficace pour cela.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2016
    Messages : 9
    Points : 9
    Points
    9
    Par défaut
    Merci beaucoup pour la réponse, je vais essayer le code.

    Et c'est vrai qu'en m'intéressant à Powershell dans le but d'automatiser des tâches j'ai un peu dévié en trouvant comment lancer un explorer pour sélectionner un fichier ou un répertoire simplement puis ensuite sur le treeview qui est beaucoup moins simple.
    Je trouvais l'outil graphique sympa à essayer mais je ne m'y attarderai pas trop ou alors en suivant vos conseils mais à priori je vais me concentrer sur powershell, et l'automatisation !

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2016
    Messages : 9
    Points : 9
    Points
    9
    Par défaut
    Voilà j'ai juste ajouté une ligne pour ne pas recevoir le nom des sous répertoires pou un répertoire parent coché.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function Get-CheckedNodes {
     param( $nodes)
       foreach($aNode in $nodes)
       {
        if($aNode.Checked)
        { Write-host  $aNode.Text }
        if ($aNode.Nodes.Count -ne 0)
        {if(!$aNode.Checked) 
        { Get-CheckedNodes $aNode.Nodes }
       }
      }
    }
    Merci encore d'avoir pris le temps de m'aider !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] Savoir les noeuds cochés dans une TreeView
    Par ekydeta dans le forum VB.NET
    Réponses: 6
    Dernier message: 20/01/2015, 16h12
  2. Réponses: 1
    Dernier message: 13/05/2013, 22h17
  3. Récupérer les lignes cochées dans un treeview
    Par stefsas dans le forum ASP.NET
    Réponses: 0
    Dernier message: 23/07/2010, 16h35
  4. Réponses: 1
    Dernier message: 12/11/2009, 20h19
  5. Récupération nom champ dans liste et faire pointer dessus
    Par Michel Hubert dans le forum Contribuez
    Réponses: 10
    Dernier message: 14/04/2006, 10h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo