PowerShellはその性質上1行のコマンドが長くなりがちです。
メールをSMTP送信するコマンドレット「Send-MailMessage」を例に取ると
=================================
Send-MailMessage -SmtpServer smtp.gmail.com -Port 587 -Credential $Cred -UseSsl -Encoding UTF8 -From "xxxxxxx@gmail.com" -To "test@test.local" -Subject "This is test message" -Body "This is test message.`r`nHahaha!!!"
※ 変数[$Cred]にはあらかじめ[Get-Credential]で認証情報を代入しておく。
=================================
これだけで軽く200文字を超えます。
一般的にコーディングの際の1行あたりの文字数は80~100文字以内に抑えるべきというのがあり、200文字以上は明らかに長すぎます。
ちなみにPowerShellの場合は115文字を一つの目安とするコーディングスタイルがあります。
参考:
https://github.com/PoshCode/PowerShellPracticeAndStyle/blob/master/Style-Guide/Code-Layout-and-Formatting.md#maximum-line-length
PowerShellではバッククオート(`)を行末に置くことで行の継続を表すことができるため、上記と同様のコマンドを以下のように書くことが出来ます。
=================================
Send-MailMessage `
-SmtpServer smtp.gmail.com `
-Port 587 `
-Credential $Cred
-UseSsl `
-Encoding UTF8 `
-From "xxxxxxx@gmail.com" `
-To "test@test.local" `
-Subject "This is test message." `
-Body "This is test message.`r`nHahaha!!!"
=================================
これだけでもかなりスマートになりますね。
しかし、可読性を下げデバッグを困難にしやすいバッククオートの使用による行継続は可能であれば避けるべき。
という考え方があります。
参考:
https://github.com/PoshCode/PowerShellPracticeAndStyle/blob/master/Style-Guide/Readability.md#read-02-avoid-backticks
そこで、更に発展させてスプラッティングを用いた記法を使ってみましょう。
スプラッティングとは、変数にパラメーター値をまとめて格納し、引数としてコマンドに渡す記法です。
=================================
# MessageParams変数にコマンドのパラメーターを格納
$MessageParams = @{
SmtpServer = "smtp.gmail.com"
Port = 587
Credential = $Cred
UseSsl = $true
Encoding = "UTF8"
From = "xxxxxxx@gmail.com"
To = "test@test.local"
Subject = "This is test message."
Body = "This is test message.`r`nHahaha!!!"
}
# "@変数名"と表記することでパラメーターをまとめた引数としてコマンドに渡す
Send-MailMessage @MessageParams
=================================
上の例では全てのパラメーターをMessageParams変数に格納してコマンドに渡していますが、
一部のパラメーターのみを変更して複数回コマンドを実行する場合もスプラッティングは便利です。
=================================
# UserA,UserB,UserCの3人に同じ内容のメールを送りたい場合。
$To = @{
MailAddress =
"UserA@test.local",
"UserB@test.local",
"UserC@test.local"
}
$MessageParams = @{
SmtpServer = "smtp.gmail.com"
Port = 587
Credential = $Cred
UseSsl = $true
Encoding = "UTF8"
From = "xxxxxxx@gmail.com"
Subject = "This is test message."
Body = "This is test message.`r`nHahaha!!!"
}
$To | ForEach-Object {
Send-MailMessage -To $_.MailAddress @MessageParams
}
=================================
これで、3つのアドレスに同じ内容のメールを飛ばせます。
参考サイト:
about_Splatting
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_splatting?view=powershell-6