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 :

Problème de séquençage de dates dans un graphique [PowerShell]


Sujet :

Scripts/Batch

  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 Problème de séquençage de dates dans un graphique
    Bonjour,

    Cela fait longtemps que je me suis inscrit sur le site, mais je n'avais pas encore eu l'occasion de poster. C'est donc mon premier message et j'espère être dans le bon forum. Si tel n'est pas le cas, je vous prie de bien vouloir m'en excuser par avance.

    Je rencontre actuellement un problème avec Powershell et les graphiques qui me perturbe un tantinet depuis quelques semaines. En fait, je ne me suis mis à ce langage que parce que telle était la volonté de mon responsable et du coup je suis loin d'en maîtriser toutes les subtilités.

    Voici ce qui m'amène ; on m'a demandé de scripter en powershell une appli de surveillance des répertoires réseaux de notre serveur de données dont les volumes explosent régulièrement. Pour cela, j'ai développé un premier script qui prend en paramètre une liste de répertoires et pour lesquels il enregistre dans des fichiers XML (soit automatiquement avec une tâche planifiée, soit à la demande) la date de l'analyse et la taille (un fichier xml par répertoire)

    Voici quelques exemples des fichiers XML en question :

    Fichier "analyse_skype.xml" :
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <Surveillance_Repertoire>
      <Nom_Repertoire>skype</Nom_Repertoire>
      <Chemin_Repertoire>d:\skype</Chemin_Repertoire>
      <Liste_Analyses>
        <Analyse date_analyse="25/03/2020" taille_analyse="9485" />
        <Analyse date_analyse="31/03/2020" taille_analyse="457162455" />
      </Liste_Analyses>
    </Surveillance_Repertoire>
    Fichier "Analyse_Scripts.xml" :
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <Surveillance_Repertoire>
      <Nom_Repertoire>scripts</Nom_Repertoire>
      <Chemin_Repertoire>d:\scripts</Chemin_Repertoire>
      <Liste_Analyses>
        <Analyse date_analyse="13/08/2019" taille_analyse="274147864" />
        <Analyse date_analyse="20/08/2019" taille_analyse="274149207" />
        <Analyse date_analyse="21/08/2019" taille_analyse="276507816" />
        <Analyse date_analyse="22/08/2019" taille_analyse="276035444" />
        <Analyse date_analyse="24/03/2020" taille_analyse="288466503" />
        <Analyse date_analyse="31/03/2020" taille_analyse="441122889" />
      </Liste_Analyses>
    </Surveillance_Repertoire>
    Fichier "Analyse_Office.xml" :
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <Surveillance_Repertoire>
      <Nom_Repertoire>office</Nom_Repertoire>
      <Chemin_Repertoire>d:\office</Chemin_Repertoire>
      <Liste_Analyses>
        <Analyse date_analyse="13/08/2019" taille_analyse="1324981960" />
        <Analyse date_analyse="20/08/2019" taille_analyse="1324981960" />
        <Analyse date_analyse="21/08/2019" taille_analyse="1324981960" />
        <Analyse date_analyse="22/11/2019" taille_analyse="1324981960" />
        <Analyse date_analyse="13/01/2020" taille_analyse="1324981960" />
        <Analyse date_analyse="25/03/2020" taille_analyse="1324981960" />
        <Analyse date_analyse="31/03/2020" taille_analyse="1324981960" />
      </Liste_Analyses>
    </Surveillance_Repertoire>

    Et ainsi de suite pour tous les répertoires que l'on souhaite surveiller.

    Le problème vient de mon script d'analyse de ces données. L'objectif est de récupérer la liste des fichiers XML du répertoire de rapports et de générer depuis leurs contenus un graphique permettant de visualiser l'évolution de la taille des dossiers. Mon graphique s'affiche sans difficulté si je n'ai qu'un fichier XML à exploiter (ou si j'en charge plusieurs avec des dates d'analyse identiques) ; mais dès que j'utilise des rapports XML avec des dates en plus (dans le cas d'une analyse manuelle, par exemple) ou en moins (si j'analyse un nouveau répertoire : la date de la première analyse ne colle plus avec les autres fichiers), j'obtiens un graphique dont l'axe X représentant les dates est tout désordonné (comme avec les 2 XML indiqués en exemple juste avant).

    Au fil de mes pérégrinations, j'ai testé pas mal de choses dont la modification de l'intervalType pour l'axe X ou les propriétés et méthodes "isXValueIndexed" ou recalculateAxeScale sans grand succès (plus tout un tas d'autres choses dégottées au détour d'internet. C'est en lisant avec intérêt le tuto disponible sur votre site à l'adresse https://plasserre.developpez.com/cours/chart/ que je me suis laissé aller à penser que je pourrai peut-être demander un coup de main.

    Voici donc le code complet que j'avais écrit :

    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
    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
    [reflection.assembly]::loadWithPartialName("System.Windows.Forms") | Out-Null
    [reflection.assembly]::loadWithPartialName("System.Drawing") | Out-Null
    [Reflection.Assembly]::loadWithPartialName("System.Windows.Forms.DataVisualization") | Out-null
     
    # variables :
    $cheminScript = [System.IO.Path]::GetDirectoryName($MyInvocation.MyCommand.Definition)
    $cheminRapports = $cheminScript + "\Rapports"
    $listeFichiersXML = get-childItem -path ($cheminRapports) | Where-Object {$_.Name -match 'xml$'}		# récupère la liste des fichiers XML présents dans le répertoire des rapports
     
    write-host  "liste des fichiers xml dans $cheminRapports :"
    $listeFichiersXML
     
    $global:graphique
     
    # paramétrage du graphique :
    $global:graphique = New-Object System.Windows.Forms.DataVisualization.Charting.Chart				#instanciation de l'objet "graphique"
    $global:graphique.Size = "1800,500"
     
    # paramétrage de la zone de graphe :
    $zoneGraphique = New-Object System.Windows.Forms.DataVisualization.Charting.ChartArea			#instanciation de l'objet  "zone de graphique"
    $zoneGraphique.AxisX.Title = "Date d'analyse"
    $zoneGraphique.AxisY.Title = "Taille (en Giga octets)"
     
    $zoneGraphique.AxisX.Interval = 1 # 0
    $zoneGraphique.AxisY.Interval = 0 # 100
     
    $zoneGraphique.AxisX.LabelStyle.Enabled = $true
    $zoneGraphique.AxisX.LabelStyle.Angle = 90
    $zoneGraphique.AxisY.LabelStyle.Enabled = $true
    $zoneGraphique.AxisY.LabelStyle.Angle = 0
    $graphique.ChartAreas.Add($zoneGraphique)								#ajoute la zone de graphique à l'objet "graphique"
     
    # paramétrage du titre :
    $Title = New-Object System.Windows.Forms.DataVisualization.Charting.Title
    $global:graphique.Titles.Add($Title)
    $global:graphique.Titles[0].Text = "Evolution des répertoires"
     
    # paramétrage de la légende :
    $legende = New-Object System.Windows.Forms.DataVisualization.Charting.Legend
    $legende.IsEquallySpacedItems = $True
    $legende.BorderColor = "Black"
    $legende.Position.Auto = $True
    $legende.Docking = "Bottom"
    $legende.Title = "Répertoires analysés"
    $global:graphique.Legends.Add($Legende)
     
     
    # parcours des XML pour récupérer les données :
    foreach ($nomFichier in $listeFichiersXML)
    {
    	$fichierXML = $cheminRapports + "\" + $nomFichier
    	write-host "étude de $fichierXML"
     
    	$objXML = new-object XML
    	$objXML.load($fichierXML)
     
    	$nomSerieGraphe = $objXML.Surveillance_Repertoire.Chemin_Repertoire		#utilise le nom du répertoire comme nom de série
     
    	$global:graphique.Series.Add($nomSerieGraphe)					#ajoute la série au graphique
    	$global:graphique.Series[$nomSerieGraphe].ChartType = [System.Windows.Forms.DataVisualization.Charting.SeriesChartType]::line
    	#$global:graphique.Series[$nomSerieGraphe].XValueType = [System.Windows.Forms.DataVisualization.Charting.ChartValueType]::DateTime
     
    	$tabDonnées = @{}										#récupération des données depuis le fichier XML pour insertion dans la table de hashage
    	foreach ($analyse in $objXMl.Surveillance_Repertoire.Liste_Analyses.analyse) {$tabDonnées.add($analyse.date_analyse, $analyse.Taille_Analyse)}
     
    	$global:graphique.Series[$nomSerieGraphe].Points.DataBindXY($tabDonnées.Keys, $tabDonnées.Values)		#génération du graphique depuis la hashtable
    }
     
    $Form = New-Object Windows.Forms.Form
    $Form.Text = "Graphique"
    $Form.Width = 900
    $Form.Height = 500
    $Form.controls.add($graphique)
    $Form.Add_Shown({$Form.Activate()})
    $Form.ShowDialog()

    Je pense que je ne dois pas être très loin de la solution finale, mais n'étant pas un expert en Powershell ni en dot.net, je sèche un peu. Je subodore un problème au niveau de la gestion des dates dans le graphique mais à force de tester dans tous les sens, je ne suis plus sûr de rien

    En espérant que mes explications soient suffisamment claires et quelqu'un arrive à me mettre sur la voie.
    Merci par avance et bonne journée à vous

  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
    Les graphiques c'est toujours l'enfer

    Je t'ai ajouté quelques options comme les infobulles, je te laisse dimensionner ta fenêtre qui semble trop petite.

    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
    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
    [reflection.assembly]::loadWithPartialName("System.Windows.Forms") | Out-Null
    [reflection.assembly]::loadWithPartialName("System.Drawing") | Out-Null
    [Reflection.Assembly]::loadWithPartialName("System.Windows.Forms.DataVisualization") | Out-null
     
    # variables :
    $cheminScript = [System.IO.Path]::GetDirectoryName($MyInvocation.MyCommand.Definition)
    $cheminRapports = $cheminScript + "\Rapports"
    $listeFichiersXML = get-childItem -path ($cheminRapports) | Where-Object {$_.Name -match 'xml$'}		# récupère la liste des fichiers XML présents dans le répertoire des rapports
     
    write-host  "liste des fichiers xml dans $cheminRapports :"
    $listeFichiersXML
     
    $global:graphique
     
    # paramétrage du graphique :
    $global:graphique = New-Object System.Windows.Forms.DataVisualization.Charting.Chart				#instanciation de l'objet "graphique"
    $global:graphique.Size = "1800,500"
     
    # paramétrage de la zone de graphe :
    $zoneGraphique = New-Object System.Windows.Forms.DataVisualization.Charting.ChartArea			#instanciation de l'objet  "zone de graphique"
    $zoneGraphique.AxisX.Title = "Date d'analyse"
    $zoneGraphique.AxisY.Title = "Taille (en Giga octets)"
     
    $zoneGraphique.AxisX.LabelStyle.Format = "dd/MM/yyyy"
    $zoneGraphique.AxisX.Interval = 1
    $zoneGraphique.AxisX.IntervalType = [System.Windows.Forms.DataVisualization.Charting.DateTimeIntervalType]::Months
     
    $zoneGraphique.AxisY.Interval = 0 # 100
     
    $zoneGraphique.AxisX.LabelStyle.Enabled = $true
    $zoneGraphique.AxisX.LabelStyle.Angle = 90
    $zoneGraphique.AxisY.LabelStyle.Enabled = $true
    $zoneGraphique.AxisY.LabelStyle.Angle = 0
    $graphique.ChartAreas.Add($zoneGraphique)								#ajoute la zone de graphique à l'objet "graphique"
     
     
    # paramétrage du titre :
    $Title = New-Object System.Windows.Forms.DataVisualization.Charting.Title
    $global:graphique.Titles.Add($Title)
    $global:graphique.Titles[0].Text = "Evolution des répertoires"
     
    # paramétrage de la légende :
    $legende = New-Object System.Windows.Forms.DataVisualization.Charting.Legend
    $legende.IsEquallySpacedItems = $True
    $legende.BorderColor = "Black"
    $legende.Position.Auto = $True
    $legende.Docking = "Bottom"
    $legende.Title = "Répertoires analysés"
    $global:graphique.Legends.Add($Legende)
     
     
    # parcours des XML pour récupérer les données :
    foreach ($nomFichier in $listeFichiersXML)
    {
        $fichierXML = $cheminRapports + "\" + $nomFichier
        write-host "étude de $fichierXML"
     
        $objXML = new-object XML
        $objXML.load($fichierXML)
     
        $nomSerieGraphe = $objXML.Surveillance_Repertoire.Chemin_Repertoire		#utilise le nom du répertoire comme nom de série
     
        $global:graphique.Series.Add($nomSerieGraphe)					#ajoute la série au graphique
        $global:graphique.Series[$nomSerieGraphe].MarkerStyle = [System.Windows.Forms.DataVisualization.Charting.MarkerStyle]::Circle
        $global:graphique.Series[$nomSerieGraphe].ChartType = [System.Windows.Forms.DataVisualization.Charting.SeriesChartType]::Line
        $global:graphique.Series[$nomSerieGraphe].XValueType = [System.Windows.Forms.DataVisualization.Charting.ChartValueType]::DateTime
        $global:graphique.Series[$nomSerieGraphe].LabelFormat = "dd/MM/yyyy"
     
        $data = $objXMl.Surveillance_Repertoire.Liste_Analyses.analyse
        $global:graphique.Series[$nomSerieGraphe].Points.DataBindXY($($data.date_analyse | ForEach-Object{[datetime]::ParseExact($_, "dd/MM/yyyy", $null)}), $data.Taille_Analyse)
     
        foreach($point in $global:graphique.Series[$nomSerieGraphe].Points)
        {
            $point.ToolTip = "$nomSerieGraphe : #VALX, #VAL"
        }
    }
     
    $Form = New-Object Windows.Forms.Form
    $Form.Text = "Graphique"
    $Form.Width = 900
    $Form.Height = 500
    $Form.controls.add($graphique)
    $Form.Add_Shown({$Form.Activate()})
    $Form.ShowDialog()

  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
    Grand merci ; c'est exactement ce que je cherchais à faire.

    Effectivement, la zone de graphe était trop petite mais ça, je voulais gérer ça par la suite en rajoutant un zoom et des ascenseurs comme indiqué dans le tuto. C'était dans ma liste d'améliorations à apporter, comme les infobulles et une option de filtrage par dates.

    Au vu du code, je m'étais donc bien planté sur la gestion des formats de date. J'avais tenté un "parseexact" dans le databindXY, mais j'avais dû sûrement mal l'employer car je n'avais que des erreurs sans vraiment comprendre ce qui se passait.

    mille merci pour ta réponse rapide

  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
    Je croit que le hashtable aussi te posait problème car il modifiait l'ordre d'origine.

  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
    Bonjour,
    Alors que tout fonctionnait nickel chrome sur mon pc perso, j'ai essayé le code sur mon pc pro et patatra ; j'ai l'erreur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Exception lors de l'appel de « ParseExact » avec « 3 » argument(s) : « La chaîne n'a pas été reconnue en tant que DateTime valide. »
    Au niveau de D:\Scripts\Powershell\ScanSDS\SuiviTaille\test_graphique.ps1 : 70 Caractère : 125
    +     $global:graphique.Series[$nomSerieGraphe].Points.DataBindXY($($data.date_analyse | ForEach-Object{[datetime]::ParseExact <<<< ($_, 'dd/MM/yyyy', $null)}), $data.Taille_Analyse)
        + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
        + FullyQualifiedErrorId : DotNetMethodException
     
    Exception lors de l'appel de « DataBindXY » avec « 2 » argument(s) : « La valeur ne peut pas être null.
    Nom du paramètre : yValues »
    Au niveau de D:\Scripts\Powershell\ScanSDS\SuiviTaille\test_graphique.ps1 : 70 Caractère : 64
    +     $global:graphique.Series[$nomSerieGraphe].Points.DataBindXY <<<< ($($data.date_analyse | ForEach-Object{[datetime]::ParseExact($_, 'dd/MM/yyyy', $null)}), $data.Taille_Analyse)
        + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
        + FullyQualifiedErrorId : DotNetMethodException

    J'ai beau chercher l'erreur au niveau du parseExact ; je ne comprends pas ce qui se passe, puisque la syntaxe est bonne et fonctionne sur un Windows 8 sans souci.
    Du coup j'ai testé d'autres pistes pour convertir la string en date pour remplacer le parseexact, mais sans succès. au mieux j'ai que dalle, au pire une erreur.

    Se pourrait-il qu'il y ait ce bug en raison d'une différence de versions de powershell ? Sur mon pc perso, je suis en Win8 et powershell V4 avec un dot net v4.8. Sur le pc pro, c'est du Windows 7 en powershell v2.0 et un dot.net v4.5.2 ; donc un gros décalage de version. Evidemment, histoire de simplifier les choses le siège national nous interdit d'upgrader ces composants sur les pc (la joie de travaille dans de grosses administrations françaises :p ).


    Merci d'avance

  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
    Je dirais que tu as une section analyse non conforme dans un de tes xml

    Essaie ceci dans une invite powershell pour vérifier le ParseExact
    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    [datetime]::ParseExact("30/01/2020", 'dd/MM/yyyy', $null)

  7. #7
    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
    On peux ajouter des vérifications d'erreurs si besoin

  8. #8
    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
    j'avais effectivement pensé à une bourde dans les XML mais ils sont tous corrects et l'erreur se produit sur tous les fichiers sans distinction.

    J'avais également testé le parseexact à part sans problème particulier. Du coup, j'ai fait d'autres essais en excluant toute la partie graphique pour ne jouer qu'avec les fichiers xml avec le code suivant :

    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
    $cheminScript = [System.IO.Path]::GetDirectoryName($MyInvocation.MyCommand.Definition)
    $cheminRapports = $cheminScript + "\Rapports"
     
    $listeFichiersXML = get-childItem -path ($cheminRapports) | Where-Object {$_.Name -match 'xml$'}
     
    foreach ($nomFichier in $listeFichiersXML)
    {
    	write-host "`nfichier $nomFichier :"
    	$fichierXML = $cheminRapports + "\" + $nomFichier
    	$objXML = new-object XML
    	$objXML.load($fichierXML)
     
    	$data = $objXMl.Surveillance_Repertoire.Liste_Analyses.Analyse
    	$data.date_analyse | ForEach-Object{[datetime]::ParseExact($_, 'dd/MM/yyyy', $null)}
    }

    cela fonctionne sans problème sur mon pc en windows 8 :
    Nom : screenshot.png
Affichages : 313
Taille : 24,6 Ko

    mais avec le même script et les mêmes fichiers XML sur le pc pro, j'ai toujours l'erreur sur le parseexec :
    Nom : erreur.PNG
Affichages : 316
Taille : 63,6 Ko

    Je m'interroge sur le foreach-object. En effet, lorsque je modifie la ligne
    Code PowerShell : Sélectionner tout - Visualiser dans une fenêtre à part
    $data.date_analyse | ForEach-Object{write-host "tagada"}
    j'obtiens bien un "tagada" pour chaque élément comme attendu :
    Nom : screenshot.png
Affichages : 302
Taille : 19,8 Ko

    par contre, en testant sur le pc pro, je me retrouve avec un seul "tagada" au lieu d'autant qu'il y a de lignes d'analyses :
    Nom : erreur.PNG
Affichages : 295
Taille : 6,8 Ko

    Le problème pourrait-il venir de là ?

    Merci beaucoup pour l'aide apportée

  9. #9
    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
    Le problème pourrait-il venir de là ?
    Le comportement est étrange effectivement, mais je ne pense pas que ça soit la faute du foreach

    Et comme ceci ? :
    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $cheminScript = [System.IO.Path]::GetDirectoryName($MyInvocation.MyCommand.Definition)
    $cheminRapports = $cheminScript + "\Rapports"
     
    $listeFichiersXML = get-childItem -path ($cheminRapports) | Where-Object {$_.PSIsContainer -eq $false -and $_.Extension -eq ".xml"}
     
    foreach ($nomFichier in $listeFichiersXML)
    {
    	write-host "`nfichier $($nomFichier.Name) :"
    	[XML]$objXML = Get-Content -Path $nomFichier.FullName
     
    	$data = $objXMl.Surveillance_Repertoire.Liste_Analyses.Analyse
    	$data.date_analyse | ForEach-Object{[datetime]::ParseExact($_, 'dd/MM/yyyy', $null)}
    }

  10. #10
    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
    Si ça ne fonctionne pas je testerai sur un Windows 7 pour voir.

  11. #11
    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
    Bonjour,

    j'ai toujours le même problème, mais j'ai peut-être trouvé un moyen de contourner cela qui semble fonctionner. Après moults essais, j'ai changé mon fusil d'épaule et au lieu de faire un databindXY, je fais un ajout de point par addXY :
    Code PowerShell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	$data = $objXMl.Surveillance_Repertoire.Liste_Analyses.Analyse
    	foreach ($objDate in $data) {$global:graphique.Series[$nomSerieGraphe].Points.addXY($([datetime]::ParseExact($objDate.date_analyse, 'dd/MM/yyyy', $null)), $($objDate.taille_analyse))}

    le parseexact fonctionne sans problème et les points s'affichent correctement :
    Nom : Capture.PNG
Affichages : 296
Taille : 64,8 Ko

    j'ai encore un peu de mise en forme à faire pour le graphique, car clairement c'est pas terrible au niveau de l'affichage mais ça paraît cohérent avec les données des fichiers et c'est le principal.

    voici le code actuel qui marche (au cas où quelqu'un aurait le même besoin) :
    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
    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
     
    [reflection.assembly]::loadWithPartialName("System.Windows.Forms")						| Out-Null
    [reflection.assembly]::loadWithPartialName("System.Drawing") 							| Out-Null
    [Reflection.Assembly]::loadWithPartialName("System.Windows.Forms.DataVisualization")	| out-null
     
     
    # variables :
    $cheminScript = [System.IO.Path]::GetDirectoryName($MyInvocation.MyCommand.Definition)
    $cheminRapports = $cheminScript + "\Rapports"
    $listeFichiersXML = get-childItem -path ($cheminRapports) | Where-Object {$_.Name -match 'xml$'}	# récupère la liste des fichiers XML présents dans le répertoire des rapports
     
    write-host  "liste des fichiers xml dans $cheminRapports :"
    $listeFichiersXML
     
    $global:imgGraphique
    $global:graphique
     
    # paramétrage du graphique :
    $global:graphique = New-Object System.Windows.Forms.DataVisualization.Charting.Chart					#instanciation de l'objet "graphique"
    $global:graphique.Size = "7000,1000"
     
    # paramétrage de la zone de graphe :
    $zoneGraphique = New-Object System.Windows.Forms.DataVisualization.Charting.ChartArea					#instanciation de l'objet  "zone de graphique"
    $zoneGraphique.AxisX.Title = "Date d'analyse"
    $zoneGraphique.AxisY.Title = "Taille (en Giga octets)"
     
    $zoneGraphique.AxisX.Interval = 5 # 0
    $zoneGraphique.AxisY.Interval = 0 # 100
     
    $zoneGraphique.AxisX.LabelStyle.Enabled = $true
    $zoneGraphique.AxisX.LabelStyle.Angle = 90
    $zoneGraphique.AxisY.LabelStyle.Enabled = $true
    $zoneGraphique.AxisY.LabelStyle.Angle = 0
    $graphique.ChartAreas.Add($zoneGraphique)												#ajoute la zone de graphique à l'objet "graphique"
     
    # paramétrage du titre :
    $Title = New-Object System.Windows.Forms.DataVisualization.Charting.Title							#instanciation de l'objet "titre"
    $global:graphique.Titles.Add($Title)
    $global:graphique.Titles[0].Text = "Evolution des répertoires"
     
     
    # paramétrage de la légende :
    $legende = New-Object System.Windows.Forms.DataVisualization.Charting.Legend						#instanciation de l'objet "légende"
    $legende.IsEquallySpacedItems = $True
    $legende.BorderColor = "Black"
    $legende.Position.Auto = $True
    $legende.Docking = "Bottom"
    $legende.Title = "Répertoires analysés"
    $global:graphique.Legends.Add($Legende)
     
     
    # parcours des XML pour récupérer les données :
    foreach ($nomFichier in $listeFichiersXML)
    {
    	$fichierXML = $cheminRapports + "\" + $nomFichier
    	write-host "étude de $fichierXML"
     
    	$objXML = new-object XML
    	$objXML.load($fichierXML)
     
    	$nomSerieGraphe = $objXML.Surveillance_Repertoire.Chemin_Repertoire					#utilise le nom du répertoire comme nom de série
     
    	$global:graphique.Series.Add($nomSerieGraphe)					#ajoute la série au graphique
    	$global:graphique.Series[$nomSerieGraphe].MarkerStyle = [System.Windows.Forms.DataVisualization.Charting.MarkerStyle]::Circle
    	$global:graphique.Series[$nomSerieGraphe].ChartType   = [System.Windows.Forms.DataVisualization.Charting.SeriesChartType]::Line
    	$global:graphique.Series[$nomSerieGraphe].XValueType  = [System.Windows.Forms.DataVisualization.Charting.ChartValueType]::DateTime
    	$global:graphique.Series[$nomSerieGraphe].LabelFormat = "dd/MM/yyyy"
     
    	$data = $objXMl.Surveillance_Repertoire.Liste_Analyses.Analyse
    	foreach ($objDate in $data) {$global:graphique.Series[$nomSerieGraphe].Points.addXY($([datetime]::ParseExact($objDate.date_analyse, 'dd/MM/yyyy', $null)), $($objDate.taille_analyse))}
     
    	foreach($point in $global:graphique.Series[$nomSerieGraphe].Points)
    	{
    		$point.ToolTip = "$nomSerieGraphe :`nDate d'analyse :#VALX `nTaille : #VAL"
    	}
     
    }
     
    $Form = New-Object Windows.Forms.Form
    $Form.Text = "PowerShell Chart"
    $Form.Width = 900
    $Form.Height = 500
    $Form.controls.add($graphique)
    $Form.Add_Shown({$Form.Activate()})
    $Form.ShowDialog()


    Merci infiniment pour toute l'aide apportée, ça m'a permis d'apprendre de nouvelles choses et j'espère pouvoir rendre un jour la pareille (même si je suis encore loin de tout comprendre et notamment pourquoi ce qui fonctionne sur une machine buggue sur une autre )

    Allez hop ! je fonce fignoler tout ça !

  12. #12
    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
    J'avais vérifier la compatibilité de la méthode DataBindXY entre tes versions de .Net : https://docs.microsoft.com/fr-fr/dot...ramework-4.5.2
    Rien à signaler, donc je ne sais pas mais bien jouer en tout cas.

  13. #13
    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
    J'avoue que je n'ai rien compris non plus... Encore une des joies de l'informatique !

    Toujours est-il que je te remercie pour ton aide et ta patience.

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

Discussions similaires

  1. [XL-2013] Problème d'affichage de date dans un graphique
    Par filsdepub dans le forum Excel
    Réponses: 7
    Dernier message: 27/10/2017, 15h01
  2. problème d'extraction de date dans requêtes imbriquées
    Par tomguiss dans le forum Requêtes
    Réponses: 1
    Dernier message: 29/12/2007, 11h10
  3. Problème d'affichage de date dans un Label
    Par L'aigle de Carthage dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 04/05/2007, 09h00
  4. Problème d'affichage de date dans une base de donnée
    Par Gouyon dans le forum C++Builder
    Réponses: 7
    Dernier message: 11/04/2007, 07h57
  5. [DisplayTag] Problème pour trier les dates dans un tableau
    Par Pascale38 dans le forum Taglibs
    Réponses: 13
    Dernier message: 01/09/2006, 09h58

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