Quando si discute di task automatizzati non si può fare a meno di menzionare la necessità di ricevere notifiche sull'esito delle operazioni effettuate. Immaginate di avere appena creato uno script di Windows PowerShell in grado di controllare i log di un determinato applicativo ed eliminare quelli molto datati: avete fiducia di ciò che avete scritto ma, nel lungo periodo, chi controlla il controllore?
Non sarebbe fantastico poter ricevere via email un resoconto, ad esempio, sui file di volta in volta rimossi?
Fortunatamente per noi, PowerShell consente di utilizzare il cmdlet ConvertTo-Html per generare una rappresentazione in formato HTML di un oggetto (o di un set di oggetti). Questo cmdlet è utile quando desideriamo creare in maniera pressochè automatica il corpo del messaggio di un'email in formato HTML, a partire dal risultato di un'operazione all'interno di PowerShell.
Utilizzare il cmdlet ConverTo-Html è semplice come mettere in pipe il cmdlet in seguito ai nostri comandi:
$files = (
Get-ChildItem |
Where-Object { $_.LastWriteTime -lt (Get-Date).AddYears(-1) }
)
$html = (
$files |
Select-Object FullName, CreationTime, LastWriteTime, Length |
ConvertTo-Html
)
Dopo l'esecuzione del nostro script (vedi questo snippet per approfondimenti sul tema), la variabile $html conterrà una rappresentazione in formato tabella HTML della lista dei file con almeno un anno di tempo dall'ultima scrittura ($files). E se siete come me e volete assicurarvene, potete sempre memorizzare il contenuto della variabile in un file ed aprire quest'ultimo con un browser:
$html | Set-Content 'test.html'
(New-Object -Com Shell.Application).ShellExecute('test.html')
Ok, non è il massimo dello stile ma ci si può lavorare un po' e migliorare la resa: se necessario, infatti, ConvertTo-Html consente di intervenire sulle sezioni HEAD e BODY dell'output html ed inserirvi del testo a piacere.
Una volta che l'ipertesto del risultato della nostra operazione è stato preparato possiamo procedere all'esecuzione della nostra operazione ed all'invio dell'esito via email.
Rimuovere i file è semplice e ci si può appoggiare alla variabile $files, definita in precedenza (vedi questo snippet per approfondimenti):
$files | Remove-Item
La spedizione del messaggio, invece, utilizza direttamente la classe MailMessage, del namespace System.Net.Mail; l'esempio che segue sfrutta l'oggetto $smtpClient creato in questo snippet.
1
$message = New-Object System.Net.Mail.MailMessage
2
$message.Body = $html
3
$message.IsBodyHtml = $true
4
$message.From = 'me@examle.com'
5
$message.To.Add('you@example.com')
6
$message.Subject = "Risultato dell'operazione"
7
8
$smtpClient.Send($message)
I comandi alle righe 2 e 3, in particolare, ci hanno consentito di creare il messaggio in base al testo HTML creato dal cmdlet ConverTo-Html in precedenza.