MiracleJobLogo
エンジニアのエンジニアによるエンジニアのためのサイト
News 07/19 おすすめ情報に 『 【資格取得者速報】 Aさん 「 Microsoft Security, Compliance, and Identity Fundamentals」 』 を追加しました。
会員登録するとキャリア診断やサイトに参加することができます。
あなたにおすすめな技術情報、資格、仕事などをお知らせします。

無料会員登録


パスワードを忘れた場合
LINEで送る
MiracleJobBanaLeft1
MiracleJobBanaLeft2


【PowerShell】スプラッティングを使ってスクリプトを読みやすくしよう
profile-img
投稿者: muto-sanさん
投稿日:2019/06/18 23:59
更新日:2019/06/19 00:01
like-img
分類
技術
テクノロジー
Windows系サーバ
キャリア
運用・保守 / 構築
投稿内容
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

コメント


MiracleJobBanaRight1
MiracleJobBanaRight2
MiracleJobBanaRight3