Powershell se utiliza muchas veces para generar informes y representar datos. Para completar los datos y tablas, podemos crear gráficos que permiten ayudar en la visualización de esos datos, y para ello lo podemos hacer en PowerShell de una forma muy sencilla con Microsoft Chart Controls.
Vamos a ver paso a paso como crear de forma sencilla algunos ejemplos de gráficos creados en PowerShell.
- Cargar los .NET Assemblies necesarios
[void][Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms.DataVisualization")
Utilizamos el espacio de nombres «System.Windows.Forms.DataVisualization»
$chart = New-object System.Windows.Forms.DataVisualization.Charting.Chart
Esto nos crea un nuevo objeto chart que es la base sobre la que trabajaremos con el resto de objetos
- Establecemos las propiedades básicas del gráfico
$chart.Width = 1000
$chart.Height = 1000
$chart.BackColor = "#FFDDDDDD"
Por defecto el tamaño del objeto chart es de 300 x 300. Con las propiedades Width y Height modificamos el tamaño del gráfico.
Con la propiedad BackColor podemos modificar el color de fondo del gráfico en formato ARGB (alfa, rojo, verde, azul).
$titulo = $chart.Titles.Add("Título del gráfico")
$chart.Titles[0].Font = "Arial,18pt"
Añadimos al objeto Chart un título y el tipo de letra. Podemos cambiar también otras propiedades del título como su color (ForeColor) o ubicación (Alignment)
- Crear un objeto ChartArea
# chart area
$chartarea = New-Object System.Windows.Forms.DataVisualization.Charting.ChartArea
$chartarea.Name = "ChartArea1"
$chartarea.AxisY.Title = "Título Eje Y"
$chartarea.AxisX.Title = "Título Eje X"
$chart.ChartAreas.Add($chartarea)
En el objeto CharArea es donde se «dibujaran» los gráficos. Podemos crear varios objetos de este tipo asociados a un mismo objeto de tipo Chart.
- Añadimos el objeto de tipo Serie
$serie1 = $chart.Series.Add("Serie1")
$serie1.ChartArea = "ChartArea1"
Creamos el objeto Serie añadiéndolo al objeto Chart. Después lo asignamos al objeto ChartArea donde se va a dibujar.
- Añadimos los datos a la serie correspondiente
$serie1.Points.AddXY(1,1)
$serie1.Points.AddXY(2,2)
$serie1.Points.AddXY(3,3)
Vamos añadiendo los datos a la serie como puntos y valores en los ejes X e Y
$legend = New-Object system.Windows.Forms.DataVisualization.Charting.Legend
$legend.name = "Legend1"
$chart.Legends.Add($legend)
Creamos el objecto Legend, le asignamos un nombre y lo añadimos al objeto de tipo Chart
- Obtenemos el código completo para generar el gráfico
[void][Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms.DataVisualization")
#Chart
$chart = New-object System.Windows.Forms.DataVisualization.Charting.Chart
$chart.Width = 800
$chart.Height = 800
$chart.BackColor = "#FFDDDDDD"
#Titulo
$titulo = $chart.Titles.Add("Título del gráfico")
$chart.Titles[0].Font = "Arial,18pt"
#Chartarea
$chartarea = New-Object System.Windows.Forms.DataVisualization.Charting.ChartArea
$chartarea.Name = "ChartArea1"
$chartarea.AxisY.Title = "Titulo Eje Y"
$chartarea.AxisX.Title = "Titulo Eje X"
$chart.ChartAreas.Add($chartarea)
#Series
$serie1 = $chart.Series.Add("Serie1")
$serie1.ChartArea = "ChartArea1"
#Datos
$serie1.Points.AddXY(1,1)
$serie1.Points.AddXY(2,2)
$serie1.Points.AddXY(3,3)
#Legend
$legend = New-Object system.Windows.Forms.DataVisualization.Charting.Legend
$legend.name = "Legend1"
$chart.Legends.Add($legend)
- Visualización del gráfico
$chart.SaveImage("z:\temp\SplineArea.png","png")
La opción más sencilla para visualizar el gráfico que hemos generado es guardarlo, por ejemplo, como un archivo PNG.

Así es como quedaría la vista de los diferentes objetos que hemos ido creando en el gráfico

Ejemplos
Ahora vamos a ver varios ejemplos de algunas de las posibilidades que tenemos para crear diferentes tipos de gráficos
Top 5 de procesos en memoria virtual consumida |
 |
[void][Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms.DataVisualization")
#Chart
$chart = New-object System.Windows.Forms.DataVisualization.Charting.Chart
$chart.Width = 800
$chart.Height = 800
$chart.BackColor = "#FFDDDDDD"
#Title
$titulo = $chart.Titles.Add("Top 5 de procesos en consumo de memoria")
$chart.Titles[0].Font = "Arial,18pt"
#Chartarea
$chartarea = New-Object System.Windows.Forms.DataVisualization.Charting.ChartArea
$chartarea.Name = "ChartArea1"
$chartarea.AxisY.Title = "MB"
$chartarea.AxisX.Title = "Procesos"
$chart.ChartAreas.Add($chartarea)
#Legend
$legend = New-Object system.Windows.Forms.DataVisualization.Charting.Legend
$legend.name = "Legend1"
$chart.Legends.Add($legend)
#Series
[void]$chart.Series.Add("VirtualMem")
$chart.Series["VirtualMem"].ChartType = "Column"
$chart.Series["VirtualMem"].chartarea = "ChartArea1"
$chart.Series["VirtualMem"].Legend = "Legend1"
Get-Process | Sort VirtualMemorySize -Descending | Select-Object -First 5 | ForEach-Object {$chart.Series["VirtualMem"].Points.addxy( $_.Name , ($_.VirtualMemorySize / 1000000)) }
|
Top 5 de procesos en memoria virtual y privada consumida |
 |
#Top 5 de procesos en uso de memoria
[void][Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms.DataVisualization")
#Chart
$chart = New-object System.Windows.Forms.DataVisualization.Charting.Chart
$chart.Width = 800
$chart.Height = 800
$chart.BackColor = "#FFDDDDDD"
#Title
$titulo = $chart.Titles.Add("Top 5 de procesos en consumo de memoria")
$chart.Titles[0].Font = "Arial,18pt"
#Chartarea
$chartarea = New-Object System.Windows.Forms.DataVisualization.Charting.ChartArea
$chartarea.Name = "ChartArea1"
$chartarea.AxisY.Title = "MB"
$chartarea.AxisX.Title = "Procesos"
$chart.ChartAreas.Add($chartarea)
#Legend
$legend = New-Object system.Windows.Forms.DataVisualization.Charting.Legend
$legend.name = "Legend1"
$chart.Legends.Add($legend)
#Series
[void]$chart.Series.Add("VirtualMem")
$chart.Series["VirtualMem"].ChartType = "Column"
$chart.Series["VirtualMem"].chartarea = "ChartArea1"
$chart.Series["VirtualMem"].Legend = "Legend1"
Get-Process | Sort VirtualMemorySize -Descending | Select-Object -First 5 | ForEach-Object {$chart.Series["VirtualMem"].Points.addxy( $_.Name , ($_.VirtualMemorySize / 1000000)) }
[void]$chart.Series.Add("PrivateMem")
$chart.Series["PrivateMem"].ChartType = "Column"
$chart.Series["PrivateMem"].chartarea = "ChartArea1"
$chart.Series["PrivateMem"].Legend = "Legend1"
Get-Process | Sort PrivateMemorySize -Descending | Select-Object -First 5 | ForEach-Object {$chart.Series["PrivateMem"].Points.addxy( $_.Name , ($_.PrivateMemorySize/ 1000000)) }
|
Top 5 de procesos en memoria y CPU consumida |
 |
[void][Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms.DataVisualization")
#Chart
$chart = New-object System.Windows.Forms.DataVisualization.Charting.Chart
$chart.Width = 800
$chart.Height = 800
$chart.BackColor = "#FFDDDDDD"
#Title
$titulo = $chart.Titles.Add("Top 5 de procesos en consumo de memoria")
$chart.Titles[0].Font = "Arial,18pt"
#Chartarea
$chartarea = New-Object System.Windows.Forms.DataVisualization.Charting.ChartArea
$chartarea.Name = "ChartArea1"
$chartarea.AxisY.Title = "MB"
$chartarea.AxisX.Title = "Procesos"
$chart.ChartAreas.Add($chartarea)
#Chartarea
$chartarea2 = New-Object System.Windows.Forms.DataVisualization.Charting.ChartArea
$chartarea2.Name = "ChartArea2"
$chartarea2.AxisY.Title = "Uso de CPU"
$chartarea2.AxisX.Title = "Procesos"
$chart.ChartAreas.Add($chartarea2)
#Legend
$legend = New-Object system.Windows.Forms.DataVisualization.Charting.Legend
$legend.name = "Legend1"
$chart.Legends.Add($legend)
#Series
[void]$chart.Series.Add("VirtualMem")
$chart.Series["VirtualMem"].ChartType = "Column"
$chart.Series["VirtualMem"].chartarea = "ChartArea1"
$chart.Series["VirtualMem"].Legend = "Legend1"
Get-Process | Sort VirtualMemorySize -Descending | Select-Object -First 5 | ForEach-Object {$chart.Series["VirtualMem"].Points.addxy( $_.Name , ($_.VirtualMemorySize / 1000000)) }
[void]$chart.Series.Add("PrivateMem")
$chart.Series["PrivateMem"].ChartType = "Column"
$chart.Series["PrivateMem"].chartarea = "ChartArea1"
$chart.Series["PrivateMem"].Legend = "Legend1"
Get-Process | Sort PrivateMemorySize -Descending | Select-Object -First 5 | ForEach-Object {$chart.Series["PrivateMem"].Points.addxy( $_.Name , ($_.PrivateMemorySize / 1000000)) }
[void]$chart.Series.Add("CPUUsage")
$chart.Series["CPUUsage"].ChartType = "Column"
$chart.Series["CPUUsage"].chartarea = "ChartArea2"
$chart.Series["CPUUsage"].Legend = "Legend1"
Get-Process | Sort CPU -Descending | Select-Object -First 5 | ForEach-Object {$chart.Series["CPUUsage"].Points.addxy( $_.Name , ($_.CPU / 1000)) }
$chart.SaveImage("z:\temp\Memoria-CPU1.png","png")
Invoke-expression z:\temp\Memoria-CPU1.png
|
Gráfico de tipo Barras |
 |
[void][Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms.DataVisualization")
#Chart
$chart = New-object System.Windows.Forms.DataVisualization.Charting.Chart
$chart.Width = 800
$chart.Height = 800
$chart.BackColor = "#FFDDDDDD"
#Title
$titulo = $chart.Titles.Add("Top 5 de procesos en consumo de memoria")
$chart.Titles[0].Font = "Arial,18pt"
#Chartarea
$chartarea = New-Object System.Windows.Forms.DataVisualization.Charting.ChartArea
$chartarea.Name = "ChartArea1"
$chartarea.AxisY.Title = "MB"
$chartarea.AxisX.Title = "Procesos"
$chart.ChartAreas.Add($chartarea)
#Chartarea
$chartarea2 = New-Object System.Windows.Forms.DataVisualization.Charting.ChartArea
$chartarea2.Name = "ChartArea2"
$chartarea2.AxisY.Title = "Uso de CPU"
$chartarea2.AxisX.Title = "Procesos"
$chart.ChartAreas.Add($chartarea2)
#Legend
$legend = New-Object system.Windows.Forms.DataVisualization.Charting.Legend
$legend.name = "Legend1"
$chart.Legends.Add($legend)
#Series
[void]$chart.Series.Add("VirtualMem")
$chart.Series["VirtualMem"].ChartType = "Column"
$chart.Series["VirtualMem"].chartarea = "ChartArea1"
$chart.Series["VirtualMem"].Legend = "Legend1"
Get-Process | Sort VirtualMemorySize -Descending | Select-Object -First 5 | ForEach-Object {$chart.Series["VirtualMem"].Points.addxy( $_.Name , ($_.VirtualMemorySize / 1000000)) }
[void]$chart.Series.Add("PrivateMem")
$chart.Series["PrivateMem"].ChartType = "Column"
$chart.Series["PrivateMem"].chartarea = "ChartArea1"
$chart.Series["PrivateMem"].Legend = "Legend1"
Get-Process | Sort PrivateMemorySize -Descending | Select-Object -First 5 | ForEach-Object {$chart.Series["PrivateMem"].Points.addxy( $_.Name , ($_.PrivateMemorySize / 1000000)) }
[void]$chart.Series.Add("CPUUsage")
$chart.Series["CPUUsage"].ChartType = "Bar"
$chart.Series["CPUUsage"].chartarea = "ChartArea2"
$chart.Series["CPUUsage"].Legend = "Legend1"
Get-Process | Sort CPU -Descending | Select-Object -First 5 | ForEach-Object {$chart.Series["CPUUsage"].Points.addxy( $_.Name , ($_.CPU / 1000)) }
|
Enlaces
Pingback: Gráficos en un plugin de vCheck - Sitio Web de Roberto Orayen