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 :

Parcours d'un fichier JSON [PowerShell]


Sujet :

Scripts/Batch

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2012
    Messages : 9
    Par défaut Parcours d'un fichier JSON
    Bonjour,

    je suis en train d'expérimenter le traitement de fichiers JSON via Powershell, et je cherche à accéder à un élément du fichier de façon dynamique sans succès.
    Plus précisément, je teste sur le fichier JSON des marque pages Firefox, qui a la structure (simplifiée) suivante :
    Code JSON : 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
    {policies :{
    //tout un tas de blabla dont j'ai pas besoin
        "ManagedBookmarks": [
        {
        "toplevel_name": "mes marques-pages"
        },
            {
            "name" : "nom du dossier de marques-pages 1"
            "children:" [ 
                { 
                "name": "nom du favori 1",
                "value": " lien du favori 1"
                }, 
                { 
                "name": "nom du favori 2",
                "value": " lien du favori 2"
                }, 
                "children:" [ 
                    { 
                    "name" : "nom du sous dossier de marques-pages 2"
                    "children:" [ 
                { 
                    "name": "nom du favori 3",
                    "value": " lien du favori 4"
                }, 
    }

    l'accès au fichier et la lecture écriture ne me posent pas de soucis si je pointe bien ainsi (par exemple pour aller à l'élément "nom du favori 3":
    Code PowerShell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $fichierJSON = chemin d accès au fichier
    $docJSON = Get-Content -path $fichierJSON -raw | ConvertFrom-Json
    $docJSON.Policies.ManagedBookMarks.children.children

    Ce que je cherche à faire est de remplacer ".children.children" par une variable dynamique par exemple :
    Code PowerShell : Sélectionner tout - Visualiser dans une fenêtre à part
    $Arborescence = ".children" * 2 #la valeur dépendant de la profondeur désirée.

    et du coup, obtenir quelque chose comme :
    Code PowerShell : Sélectionner tout - Visualiser dans une fenêtre à part
    $docJSON.policies.ManagedBookmarks.$arborescence

    L'idée étant de représenter et d'exploiter le contenu des favoris dans une treeview (je sais, dit comme ça ça peut faire étrange puisqu'on peut le faire depuis Firefox, mais comme j'ai dit : c'est pour expérimenter)

    J'ai essayé tout un tas de syntaxes, mais n'étant pas un expert du Powershell je n'arrive pas à voir où ça pêche.
    Cela fait deux jours que j'essaie de comprendre comment faire ça sans succès (et j'en ai épluché des sites web ) et du coup je lance une bouteille à la mer.

    En vous remerciant par avance de votre aide

  2. #2
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    Bonjour,

    Afin de faire des tests pourrais tu fournir un json valide

    https://jsonformatter.curiousconcept.com/#

  3. #3
    Membre habitué
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2012
    Messages : 9
    Par défaut
    voici le fichier :

    Code JSON : 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
    {
       "policies":{
          "EnableTrackingProtection":{
             "Value":true,
             "Locked":true,
             "Cryptomining":false,
             "Fingerprinting":false
          },
          "ExtensionSettings":{
             "*":{
                "blocked_install_message":"Il est interdit d\u0027installer des extensions tiers pour Firefox",
                "installation_mode":"blocked"
             }
          },
          "3rdparty":{
             "Extensions":{
                "legacy-browser-support@mozilla.org":{
                   "alternative_browser_path":"${ie}",
                   "alternative_browser_arguments":"${url}",
                   "firefox_path":"${firefox}",
                   "firefox_arguments":"${url}",
                   "url_greylist":[
                      "example.org"
                   ],
                   "keep_last_firefox_tab":true,
                   "show_transition_screen":0,
                   "use_ie_site_list":false
                }
             }
          },
          "SearchEngines":{
             "Default":"Qwant"
          },
          "SecurityDevices":{
             "CryptoLib":"file:///C:/Windows/System32/cps3_pkcs11_w32.dll"
          },
          "DisableAppUpdate":true,
          "DisableFirefoxStudies":true,
          "ManagedBookmarks":[
             {
                "toplevel_name":"Mes marque-pages"
             },
             {
                "name":"Favoris Excel",
                "children":[
                   {
                      "name":"Créer ses propres icônes de mise en forme conditionnelle",
                      "url":"http://cooking-excel.com/2016/09/creer-icones-mise-forme-conditionnelle/"
                   },
                   {
                      "name":"Excel-Malin.com - Tout sur Excel et VBA",
                      "url":"http://excel-malin.com/"
                   },
                   {
                      "name":"Qwant",
                      "url":"http://qwant.com"
                   }
                ]
             },
             {
                "name":"Scripting",
                "children":[
                   {
                      "name":"Active Directory",
                      "children":[
                         {
                            "name":"filtres adsi",
                            "url":"https://social.technet.microsoft.com/wiki/contents/articles/5392.active-directory-ldap-syntax-filters.aspx"
                         },
                         {
                            "name":"requêtage LDAP",
                            "url":"https://social.technet.microsoft.com/wiki/contents/articles/5392.active-directory-ldap-syntax-filters.aspx"
                         },
                         {
                            "name":"SelfADSI  The ADSI Scripting Tutorial - The LDAP Scripting Tutorial",
                            "url":"http://www.selfadsi.org/index.htm"
                         }
                      ]
                   },
                   {
                      "name":"Powershell",
                      "children":[
                         {
                            "name":"Building HTML reports in PowerShell with ConvertTo-Html – 4sysops",
                            "url":"https://4sysops.com/archives/building-html-reports-in-powershell-with-convertto-html/"
                         },
                         {
                            "name":"Contributions",
                            "url":"https://laurent-dardenne.developpez.com/#L2-4"
                         },
                         {
                            "name":"How to Manage File System ACLs with PowerShell Scripts",
                            "url":"https://blog.netwrix.com/2018/04/18/how-to-manage-file-system-acls-with-powershell-scripts/"
                         },
                         {
                            "name":"Graphes",
                            "children":[
                               {
                                  "name":"Building a Chart Using PowerShell and Chart Controls  Learn Powershell  Achieve More",
                                  "url":"https://learn-powershell.net/2016/09/18/building-a-chart-using-powershell-and-chart-controls/"
                               },
                               {
                                  "name":"Creating Simple Charts in WPF with PowerShell – smsagent",
                                  "url":"https://smsagent.blog/2016/05/23/creating-simple-charts-in-wpf-with-powershell/"
                               }
                            ]
                         },
                         {
                            "name":"MultiThread",
                            "children":[
                               {
                                  "name":"La gestion des jobs Powershell  Powershell Scripts",
                                  "url":"https://balladelli.com/la-gestion-des-jobs-powershell/"
                               },
                               {
                                  "name":"Script Multi threading - Powershell to Run Commands in Parallel",
                                  "url":"https://gallery.technet.microsoft.com/scriptcenter/Multi-threading-Powershell-d2c0e2e5#content"
                               }
                            ]
                         }
                      ]
                   }
                ]
             }
          ]
       }
    }

    merci beaucoup

  4. #4
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    Merci.

    Je ne pense pas que nous puissions simplement rechercher tel que tu le souhaites.
    Cela fait me fait penser au xpath XML ou DOM.

    Mais après réflexion pourquoi vouloir faire cela ça le treeview fonctionne par noeud comme la représentation de ton objet ce qui semble plutôt être pratique. Non ?

  5. #5
    Membre habitué
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2012
    Messages : 9
    Par défaut
    En fait, il s'agit de gérer des groupes de favoris en fonction de services. Par exemple, le service RH a droit à tels et tels favoris ; le service info à d'autres, etc.
    Il a été décidé (pour ne pas avoir des dizainesde favoris chez tout le monde) de créer un fichier policies.json par service qui sera déployé par GPO sur les postes concernés (chaque policies.json étant dans le répertoire au nom de son service sur un partage accessible pour que les GPOs recopient le bon fichier au bon endroit).

    Du coup, pour faciliter la mise à jour des favoris dans les fichiers j'avais dans l'idée de faire une interface qui affiche la liste des dossiers représentant les services, et dès qu'on sélectionne le-dit service, ça affiche dans la treeview le contenu des favoris de façon plus lisible et pratique à éditer. Comme tu l'as souligné, la treeview est le composant parfait pour ce genre de chose.

    Mon souci était donc de convertir l'arborescence en fonction du nombre de parents du noeud sélectionné dans la treeview en une série de ".children" représentant la profondeur du path dans le JSON. Dans la treeview, le path du noeud sélectionné apparaît par exemple en "Favoris Service Info\Administration", et pas en ".children.children".

    Après pas mal d'essais et de recherches, j'ai fini par trouver ce qui semble être la bonne syntaxe dans un site internet :
    Code PowerShell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #récupération du nombre d'ancêtres du noeud sélectionné :
    $nbAncêtres = ($treeMarquePages.selectedNode.parent.fullpath.split($treeMarquePages.pathSeparator)).count
     
    #création de l'arborescence en fonction du nb d'ancêtres :
    $arborescenceJSON = ("Policies.ManagedBookmarks" + ".children" * $nbAncêtres)
    # ça nous donne par exemple :  Policies.ManagedBookmarks.children.children.children
     
    #accès à l'élément du JSON correspondant au noeud sélectionné dans la treeview pour modification des propriétés :
    invoke-expression "`$docJSON.$arborescenceJSON" | where-object {$_.name -eq $($treeMarquePages.selectedNode.text)} | forEach-object {
        $_.name = $txtLibelléMarquePage.text
        $_.url = $txtURLMarquePage.text
    }

    Je vais me pencher un peu plus sur ce "invoke-expression" afin de voir exactement ce que ça fait et comment ça fonctionne.

    Je te remercie en tout cas pour ton aide

  6. #6
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    Invoke-Expression
    Bien joué, je n'y ai pas pensé car je ne l'utilise jamais 😋

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

Discussions similaires

  1. ouverture, parcours de fichier JSON
    Par luclechanceux dans le forum Général Python
    Réponses: 2
    Dernier message: 21/10/2011, 17h56
  2. Parcours d'un fichier et insertion dans une base de données !
    Par condor_01 dans le forum Général Java
    Réponses: 2
    Dernier message: 24/04/2008, 09h24
  3. Parcours d'un fichier selon plusieurs crièteres
    Par RR instinct dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 21/07/2006, 15h25
  4. Parcours d'un fichier
    Par vallica dans le forum Langage
    Réponses: 1
    Dernier message: 27/06/2006, 22h08
  5. Parcours d'un fichier CSV
    Par Premium dans le forum C
    Réponses: 2
    Dernier message: 29/05/2006, 00h01

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