Scripting

¿Cómo generar informes HTML con PowerShell?

I. Introducción

PowerShell es totalmente capaz de manipular datos en una variedad de formatos y lenguajes, y HTML es uno de los soportados. En este tutorial, vamos a ver cómo usted puede tomar ventaja de esto para crear informes en formato HTML.

La ventaja de utilizar HTML para los informes es que permite estructurar y presentar la información de forma legible e interactiva. Vamos a explorar dos métodos principales para generar informes HTML: utilizar la función ConvertTo-Html y el uso del módulo PSWriteHTML, que ofrece mayor flexibilidad y personalización.

II. Uso del cmdlet ConvertTo-Html

El cmdlet ConvertTo-Html es una solución nativa de PowerShell para transformar objetos en código HTML. Es fácil de usar a primera vista, pero si quieres ir más allá, necesitarás conocer la sintaxis HTML y CSS (para el formato).

A. Exportar resultados de pedidos en formato HTML

En este ejemplo, el ConvertTo-Html se utiliza para exportar la lista de procesos en ejecución en una tabla HTML. El resultado se guarda en un archivo llamado "Rapport.html".

Get-Process | ConvertTo-Html | Out-File "C:\Scripts\HTML\Rapport.html"

Si ejecutas este comando, obtendrás el resultado que se muestra a continuación, es decir, una tabla HTML sin formato, sin ningún esfuerzo de formateo. En otras palabras, no hay código CSS para añadir un poco de color ni nada.

He aquí el resultado obtenido:

PowerShell - Ejemplo de uso de ConvertTo-Html

Nota : CSS(Cascading Style Sheets) es un lenguaje de estilo utilizado para definir el aspecto y la disposición de los elementos HTML en una página web.

B. Añadir un título a la página

Puede añadir un título a la página HTML utilizando el parámetro -Title. Este título será visible en el navegador, en la pestaña correspondiente al archivo HTML.

Get-Process | ConvertTo-Html -Title "Liste des processus" | Out-File "C:\Scripts\HTML\Rapport2.html"

En concreto, este parámetro adaptará el código HTML para añadir este fragmento de código:

<head>
<title>Liste des processus</title>
</head>

C. Añadir estilo CSS

Ahora, en lugar del título, vamos a añadir código CSS para mejorar la visualización de nuestra tabla en formato HTML. Esto mejorará la legibilidad y la vista general de nuestra tabla. El parámetro -PreContent permite insertar elementos antes de la tabla, en este caso el equivalente a una hoja de estilo CSS integrada en el código HTML. Necesitarás algunos conocimientos básicos de CSS y HTML para poder mejorar el formato de la tabla, pero no es muy complicado.

$Style = "<style> body { font-family: Arial; } table { width: 100%; border-collapse: collapse; } th, td { border: 1px solid black; padding: 5px; } th { background-color : #C0C0C0 }</style>"

Get-Process | ConvertTo-Html -Title "Liste des processus" -PreContent $Style | Out-File "C:\Scripts\HTML\Rapport3.html"

Esta vez, la imagen es más fácil de interpretar. He aquí el resultado obtenido:

He aquí algunas explicaciones que le ayudarán a interpretar el código CSS:

  • body { font-family: Arial; } establece la fuente global del documento en Arial
  • table { width: 100%; border-collapse: collapse; } hace que la tabla sea 100% ancha y fusiona los bordes para evitar líneas dobles.
  • th, td { border: 1px solid black; padding: 5px; } añade un borde negro de 1 píxel (grosor) y un relleno de 5px a las celdasth (cabecera) y td (columna)
  • th { background-color : #C0C0C0; } aplica un fondo gris claro (#C0C0C0) a las celdas de encabezado (th).

Nota: también puede utilizar el parámetro "-PostContent" para añadir contenido después de la tabla, en el archivo de salida HTML. Esto puede ser útil para añadir un enunciado, un logotipo, etc.

III. Creación de un archivo HTML personalizado

Para ir un paso más allá y facilitar la lectura de esta tabla, podemos añadirle un poco de color. Por ejemplo, para resaltar determinadas filas según un criterio específico. En este caso, se trata de añadir un código CSS específico (código estático o una llamada a una clase CSS) para modificar el aspecto de las filas en cuestión.

También puede utilizar la función ConvertTo-Html y luego modificar el código HTML generado para inyectar código CSS en los lugares adecuados. Véase este script como ejemplo (líneas 269 a 289). Otra forma de hacer las cosas es construir nosotros mismos el código HTML, ya que la estructura de este lenguaje es bastante simple. Esto es lo que vamos a ver.

El objetivo es exportar la lista de servicios en la máquina local y añadir rojo como color de fondo en todas las líneas en las que el servicio está actualmente detenido.

Empezaremos declarando nuestro código CSS, formateándolo para que sea más fácil de leer y modificar (a diferencia del ejemplo anterior). Verás que la clase CSS .stopped que se aplicará a las líneas en las que se interrumpa el servicio.

# Definir el estilo CSS
# La clase .stopped se aplicará a todas las filas en las que el servicio esté detenido
$Style = @"
<style>
    body { font-family: Arial, sans-serif; }
    table { width: 100%; border-collapse: collapse; }
    th, td { border: 1px solid black; padding: 5px; text-align: left; }
    th { background-color: #C0C0C0; }
    .stopped { background-color: #FF3737; color: white; }
</style>
"@

A continuación, recuperamos la lista de servicios seleccionando tres propiedades (esto es importante, ya que necesitaremos el código HTML más adelante), a saber NameDisplayName y Status. Utilizando un bucle ForEach, construimos una tabla en formato HTML (sin la línea de cabecera).

# Recuperar la lista de servicios e inyectar la clase CSS cuando sea necesario
$HTMLTable = Get-Service | Select-Object Name, DisplayName, Status | ForEach-Object {
    $class = if ($_.Status -eq "Stopped") { "class='stopped'" } else { "" }
    "<tr $class><td>$($_.Name)</td><td>$($_.DisplayName)</td><td>$($_.Status)</td></tr>"
}

Por último, tenemos que ensamblar el código de nuestra tabla con una estructura HTML tradicional. La línea " <tr><th>Nom</th><th>Nom complet</th><th>Statut</th></tr>" es declarar la línea de cabecera de nuestra tabla, respetando la lista de propiedades seleccionadas previamente (mediante Get-Service).

# Construir el archivo final en formato HTML
$HTML = @"
<html>
<head>$Style</head>
<body>
    <h2>Liste des services</h2>
    <table>
        <tr><th>Nom</th><th>Nom complet</th><th>Statut</th></tr>
        $($HTMLTable -join "`n")
    </table>
</body>
</html>
"@

# Exportar a un archivo
$HTML | Out-File "C:\Scripts\HTML\Rapport-4.html"

Aquí está el script PowerShell completo:

# Definir el estilo CSS
# La clase .stopped se aplicará a todas las filas en las que el servicio esté detenido
$Style = @"
<style>
    body { font-family: Arial, sans-serif; }
    table { width: 100%; border-collapse: collapse; }
    th, td { border: 1px solid black; padding: 5px; text-align: left; }
    th { background-color: #C0C0C0; }
    .stopped { background-color: #FF3737; color: white; }
</style>
"@

# Recuperar la lista de servicios e inyectar la clase CSS cuando sea necesario
$HTMLTable = Get-Service | Select-Object Name, DisplayName, Status | ForEach-Object {
    $class = if ($_.Status -eq "Stopped") { "class='stopped'" } else { "" }
    "<tr $class><td>$($_.Name)</td><td>$($_.DisplayName)</td><td>$($_.Status)</td></tr>"
}

# Construir el archivo final en formato HTML
$HTML = @"
<html>
<head>$Style</head>
<body>
    <h2>Liste des services</h2>
    <table>
        <tr><th>Nom</th><th>Nom complet</th><th>Statut</th></tr>
        $($HTMLTable -join "`n")
    </table>
</body>
</html>
"@

# Exportar a un archivo
$HTML | Out-File "C:\Scripts\HTML\Rapport-4.html"

¿Y el resultado final? Eche un vistazo al archivo HTML obtenido tras ejecutar el script.

En el resto de este artículo, veremos cómo utilizar el módulo PSWriteHTML.

Nota : es posible crear bonitos informes HTML generando el código uno mismo y adaptando el CSS. Sin embargo, esto consume más tiempo que el método que discutiremos en el resto de este artículo.

IV. Introducción a PSWriteHTML

PSWriteHTML es un módulo PowerShell diseñado para aquellos que quieren crear hermosos informes HTML sin saber HTML o CSS. También se puede utilizar para personalizar aún más los informes HTML mediante la integración de tablas interactivas, gráficos y otros elementos visuales.

Fue creado por EvotecIT, junto con otros excelentes módulos como CleanupMonster y GPOZaurr. Por cierto, estos dos módulos se basan en PSWriteHTML para crear informes HTML.

A. Instalación de PSWriteHTML

Para instalar el módulo PSWriteHTML, basta con ejecutar el siguiente comando en una consola PowerShell:

Install-Module -Name PSWriteHTML

B. Principales comandos de PSWriteHTML

De este modo, puede enumerar todos los comandos del módulo:

Get-Command -Module PSWriteHTML

En la actualidad, hay 196 cmdlets de PowerShell en este módulo, ¡así que hay mucho que hacer!

Algunos comandos esenciales en este módulo :

  • Nuevo-HTML: crea un documento HTML.
  • New-HTMLTable: añade una tabla al informe.
  • New-HTMLHeader: añade una cabecera al informe (útil para indicar el nombre del informe, el nombre de la empresa, añadir un logotipo, etc.).
  • New-HTMLChart : añade un gráfico.
  • New-HTMLSection : permite estructurar el informe en secciones (dividir una página en secciones)
  • New-ChartDonut: añade un gráfico circular (o de camembert, para los normandos)

C. Creación de su primer informe con PSWriteHTML

He aquí un sencillo ejemplo de informe interactivo con PSWriteHTML :

New-HTML -Title "Rapport PowerShell" -FilePath "C:\Scripts\HTML\Rapport.html" {
    New-HTMLSection -HeaderText "Liste des processus" {
        New-HTMLTable -DataTable (Get-Process)
    }
}

Este script genera un informe HTML que contiene una tabla interactiva que muestra la lista de procesos en ejecución. Es más pesado de ejecutar que un simple ConvertTo-Html pero el resultado no es comparable. Aquí está el informe HTML resultante:

Permite acceder a funciones adicionales:

  • Ordenar por nombre de columna con un solo clic
  • Exportar resultados (PDF, CSV, Excel)
  • Haga clic en un proceso para obtener más detalles sobre él
  • Buscar con la barra de búsqueda

Veamos cómo ir más allá...

D. Crear un informe HTML con gráficos

El módulo PSWriteHtml integra numerosos cmdlets de PowerShell para personalizar el informe HTML, en particular para integrar un menú y navegar así entre varias páginas. También se pueden crear tablas y gráficos de todo tipo. Se pueden crear secciones dentro del informe, y cada sección puede contener uno o varios elementos.

A continuación se muestra un ejemplo de informe con información sobre las máquinas integradas en el dominio Active Directory. Contiene los siguientes elementos:

  • Una cabecera con el nombre de dominio de Active Directory y la fecha actual
  • Una primera sección con dos gráficos
    • Distribución del SO de las máquinas en el dominio AD
    • Desglose de los equipos del dominio AD por tipo de SO de sobremesa/servidor
  • Una segunda sección con dos cuadros
    • La lista de estaciones de trabajo integradas en el dominio
    • La lista de servidores integrados en el dominio

Ahora, echemos un vistazo más de cerca al código PowerShell que logra este objetivo.

Aquí está la primera parte del script para recuperar datos en máquinas de dominio. Es un código sencillo basado en el uso de Get-ADComputer del módulo Active Directory. La idea es almacenar información en variables, que luego pueden mostrarse en forma de gráficos o tablas.

# Recuperación de datos

# Almacenar la lista de ordenadores presentes en AD
$ComputersList = Get-ADComputer -Filter * -Properties Name, OperatingSystem, whenCreated, IPv4Address

# Contar ocurrencias de cada SO
$ComputersOSName = $ComputersList | Group-Object -Property OperatingSystem | Sort-Object Count -Descending

# Clasificar OS con una propiedad calculada
$ComputersOSType = $ComputersList | Select-Object OperatingSystem, @{ 
                        Name="TypeOS"; 
                        Expression={
                            if ($_.OperatingSystem -match "Windows Server") { "Windows Server" }
                            else { "Windows Desktop" }
                        }
                    } | Group-Object -Property TypeOS | Sort-Object Count -Descending

# Propiedades a exportar para tablas de máquinas
$ComputersOSProperties = @("Name", "OperatingSystem", "IPv4Address", "whenCreated")

# Obtener la lista de estaciones de trabajo
$ComputersOSDesktop = $ComputersList | Select-Object $ComputersOSProperties | Sort-Object Name | Where-Object { $_.OperatingSystem -NotMatch "Server" }

# Obtener la lista de servidores
$ComputersOSServer = $ComputersList | Select-Object $ComputersOSProperties | Sort-Object Name | Where-Object { $_.OperatingSystem -Match "Windows Server" }

En el código anterior, el uso de Group-Object -Property TypeOS es interesante, porque permite agrupar los equipos AD por tipo de SO, junto con el número de elementos. Muy útil para hacer gráficos.

Ahora pasamos al código basado en PSWriteHtml para construir el informe HTML.

# Construir el informe HTML con PSWriteHTML
New-HTML -Title "Répartition des OS" -FilePath "C:\Scripts\HTML\RapportOS-2.html" -ShowHTML:$true {
    
    # Cabecera del informe con nombre de dominio y fecha
    New-HTMLHeader {
        New-HTMLSection -Invisible  {            
            New-HTMLPanel -Invisible {
                New-HTMLText -Text "Domaine : $($env:USERDNSDOMAIN)" -FontSize 18 -FontWeight 100
                New-HTMLText -Text "Date : $(Get-Date -Format "dd/MM/yyyy")" -FontSize 12
            } -AlignContentText left
        }
    }

    # Sección 1 - Gráficos
    New-HTMLSection -HeaderText "Distribution des OS dans Active Directory" -HeaderBackGroundColor "#00698e" {
        New-HTMLChart -Title "Répartition par OS" -Gradient {
            foreach ($Line in $ComputersOSName) {
                New-ChartDonut -Name  $Line.Name -Value $Line.Count
            }
        }
        New-HTMLChart -Title "Répartition Desktop / Server" -Gradient {
            foreach ($Line in $ComputersOSType) {
                New-ChartDonut -Name $Line.Name -Value $Line.Count
            }
        }
    }

    # Sección 2 - Cuadros con la lista de ordenadores
    New-HTMLSection -HeaderText "Liste des machines inscrites dans l'Active Directory" -HeaderBackGroundColor "#00698e"  {
            New-HTMLPanel {
                New-HTMLTable -DataTable $ComputersOSDesktop -HideFooter -AutoSize
            }
            New-HTMLPanel {
                New-HTMLTable -Title "Liste des postes des serveurs" -DataTable $ComputersOSServer -HideFooter -AutoSize
            }
    }
}

La idea es la siguiente:

  • Es necesario declarar un nuevo informe HTML con la propiedad New-HTML
  • La opción -ShowHTML:$true del cmdlet New-HTML se utiliza para abrir automáticamente el informe una vez generado.
  • Debe declarar la cabecera con el atributo New-HTMLHeader
  • Cada nueva sección (bloque con varios elementos en su interior) se declara mediante la función New-HTMLSection
  • A continuación, hay que anidar los elementos entre sí de forma jerárquica (lo que permite visualizar mentalmente el diseño del informe). Por eso, debajo de la declaración HTML del informe, hay una declaración de sección, y debajo de la sección, está la declaración de los dos gráficos.

Cada cmdlet tiene sus propias opciones, para ajustar el formato, añadir un título, modificar CSS, etc... Es muy flexible y personalizable. Este ejemplo muestra el potencial de este módulo de PowerShell y la facilidad con la que se pueden recuperar datos y darles formato en un informe.

Encuentre el script completo en el GitHub de IT-Connect :

V. Conclusión

Como acabamos de ver, PowerShell ofrece varias posibilidades para generar informes HTML, desde el sencillo ConvertTo-Html hasta el más avanzado PSWriteHTML. Recomiendo encarecidamente el uso de PSWriteHTML si desea informes más interactivos y estéticamente agradables, que también son un poco más pesados de generar. También crean una dependencia del módulo PSWriteHTML, a diferencia del uso del cmdlet nativo de PowerShell.

¿Qué le parece?

author avatar
Florian Burnel Co-founder of IT-Connect
Systems and network engineer, co-founder of IT-Connect and Microsoft MVP "Cloud and Datacenter Management". I'd like to share my experience and discoveries through my articles. I'm a generalist with a particular interest in Microsoft solutions and scripting. Enjoy your reading.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.