Windows PowerShell. Rivisitazione dei report

I report testuali possono rivelarsi spogli e meno informativi, quindi perché non utilizzare Windows PowerShell per generare report HTML?

Don Jones

Se hai intenzione di generare rapporti con Windows PowerShell, self-contained rapporti HTML sono una scelta molto migliore rispetto report basati su testo. La mia preferenza deriva dal fatto che i rapporti HTML sono significativamente più facili da creare, guardare molto più bello di quello di testo e sono ancora facili da allegare a un messaggio e-mail e invia intorno all'ufficio.

Diversi mesi fa, in questa colonna, ti dato alcuni suggerimenti per la produzione di report HTML in Windows PowerShell. Questo mese, diamo un'occhiata a come si possono migliorare tali relazioni.

Saltiamo solo dritto al codice, che è indicato nella Figura 1. Devono essere salvato in un file di script, come ad esempio C:\Report.ps1.

Figura 1 migliorare quei rapporti 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>"

Sarebbe esecuzione del report in Figura 1 come segue:

C:\Report –computername localhost > output.htm

Ecco cosa ho fatto — si può vedere che sto usando tre chiamate a Get-WmiObject per recuperare diversi bit di informazione. Ogni volta che sto utilizzando Select-Object per selezionare le proprietà in cui sono interessato. Nella maggior parte dei casi, sto creando colonne personalizzate così i valori come la memoria vengono visualizzati in unità di misura più conveniente.

Alla fine di ciascuna, sto usando ConvertTo-HTML per produrre un frammento HTML. Questo significa che mi sto solo il codice HTML necessario per produrre una tabella con la mia proprietà desiderate.

C'è un trucco che mi ha preso molto tempo per capire. ConvertTo-HTML produce alcune cose strane. Fondamentalmente, produrrà raccolte di stringhe. Prova di alimentazione che ConvertTo-HTML finale e si otterrà un messaggio di errore.

Aggirato il problema utilizzando tramite. Si può vedere questo in ciascuno dei primi tre blocchi, dove sto tubazioni il frammento HTML di tramite. Ciò assicura che ogni frammento è solo un mucchio di corde semplici. Come creo ogni frammento HTML, appende nella variabile $b.

Avrete anche notato che sto usando ConvertTo-HTML per applicare le intestazioni di sezione a quei frammenti HTML. Normalmente, ConvertTo-HTML inserisce solo quel "contenuto pre" come testo normale. Ho aggiunto <h2> HTML Tag quindi mia intestazioni di sezione vengono visualizzate come voci all'interno dell'HTML.

Dopo i tre blocchi di costruzione, si crea un foglio di stile HTML incorporato. Questo è dove si può giocare con gli stili per ottenere l'aspetto desiderato per la relazione finale. Controllare il riferimento alla lingua Cascading Style Sheet (CSS) per fogli di stile in più. Come può vivere con stile relativamente semplice, CSS non è troppo complicato.

L'ultima riga del mio script utilizza un finale ConvertTo-HTML. Inserire il foglio di stile nell'intestazione della pagina HTML, aggiungere un'intestazione globale per la pagina e inserire il contenuto di $b. Il finale HTML in Internet Explorer può essere visto in Figura 2.

After modifying the style sheets and converting output to HTML, this is the result

Figura 2 dopo la modifica i fogli di stile e conversione di output in HTML, questo è il risultato.

Qui ci sono alcuni altri trucchi che voglio sottolineare:

  1. Nei miei primi due comandi Select-Object, notare che ho usato una sintassi hashtable per costruire la proprietà output personalizzato. Nella maggior parte dei casi, appena sto creando un nome più bello per le colonne di output. In tre casi, però, sto facendo alcuni matematica per convertire i byte a Gigabyte.
  2. Nel primo blocco dove una query Win32_ComputerSystem, sto avendo ConvertTo-HTML formattare le informazioni in un elenco anziché lo stile di tabella predefinita (il parametro LIST come). Perché l'output riguarderà solo un singolo computer, ho pensato che l'elenco sembrava più bello.
  3. Ho avuto a scherzare con il foglio di stile un po per farlo cercando come avrei voluto. CSS è potente, ma può prendere un po ' di tweaking per ottenere lo stile esatto desiderato.

Ci si potrebbe chiedere perché lo script stesso non reindirizza l'output finale a un file, e che sarebbe una buona domanda. Il mio script lascia il codice HTML nella pipeline di Windows PowerShell, che significa che non devo metterlo in un file, se preferisce fare a qualcos'altro.

Per esempio, ho scritto una funzione personalizzata che mi permette di tubo nel codice HTML. Costruisce un messaggio di posta elettronica in formato HTML da tale contenuto. Avendo il mio script lasciare il codice HTML nella pipeline, io posso reindirizzare il codice HTML alla mia funzione l'invio di posta, reindirizzare il codice HTML in un file o fare qualsiasi altra cosa che voglio con esso. Semplicemente l'output HTML mi lascia con il maggior numero di opzioni.

Soprattutto, non utilizzare Write-Host. Write-Host Invia uscita direttamente allo schermo. Ti non dà alcuna possibilità di reindirizzare che a un file di trasformarlo in un messaggio e-mail o qualsiasi altra cosa.

Perché sto usando ConvertTo-HTML, Windows PowerShell sta facendo tutto il lavoro di formattazione in realtà la mia uscita. Non ho avuto ingannare questo, neanche. Scompigliando semplicemente con il CSS, posso facilmente cambiare il look della produzione finale.

È possibile inserire anche un foglio di stile per la visualizzazione sullo schermo e un foglio di stile separato per output stampato. In questo modo, se qualcuno consente di stampare il report, possono avere la formattazione che è appropriato per hardcopy. Per farlo, basta costruire il tuo foglio di stile come Figura 3.

Figura 3 fogli di stile differenti consentono di on-screen display e output stampato.

$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> '@

Questo è un ottimo modo per costruire relazioni, perché essa realmente sfrutta i modelli e le tecniche di Windows PowerShell. È facile estendere un report per includere informazioni aggiuntive. Lo script che produce la relazione è relativamente facile da seguire per qualcun altro che potrebbero aver bisogno di fare la manutenzione. E ogni sezione della relazione è prodotto da una riga di comando di Windows PowerShell singola (anche se lunga), quindi sono facili da riorganizzare, riutilizzare e riutilizzare.

Don Jones

**Don Jones**è un Microsoft MVP Award destinatario e autore di "Imparare Windows PowerShell in un mese di pranzi" (Manning Publications, 2011), un libro progettato per aiutare ogni amministratore di diventare effettiva con Windows PowerShell. Jones offre anche la formazione di Windows PowerShell pubblici e in loco. Contattarlo tramite il suo sito Web a ConcentratedTech.com.

Contenuti correlati