This is a quick post on using hash tables to splat parameters to help organize and tidy up your powershell scripts.
I’m going to assume that everyone is familiar with the concept and simply present a quick sample script. It’s intentionally very basic (no parameter validation or error checking). The premise is that you have a csv file from HR with a list of user names and the number of vacation days they have remaining. You need to send them an email notification and CC their manager.
First, this script without any splatting:
Param ( $ImportFile = './user_vacation_list.csv', $EmailFrom = 'HR@mycompany.com', $EmailSubject = 'Unused vacation reminder', $SMTPServer = 'mail.mycompany.com' ) Foreach ($User in inport-csv $ImportFile) { $ADUser = Get-ADUser $User.Name -Propertes Mail,Manager $Manager = Get-ADUser $User.Manager -Properties Mail $EmailTo = $ADUser.Mail $EmailCC = $Manager.Mail $EmailBody = "You have $($User.VacationDays) unused vacation days." Send-MailMessage -From $EmailFrom -To $EmailTo -Cc $EmailCC -Subject $EmailSubject -SmtpServer $SMTPServer -Body $EmailBody }
Now I’m going to do the same thing, but using hash tables to pass my parameters to send-mailmessage:
Param ( $ImportFile = './user_vacation_list.csv', $EmailFrom = 'HR@mycompany.com', $EmailSubject = 'Unused vacation reminder', $SMTPServer = 'mail.mycompany.com' ) $AllEmailParams = @{ From = $EmailFrom Subject = $EmailSubject SMTPServer = $SMTPServer } Foreach ($User in inport-csv $ImportFile) { $ADUser = Get-ADUser $User.Name -Propertes Mail,Manager $Manager = Get-ADUser $User.Manager -Properties Mail $ThisEmailParams = @{ To = $ADUser.Mail Cc = $Manager.Mail Body = "You have $($User.VacationDays) unused vacation days." } Send-MailMessage @AllEmailParams @ThisEmailParams }
The “fixed” parameters that are being passed as script parameters can be in one hash table, close to the param block where it’s easy to associate the script parameters being passed with the send-mail message parameters they will map to.
Another hash table inside the loop is used to hold and set the parameters that will unique to each email, and then both are splatted to the command when it’s time to send the email. I think this produces much cleaner and more intuitive code.
I didn’t know you could double splat like that. I like the separation this provides. Good tip.
Very nice mjoliner!
You stole my thunder sir š I do love splatting and agree that it makes the code look nicer and read easier.
Pingback: Us a script cache to speed up repetitive directory lookups | The Powershell Workbench