Cómo Crear Informes HTML usando PowerShell
Cómo Crear Informes HTML usando PowerShell

Cómo Crear Informes HTML usando PowerShell

PowerShell es la herramienta preferida de todo profesional de IT para automatizar tareas y obtener información de múltiples sistemas en el conjunto de tecnologías de Microsoft. Al crear informes, el formato de salida más fácil y comúnmente utilizado es el Valor Separado por Comas (CSV, Comma Separated Value) porque puede leerse fácilmente en Microsoft Excel.

Aunque CSV es un formato excelente, no es el más fácil de consumir visualmente, y podría ser difícil concentrarse directamente en los elementos que necesitan atención. Y si has intentado abrir un archivo CSV en un sistema que no tiene Excel instalado, sabes que un archivo de texto con valores separados por comas es casi imposible de leer.

Uso de PowerShell para  crear informes del sistema
Uso de PowerShell para crear informes del sistema

Pero hay otra opción que puedes utilizar para crear informes más visualmente atractivos y fáciles de leer y entender, y es usar PowerShell para generar informes en formato HTML.

Usando el cmdlet ConvertTo-Html

PowerShell incluye un cmdlet llamado ConvertTo-Html, que convierte objetos del framework Microsoft .NET en HTML que puede mostrarse en un navegador web. Su uso básico es bastante sencillo. Puedes probarlo de inmediato abriendo PowerShell (¡como administrador, por supuesto!) y ejecutando el siguiente cmdlet de PowerShell:

Get-EventLog -LogName "Windows PowerShell" | ConvertTo-Html > PSLogReport.html

Aquí tienes una muestra del tipo de salida que podría obtenerse:

Uso del cmdlet ConvertTo-Html
Uso del cmdlet ConvertTo-Html

Podemos formatear la salida y también cambiar los encabezados a español, aunque tomará un poco más de código:

$logs = Get-EventLog -LogName "Windows PowerShell"

# Mapear los encabezados en español
$encabezados = @{
    EventID = "ID de Evento"
    MachineName = "Nombre de la Máquina"
    Data = "Datos"
    Index = "Índice"
    Category = "Categoría"
    CategoryNumber = "Número de Categoría"
    EntryType = "Tipo de Entrada"
    Message = "Mensaje"
    Source = "Origen"
    ReplacementStrings = "Cadenas de Reemplazo"
    InstanceId = "ID de Instancia"
    TimeGenerated = "Tiempo de Generación"
}

# Construir manualmente el contenido HTML
$htmlContent = $logs | ForEach-Object {
    $row = $_
    "<tr>" + ($encabezados.Keys | ForEach-Object { "<td>$($row.$_)</td>" }) + "</tr>"
}

# Crear el informe HTML
$htmlReport = @"
<html>
<head>
<meta charset='UTF-8'>
<title>Informe de Registro de PowerShell</title>
</head>
<body>
<table border='1'>
<tr>$($encabezados.Values | ForEach-Object { "<th>$_</th>" })</tr>
$htmlContent
</table>
</body>
</html>
"@

# Guardar el informe HTML en un archivo
$htmlReport | Out-File -FilePath "PSLogReport.html" -Encoding UTF8
Mapear el resultado del informe HTML en español
Mapear el resultado del informe HTML en español

Por supuesto, también puedes utilizar las funcionalidades de filtrado en PowerShell para obtener solo los valores que deseas, por ejemplo:

Get-EventLog -LogName "Windows PowerShell" | ConvertTo-Html `
-Property MachineName ,EventID, TimeGenerated `
-Title "Windows PowerShell Log Information" `
> FilteredPSLogReport.html

Si deseas obtener información de múltiples fuentes y luego fusionarlas en la misma salida, puedes usar el parámetro -Fragment, como se muestra a continuación. Esto asegurará que cada pieza de información se convierta básicamente en un <div> diferente dentro del archivo HTML, y al final, se unirán todos en un HTML bien formateado.

$OS = Get-WmiObject -class Win32_OperatingSystem | ConvertTo-HTML -Fragment
$Bios = Get-WmiObject -class Win32_BIOS | ConvertTo-HTML -Fragment
$Services = Get-WmiObject -class Win32_Service | ConvertTo-HTML -Fragment
ConvertTo-HTML -Body "$OS $Bios $Services" -Title "Report" | Out-File StatusReport.html
Información múltiples fuentes para informe PowerShell
Información múltiples fuentes para informe PowerShell

Añadiendo Estilo a tu Informe

También puedes agregar estilo a tus informes, ya sea codificándolo directamente en PowerShell o referenciando un archivo CSS externo. Para este artículo, simplemente crearé un CSS en un bloque de aquí denominado “Header” que puedes ver a continuación.

$Header = @"
<style>
table {
font-family: "Trebuchet MS", Arial, Helvetica, sans-serif;
border-collapse: collapse;
width: 100%;
}
th {
padding-top: 12px;
padding-bottom: 12px;
text-align: left;
background-color: #6D0CD0;
color: white;
}
</style>
"@

A continuación, ejecuta los siguientes cmdlets de PowerShell para crear el mismo informe que antes, pero con el CSS que creamos anteriormente. (Recuerda probar estos mientras lees el artículo para que puedas ver los resultados).

$OS = Get-WmiObject -class Win32_OperatingSystem | ConvertTo-HTML -Fragment
$Bios = Get-WmiObject -class Win32_BIOS | ConvertTo-HTML -Fragment
$Services = Get-WmiObject -class Win32_Service | ConvertTo-HTML -Fragment
ConvertTo-HTML -Body "$OS $Bios $Services" -Title "Report" -Head $Header | Out-File StatusReport.html
Informes PowerShell con HTML y CSS
Informes PowerShell con HTML y CSS

Llevándolo al Siguiente Nivel

Esto es todo para el cmdlet básico ConvertTo-HTML de PowerShell, sin embargo, hay módulos de la comunidad que te permiten llevarlo al siguiente nivel. Uno de esos módulos es el módulo EnhancedHTML2 PowerShell de Don Jones, MVP de PowerShell, que se comparte en PowerShell Gallery. Después de instalarlo, veamos algunos ejemplos interesantes de lo que puedes hacer con él.

En primer lugar, elegir mostrar la información ya sea como una lista o como una tabla con el parámetro -As:

$Bios = Get-WmiObject -class Win32_BIOS | Select PSComputerName, Manufacturer, BIOSVersion | ConvertTo-EnhancedHTMLFragment -As List
$Bios2 = Get-WmiObject -class Win32_BIOS | Select PSComputerName, Manufacturer, BIOSVersion | ConvertTo-EnhancedHTMLFragment -As Table
ConvertTo-EnhancedHTML -HTMLFragments $Bios,$Bios2 -CssUri C:\PowerShell\CSS\styles2.css | Out-File AsExample.html
Nombre del ordenador, Fabricante, Versión de la BIOS
Nombre del ordenador, Fabricante, Versión de la BIOS

Una vez que abras el archivo, verás cómo la información se muestra de manera diferente y cómo puedes aprovechar este nuevo formato para mostrar la información de manera más eficiente.

Otra opción muy interesante es crear tablas dinámicas, ¡es decir, una tabla que se “pagine” automáticamente y con un cuadro de búsqueda! En el siguiente ejemplo mostraremos los servicios en la computadora, primero como una tabla dinámica, seguida de una tabla normal.

$Services = Get-Service | Select Name, DisplayName, Status | ConvertTo-EnhancedHTMLFragment -As Table -PreContent "<h2>Dynamic Services</h2>" -MakeTableDynamic
$Services2 = Get-Service | Select Name, DisplayName, Status | ConvertTo-EnhancedHTMLFragment -As Table -PreContent "<h2> Normal Services</h2>"
ConvertTo-EnhancedHTML -HTMLFragments $Services, $Services2 -CssUri C:\PowerShell\CSS\styles2.css | Out-File DynamicExample.html
Informe filtrado en HTML con PowerShell
Informe filtrado en HTML con PowerShell

Por supuesto, puedes llevarlo aún más lejos agregando formato condicional según el valor. Por ejemplo, dependiendo del valor numérico, puedes mostrar en color negro para un valor normal o en rojo si necesita atención.

Filtro de informes con colores en HTML
Filtro de informes con colores en HTML
# Instalar el módulo EnhancedHTML2
Install-Module -Name EnhancedHTML2 -Force -Scope CurrentUser

# Importar el módulo
Import-Module EnhancedHTML2

# Obtener información de los servicios y aplicar formato condicional
$Services = Get-Service | Select Name, DisplayName, Status | ForEach-Object {
    $row = $_
    [PSCustomObject]@{
        Name = "<div style='border: 1px solid black;'>$($row.Name)</div>"
        DisplayName = "<div style='border: 1px solid black;'>$($row.DisplayName)</div>"
        Status = if ($row.Status -eq $null -or $row.Status -eq '') {
            "<div style='background-color: orange; border: 1px solid black;'>$($row.Status)</div>"
        } elseif ($row.Status -eq 'Running') {
            "<div style='color: black; border: 1px solid black;'>$($row.Status)</div>"
        } else {
            "<div style='color: red; border: 1px solid black;'>$($row.Status)</div>"
        }
    }
} | ConvertTo-EnhancedHTMLFragment -As Table -PreContent "<h2>Dynamic Services</h2>" -MakeTableDynamic

$Services2 = Get-Service | Select Name, DisplayName, Status | ForEach-Object {
    $row = $_
    [PSCustomObject]@{
        Name = "<div style='border: 1px solid black;'>$($row.Name)</div>"
        DisplayName = "<div style='border: 1px solid black;'>$($row.DisplayName)</div>"
        Status = if ($row.Status -eq $null -or $row.Status -eq '') {
            "<div style='background-color: orange; border: 1px solid black;'>$($row.Status)</div>"
        } elseif ($row.Status -eq 'Running') {
            "<div style='color: black; border: 1px solid black;'>$($row.Status)</div>"
        } else {
            "<div style='color: red; border: 1px solid black;'>$($row.Status)</div>"
        }
    }
} | ConvertTo-EnhancedHTMLFragment -As Table -PreContent "<h2> Normal Services</h2>"

# Crear el informe HTML combinando los fragmentos y aplicando un archivo de estilo CSS
ConvertTo-EnhancedHTML -HTMLFragments $Services, $Services2 -CssUri C:\PowerShell\CSS\styles2.css | Out-File DynamicExample.html

Esto requiere un poco más de conocimiento y ejemplos, y como queremos mantenerlo simple aquí y no escribir un libro electrónico completo, solo compartiremos algunos recursos adicionales a continuación donde puedes aprender más sobre cómo dominar este tema.

Otros Recursos para Informes HTML

Mi Carro Close (×)

Tu carrito está vacío
Ver tienda