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" :
Fichier "Analyse_Scripts.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_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 <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>
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
Partager