Documentos de Académico
Documentos de Profesional
Documentos de Cultura
PowerShell (Spanish)
The DevOps Collective, Inc.
Este libro está a la venta en
http://leanpub.com/creating-html-reports-in-powershell-spanish
Recopilación de la información . . . . . . . . . . . . . . . . 7
Construyendo el HTML . . . . . . . . . . . . . . . . . . . . . 12
Contactándome . . . . . . . . . . . . . . . . . . . . . . . . . . 31
Creating HTML Reports
in PowerShell
Por Don Jones
Una de esas reglas es que cada archivo debe contener uno y un solo
documento HTML. Es todo el contenido entre la etiqueta <HTML> y la
etiqueta </HTML> (los nombres de las etiquetas no distinguen entre
mayúsculas y minúsculas, y es común verlas en minúsculas como
en el ejemplo anterior). Menciono esto porque una de las cosas más
comunes que veré a la gente hacer con PowerShell se parecerá a
esto:
“Aaarrrggh,” dice mi colon cada vez que veo eso. Básicamente, está
diciendo a PowerShell que cree tres documentos HTML completos
y los coloque en un solo archivo. Mientras que algunos navega-
dores (Internet Explorer, por ejemplo) entenderán eso e intentarán
mostrar algo, es simplemente incorrecto hacer esto. Una vez que
empiece generar esta clase de informes, descubrirá rápidamente que
este enfoque es doloroso. No es culpa de PowerShell; Simplemente
no está siguiendo las reglas. ¡Por eso esta guía!
Se dará cuenta que el HTML consiste en muchas otras etiquetas,
como: <TABLE>, <TD>, <HEAD>, y otras más. La mayoría de estas
forman parejas, lo que significa que vienen en una etiqueta de
apertura como <TD> y una etiqueta de cierre como </TD>. La etiqueta
<TD> representa una celda de tabla, y todo entre esas etiquetas se
considera el contenido de esa celda.
La sección <HEAD> es importante. Lo que hay dentro no es normal-
mente visible en el navegador. En su lugar, el navegador se centra
en lo que hay en la sección <BODY>. La sección <HEAD> proporciona
metadatos adicionales, como el título de la página (lo se muestra
en la barra de título o pestaña de la ventana del navegador, no en
Bases del informe HTML 5
• Información de la computadora
• Versión del sistema operativo del equipo, número de compi-
lación y versión del Service Pack.
• Información de hardware: la cantidad de RAM instalada y el
número de cores, junto con el fabricante y el modelo.
• Una lista de todos los procesos que se ejecutan en la máquina.
• Una lista de todos los servicios que están configurados para
iniciarse automáticamente, pero que no se están ejecutando.
• Información sobre todos los adaptadores de red físicos en el
equipo. No direcciones IP, necesariamente - información de
hardware como la dirección MAC
algunas técnicas específicas. Una vez más, espero que usted pueda
adaptar esto a sus necesidades precisas.
Recopilación de la
información
Soy un gran fan de la programación modular. Gran, gran fan.
Con eso en mente, tiendo a escribir funciones que recopilan la
información que quiero incluir en mi informe, y normalmente
haré una función por sección principal de mi informe. Verá dentro
de poco cómo es eso de beneficioso. Escribiendo cada función
individualmente, hago más fácil de usar esa misma información en
otras tareas, y hago más fácil depurar cada una. El truco consiste en
que cada salida de función sea un solo tipo de objeto que combine
toda la información de esa sección para el informe. He creado cinco
funciones, que he pegado en un solo archivo de script. Le mostraré
cada una de esas funciones una a la vez, con un breve comentario.
Aquí va la primera:
1 function Get-InfoOS {
2 [CmdletBinding()]
3 param(
4 [Parameter(Mandatory=$True)][string]$ComputerName
5 )
6 $os = Get-WmiObject -class Win32_OperatingSystem -Com\
7 puterName $ComputerName
8 $props = @{'OSVersion'=$os.version;
9 'SPVersion'=$os.servicepackmajorversion;
10 'OSBuild'=$os.buildnumber}
11 New-Object -TypeName PSObject -Property $props
12 }
1 function Get-InfoCompSystem {
2 [CmdletBinding()]
3 param(
4 [Parameter(Mandatory=$True)][string]$ComputerName
5 )
6 $cs = Get-WmiObject -class Win32_ComputerSystem -Comp\
7 uterName $ComputerName
8 $props = @{'Model'=$cs.model;
9 'Manufacturer'=$cs.manufacturer;
10 'RAM (GB)'="{0:N2}" -f ($cs.totalphysicalm\
11 emory / 1GB);
12 'Sockets'=$cs.numberofprocessors;
13 'Cores'=$cs.numberoflogicalprocessors}
14 New-Object -TypeName PSObject -Property $props
15 }
1 function Get-InfoBadService {
2 [CmdletBinding()]
3 param(
4 [Parameter(Mandatory=$True)][string]$ComputerName
5 )
6 $svcs = Get-WmiObject -class Win32_Service -ComputerN\
7 ame $ComputerName `
8 -Filter "StartMode='Auto' AND State<>'Running'"
9 foreach ($svc in $svcs) {
10 $props = @{'ServiceName'=$svc.name;
11 'LogonAccount'=$svc.startname;
12 'DisplayName'=$svc.displayname}
13 New-Object -TypeName PSObject -Property $props
14 }
15 }
1 function Get-InfoProc {
2 [CmdletBinding()]
3 param(
4 [Parameter(Mandatory=$True)][string]$ComputerName
5 )
6 $procs = Get-WmiObject -class Win32_Process -Computer\
7 Name $ComputerName
8 foreach ($proc in $procs) {
9 $props = @{'ProcName'=$proc.name;
10 'Executable'=$proc.ExecutablePath}
Recopilación de la información 10
1 function Get-InfoNIC {
2 [CmdletBinding()]
3 param(
4 [Parameter(Mandatory=$True)][string]$ComputerName
5 )
6 $nics = Get-WmiObject -class Win32_NetworkAdapter -Co\
7 mputerName $ComputerName `
8 -Filter "PhysicalAdapter=True"
9 foreach ($nic in $nics) {
10 $props = @{'NICName'=$nic.servicename;
11 'Speed'=$nic.speed / 1MB -as [int];
12 'Manufacturer'=$nic.manufacturer;
13 'MACAddress'=$nic.macaddress}
14 New-Object -TypeName PSObject -Property $props
15 }
16 }
18 .PARAMETER CssPath
19 The path and filename of the CSS template to use.
20
21 .EXAMPLE
22 .\New-HTMLSystemReport -ComputerName ONE,TWO `
23 -Path C:\Reports\
24 #>
25 [CmdletBinding()]
26 param(
27 [Parameter(Mandatory=$True,
28 ValueFromPipeline=$True,
29 ValueFromPipelineByPropertyName=$True)]
30 [string[]]$ComputerName,
31
32 [Parameter(Mandatory=$True)]
33 [string]$Path
34 )
1 BEGIN {
2 Remove-Module EnhancedHTML2
3 Import-Module EnhancedHTML2
4 }
1 PROCESS {
2
3 $style = @"
4 <style>
5 body {
6 color:#333333;
7 font-family:Calibri,Tahoma;
8 font-size: 10pt;
9 }
10
11 h1 {
12 text-align:center;
13 }
14
15 h2 {
16 border-top:1px solid #666666;
17 }
18
19 th {
20 font-weight:bold;
21 color:#eeeeee;
22 background-color:#333333;
23 cursor:pointer;
24 }
25
26 .odd { background-color:#ffffff; }
27
28 .even { background-color:#dddddd; }
29
30 .paginate_enabled_next, .paginate_enabled_previous {
31 cursor:pointer;
32 border:1px solid #222222;
33 background-color:#dddddd;
34 padding:2px;
35 margin:4px;
Construyendo el HTML 15
36 border-radius:2px;
37 }
38
39 .paginate_disabled_previous, .paginate_disabled_next {
40 color:#666666;
41 cursor:pointer;
42 background-color:#dddddd;
43 padding:2px;
44 margin:4px;
45 border-radius:2px;
46 }
47
48 .dataTables_info { margin-bottom:4px; }
49
50 .sectionheader { cursor:pointer; }
51
52 .sectionheader:hover { color:red; }
53
54 .grid { width:100% }
55
56 .red {
57 color:red;
58 font-weight:bold;
59 }
60 </style>
61 "@
1 function Get-InfoOS {
2 [CmdletBinding()]
3 param(
4 [Parameter(Mandatory=$True)][string]$ComputerName
5 )
6 $os = Get-WmiObject -class Win32_OperatingSystem -Com\
7 puterName $ComputerName
8 $props = @{'OSVersion'=$os.version
9 'SPVersion'=$os.servicepackmajorversion;
10 'OSBuild'=$os.buildnumber}
11 New-Object -TypeName PSObject -Property $props
12 }
Construyendo el HTML 17
13
14 function Get-InfoCompSystem {
15 [CmdletBinding()]
16 param(
17 [Parameter(Mandatory=$True)][string]$ComputerName
18 )
19 $cs = Get-WmiObject -class Win32_ComputerSystem -Comp\
20 uterName $ComputerName
21 $props = @{'Model'=$cs.model;
22 'Manufacturer'=$cs.manufacturer;
23 'RAM (GB)'="{0:N2}" -f ($cs.totalphysicalm\
24 emory / 1GB);
25 'Sockets'=$cs.numberofprocessors;
26 'Cores'=$cs.numberoflogicalprocessors}
27 New-Object -TypeName PSObject -Property $props
28 }
29
30 function Get-InfoBadService {
31 [CmdletBinding()]
32 param(
33 [Parameter(Mandatory=$True)][string]$ComputerName
34 )
35 $svcs = Get-WmiObject -class Win32_Service -ComputerN\
36 ame $ComputerName `
37 -Filter "StartMode='Auto' AND State<>'Running'"
38 foreach ($svc in $svcs) {
39 $props = @{'ServiceName'=$svc.name;
40 'LogonAccount'=$svc.startname;
41 'DisplayName'=$svc.displayname}
42 New-Object -TypeName PSObject -Property $props
43 }
44 }
45
46 function Get-InfoProc {
47 [CmdletBinding()]
Construyendo el HTML 18
48 param(
49 [Parameter(Mandatory=$True)][string]$ComputerName
50 )
51 $procs = Get-WmiObject -class Win32_Process -Computer\
52 Name $ComputerName
53 foreach ($proc in $procs) {
54 $props = @{'ProcName'=$proc.name;
55 'Executable'=$proc.ExecutablePath}
56 New-Object -TypeName PSObject -Property $props
57 }
58 }
59
60 function Get-InfoNIC {
61 [CmdletBinding()]
62 param(
63 [Parameter(Mandatory=$True)][string]$ComputerName
64 )
65 $nics = Get-WmiObject -class Win32_NetworkAdapter -Co\
66 mputerName $ComputerName `
67 -Filter "PhysicalAdapter=True"
68 foreach ($nic in $nics) {
69 $props = @{'NICName'=$nic.servicename;
70 'Speed'=$nic.speed / 1MB -as [int];
71 'Manufacturer'=$nic.manufacturer;
72 'MACAddress'=$nic.macaddress}
73 New-Object -TypeName PSObject -Property $props
74 }
75 }
76
77 function Get-InfoDisk {
78 [CmdletBinding()]
79 param(
80 [Parameter(Mandatory=$True)][string]$ComputerName
81 )
82 $drives = Get-WmiObject -class Win32_LogicalDisk -Com\
Construyendo el HTML 19
83 puterName $ComputerName `
84 -Filter "DriveType=3"
85 foreach ($drive in $drives) {
86 $props = @{'Drive'=$drive.DeviceID;
87 'Size'=$drive.size / 1GB -as [int];
88 'Free'="{0:N2}" -f ($drive.freespace /\
89 1GB);
90 'FreePct'=$drive.freespace / $drive.si\
91 ze * 100 -as [int]}
92 New-Object -TypeName PSObject -Property $props
93 }
94 }
1 if ($everything_ok) {
2 $filepath = Join-Path -Path $Path -ChildPath "$co\
3 mputer.html"
1 $params = @{'As'='List';
2 'PreContent'='<h2>OS</h2>'}
3 $html_os = Get-InfoOS -ComputerName $computer |
4 ConvertTo-EnhancedHTMLFragment @params
1 $params = @{'As'='List';
2 'PreContent'='<h2>Computer System</h2\
3 >'}
4 $html_cs = Get-InfoCompSystem -ComputerName $comp\
5 uter |
6 ConvertTo-EnhancedHTMLFragment @params
1 $params = @{'As'='Table';
2 'PreContent'='<h2>♦ Local Disks\
3 </h2>';
4 'EvenRowCssClass'='even';
5 'OddRowCssClass'='odd';
6 'MakeTableDynamic'=$true;
7 'TableCssClass'='grid';
8 'Properties'='Drive',
9 @{n='Size(GB)';e={$_.Size}},
10 @{n='Free(GB)';e={$_.Free};css={if ($_.Fre\
11 ePct -lt 80) { 'red' }}},
12 @{n='Free(%)';e={$_.FreePct};css={if ($_.F\
13 reeePct -lt 80) { 'red' }}}}
14
15 $html_dr = Get-InfoDisk -ComputerName $computer |
16 ConvertTo-EnhancedHTMLFragment @params
1 $params = @{'As'='Table';
2 'PreContent'='<h2>♦ Proce\
3 sses</h2>';
4 'MakeTableDynamic'=$true;
5 'TableCssClass'='grid'}
6 $html_pr = Get-InfoProc -ComputerName $computer |
7 ConvertTo-EnhancedHTMLFragm\
8 ent @params
9
10 $params = @{'As'='Table';
11 'PreContent'='<h2>♦ Servi\
12 ces to Check</h2>';
13 'EvenRowCssClass'='even';
14 'OddRowCssClass'='odd';
15 'MakeHiddenSection'=$true;
16 'TableCssClass'='grid'}
17
18 $html_sv = Get-InfoBadService -ComputerName $computer |
19 ConvertTo-EnhancedHTMLFrag\
20 ment @params
1 $params = @{'As'='Table';
2 'PreContent'='<h2>♦ NICs</h2>';
3 'EvenRowCssClass'='even';
4 'OddRowCssClass'='odd';
5 'MakeHiddenSection'=$true;
6 'TableCssClass'='grid'}
7 $html_na = Get-InfoNIC -ComputerName $Computer |
8 ConvertTo-EnhancedHTMLFragment @params
1 $params = @{'CssStyleSheet'=$style;
2 'Title'="System Report for $computer";
3 'PreContent'="<h1>System Report for $\
4 computer</h1>";
5 'HTMLFragments'=@($html_os,$html_cs,$html_dr,\
6 $html_pr,$html_sv,$html_na);
7 'jQueryDataTableUri'='C:\html\jqueryd\
8 atatable.js';
9 'jQueryUri'='C:\html\jquery.js'}
10 ConvertTo-EnhancedHTML @params |
11 Out-File -FilePath $filepath
12
13 <#
14 $params = @{'CssStyleSheet'=$style;
15 'Title'="System Report for $computer";
16 'PreContent'="<h1>System Report for $\
17 computer</h1>";
18 'HTMLFragments'=@($html_os,$html_cs,$html_dr,\
19 $html_pr,$html_sv,$html_na)}
20 ConvertTo-EnhancedHTML @params |
21 Out-File -FilePath $filepath
22 #>
23 }
Construyendo el HTML 26
24 }
25
26 }
image004.png
1 $params = @{'CssStyleSheet'=$style;
2 'Title'="System Report for $computer";
3 'PreContent'="<h1>System Report for $\
4 computer</h1>";
5 'CssIdsToMakeDataTables'=@('tableProc\
6 ','tableNIC','tableSvc');
7 'HTMLFragments'=@($html_os,$html_cs,$\
8 html_pr,$html_sv,$html_na)}
9 ConvertTo-EnhancedHTML @params |
10 Out-File -FilePath $filepath
image006.png
1 $OnLoadFormEvent={
2 #TODO: Initialize Form Controls here
3 $web.Navigate('file://C:\report.html')
4 }
image007.png