Windows PowerShell: Una nueva mirada a los informes
Los informes que solo contienen texto pueden ser insípidos y menos informativos; ¿por qué no usar Windows PowerShell para generar informes en HTML?
Don Jones
Si vas para generar informes con Windows PowerShell, informes HTML independientes son una mejor opción que informes basados en texto. Mi preferencia proviene del hecho de que los informes HTML son significativamente más fáciles de crear, mirar mucho más agradable que el texto y aún más fácil adjuntar a un correo electrónico y enviar alrededor de la Oficina.
Hace varios meses esta columna, dio algunos consejos para producir informes HTML en Windows PowerShell. Este mes, veamos cómo puede mejorar esos informes.
Vamos a saltar solo directamente en el código que se muestra en la figura 1. Debe guardarse en un archivo de secuencia de comandos, como C:\Report.ps1.
Figura 1 mejorar esos informes HTML Windows PowerShell.
param([string]$computername) $b = Get-WmiObject -class Win32_ComputerSystem -ComputerName $computername | Select-Object -Property Manufacturer,Model, @{n='Memory(GB)';e={$_.TotalPhysicalMemory / 1GB -as [int]}}, @{n='Architecture';e={$_.SystemType}}, @{n='Processors';e={$_.NumberOfProcessors}} | ConvertTo-HTML -Fragment -As LIST -PreContent "<h2>Computer Hardware:</h2>" | Out-String $b += Get-WmiObject -class Win32_LogicalDisk -ComputerName $computername | Select-Object -Property @{n='DriveLetter';e={$_.DeviceID}}, @{n='Size(GB)';e={$_.Size / 1GB -as [int]}}, @{n='FreeSpace(GB)';e={$_.FreeSpace / 1GB -as [int]}} | ConvertTo-Html -Fragment -PreContent "<h2>Disks:</h2>" | Out-String $b += Get-WmiObject -class Win32_NetworkAdapter -ComputerName $computername | Where { $_.PhysicalAdapter } | Select-Object -Property MACAddress,AdapterType,DeviceID,Name | ConvertTo-Html -Fragment -PreContent "<h2>Physical Network Adapters:</h2>" | Out-String $head = @' \<style\> body { background-color:\#dddddd; font-family:Tahoma; font-size:12pt; } td, th { border:1px solid black; border-collapse:collapse; } th { color:white; background-color:black; } table, tr, td, th { padding: 2px; margin: 0px } table { margin-left:50px; } \</style\> '@ ConvertTo-HTML -head $head -PostContent $b -Body "<h1>Hardware Inventory for $ComputerName</h1>"
Se ejecutaría el informe en figura 1 como sigue:
C:\Report –computername localhost > output.htm
Aquí es lo que he hecho — puede ver estoy usando tres llamadas a Get-WmiObject para recuperar diferentes bits de información. Cada vez, estoy usando Seleccionar objeto para seleccionar las propiedades en las que estoy interesado. En la mayoría de los casos, estoy creando columnas personalizadas, por lo que valores como la memoria se muestran en una unidad de medida más conveniente.
Al final de cada uno, estoy usando ConvertTo HTML para producir un fragmento HTML. Esto significa que sólo se obtienen el código HTML necesario para producir una tabla con mis propiedades deseadas.
Hay aquí un truco que me llevó mucho tiempo averiguar. ConvertTo HTML produce algunas cosas raras. Básicamente, producirá colecciones de cadenas. Intente alimenta a la final ConvertTo-HTML y obtendrá un error.
Trabajé todo el problema utilizando Out-String. Puede ver esto en cada uno de los tres primeros bloques, donde yo estoy tuberías el fragmento HTML a Out-String. Esto garantiza que cada fragmento es sólo un montón de cadenas simples. Como crear cada fragmento HTML, anexar en la variable $b.
También observará que estoy usando ConvertTo HTML para aplicar los encabezados de sección a aquellos fragmentos HTML. Normalmente, ConvertTo HTML sólo inserta contenido"pre" como texto sin formato. He agregado <h2> Etiquetas HTML para que mis encabezados de sección aparecen como encabezados en HTML.
Después de la construcción de los tres bloques, crear una hoja de estilo HTML incrustada. Esto es donde se puede jugar con estilos para conseguir el aspecto que desea para el informe final. Compruebe la referencia a la lenguaje de hoja de estilo en cascada (CSS) para más sobre hojas de estilo. Como se puede vivir con estilo relativamente simple, CSS no es demasiado complicado.
La última línea de mi script utiliza un final ConvertTo-HTML. I insertar la hoja de estilos en el encabezado de página HTML, agregar una partida global de la página y insertar el contenido de $b. La final HTML en Internet Explorer puede verse en figura 2.
Figura 2 después de modificar las hojas de estilo y convertir la salida en HTML, esto es el resultado.
Aquí hay algunos otros trucos que quiero señalar:
- En mis dos primeros comandos Select Object, observe que he usado una sintaxis de hashtable para construir propiedades de salida personalizada. En la mayoría de los casos, sólo estoy creando un nombre como para las columnas de salida. En tres casos, sin embargo, estoy haciendo algunos matemáticos para convertir bytes en gigabytes.
- En el primer bloque donde consulta Win32_ComputerSystem, estoy teniendo ConvertTo HTML formato la información en una lista en lugar del estilo de tabla predeterminado (el parámetro de la lista – como). Porque la salida sólo cubrirá un sistema informático único, pensé que la lista de espera más agradable.
- Tuve que engañar con la hoja de estilos bastante conseguirlo buscando como quería. CSS es poderosa, pero puede tomar un poco de ajustar para obtener el estilo exacto que desee.
Cabría preguntarse por qué la secuencia de comandos no redirige la salida a un archivo, y que sería una buena pregunta. Mi script deja el código HTML en el gasoducto de Windows PowerShell, que significa que no tener que ponerlo en un archivo si más bien sería hacer a algo más.
Por ejemplo, he escrito una función personalizada que me deja la tubería en el código HTML. Crea un mensaje de correo electrónico con formato HTML de ese contenido. Por tener mi script dejar el código HTML en la tubería, yo puedo tubería HTML a mi función de envío de correo, tubería el código HTML en un archivo o hacer cualquier cosa que quiera con ella. Simplemente salida HTML, me deja con el mayor número de opciones.
Sobre todo, no usar escritura del Host. Escritura-Host envía salida directamente a la pantalla. Le no da ninguna opción para redirigir que a un archivo, lo convierten en un mensaje de correo electrónico o cualquier otra cosa.
Porque estoy usando ConvertTo HTML, Windows PowerShell está haciendo todo el trabajo de formato realmente mi salida. No tuve que engañar con eso, tampoco. Por simplemente jugar con el CSS, puedo cambiar fácilmente el aspecto de la salida final.
Puede incluso insertar una hoja de estilos para la visualización en pantalla y una hoja de estilos diferentes para la salida impresa. De este modo, si alguien imprime tu informe, pueden tener formato apropiado para impresos. Para ello, simplemente construir su hoja de estilos como figura 3.
Figura 3 hojas de estilo diferentes permiten en pantalla para visualización y salida impresa.
$head = @' \<style media='screen'> body { background-color:#dddddd; font-family:Tahoma; font-size:12pt; } td, th { border:1px solid black; border-collapse:collapse; } th { color:white; background-color:black; } table, tr, td, th { padding: 2px; margin: 0px } table { margin-left:50px; } </style> <style media='print'> // Put alternate hardcopy styles here </style> '@
Esto es una gran manera de construir informes porque realmente aprovecha los patrones y las técnicas de Windows PowerShell. Es fácil de ampliar un informe para incluir información adicional. El script que genera el informe es relativamente fácil para alguien que necesite hacer el mantenimiento. Y cada sección del informe se produce por una línea de comandos de Windows PowerShell sola (aunque largo), por lo que son fáciles de organizar, reutilizar y reutilizar.
**Don Jones**es un premio de MVP de Microsoft y autor de "Aprender Windows PowerShell en un mes de comidas" (publicaciones de Manning, 2011), un libro diseñado para ayudar a cualquier administrador efectivizada con Windows PowerShell. Jones también ofrece formación de Windows PowerShell in situ y pública. Contacto con él a través de su sitio Web en ConcentratedTech.com.