自動化厨のプログラミングメモブログ │ CODE:LIFE

Python/ExcelVBA/JavaScript/Raspberry Piなどで色んなことを自動化

New-DistributionGroup のMembers引数に配列を渡したいときはハッシュテーブルスプラッティング

Invoke-CommandInvoke-Expression なども考えられるが、今回の例に最も適しているであろう「スプラッティング」という方法を用いる。

実装例

以下のようなCSVをもとに配布リストの作成とメンバーの登録を同時に実行したいとする。

"address","members"
"sample1@codelife.cafe","alice@codelife.cafe,bob@codelife.cafe"
"sample2@codelife.cafe","alice@codelife.cafe,bob@codelife.cafe"

membersが一つの文字列として認識されてしまうパターン

これでいけると思いきや alice@codelife.cafe,bob@codelife.cafe というアドレスは存在しないとエラーが発生する。

$groups = Import-Csv "sample.csv"
foreach($group in $groups)
{
    New-DistributionGroup $group.Address $group.member
}
A positional parameter cannot be found that accepts argument 'alice@codelife.ca
fe,bob@codelife.cafe'.
    + CategoryInfo          : InvalidArgument: (:) [New-DistributionGroup]、Par 
   ameterBindingException
    + FullyQualifiedErrorId : PositionalParameterNotFound,New-DistributionGrou 
   p
    + PSComputerName        : outlook.office365.com
 
A positional parameter cannot be found that accepts argument 'alice@codelife.ca
fe,bob@codelife.cafe'.
    + CategoryInfo          : InvalidArgument: (:) [New-DistributionGroup]、Par 
   ameterBindingException
    + FullyQualifiedErrorId : PositionalParameterNotFound,New-DistributionGrou 
   p
    + PSComputerName        : outlook.office365.com

配列に変換しても受け付けているのは文字列なのでエラーになるパターン

$groups = Import-Csv "sample.csv"
foreach($group in $groups)
{
    New-DistributionGroup $group.Address $group.member.Split(",")
}
Removed the PSSession ExchangeOnlineInternalSession_3 connected to outlook.offic
e365.com
A positional parameter cannot be found that accepts argument 'alice@codelife.ca
fe bob@codelife.cafe'.
    + CategoryInfo          : InvalidArgument: (:) [New-DistributionGroup]、Par 
   ameterBindingException
    + FullyQualifiedErrorId : PositionalParameterNotFound,New-DistributionGrou 
   p
    + PSComputerName        : outlook.office365.com
 
A positional parameter cannot be found that accepts argument 'alice@codelife.ca
fe bob@codelife.cafe'.
    + CategoryInfo          : InvalidArgument: (:) [New-DistributionGroup]、Par 
   ameterBindingException
    + FullyQualifiedErrorId : PositionalParameterNotFound,New-DistributionGrou 
   p
    + PSComputerName        : outlook.office365.com

スプラッティングなら上手くいく

ハッシュテーブル(連想配列)として引数を定義し、 @ 付きで引数として渡す。

# Exchange Onlineに接続
Connect-ExchangeOnline

# CSVインポート
$groups = Import-Csv "sample.csv"

# 行数ループ
foreach($group in $groups)
{
    # 引数をハッシュテーブル(連想配列)として定義
    $HashArguments = @{
        Name = $group.Address
        Members = $group.member.Split(",")
    }

    # コマンドにハッシュテーブル渡す※ $ ではなく @ であることに注意
    New-DistributionGroup @HashArguments
}

https://s3.us-west-2.amazonaws.com/secure.notion-static.com/ef0adcbb-e61d-4d93-98f4-a72492ce0586/2020-08-20_00h31_32.gif?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAT73L2G45O3KS52Y5%2F20200912%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20200912T055017Z&X-Amz-Expires=86400&X-Amz-Signature=4beddac0696cda08baca71a201861291ff422743cfcb1d65ee19575d3210c80c&X-Amz-SignedHeaders=host

今回検索したキーワード

  • PowerShell 引数 まとめて
  • PowerShell 引数 配列
  • PowerShell 引数を追加
  • PowerShell 配列を引数
  • PowerShell 配列で渡す
  • PowerShell ハッシュ 追加

引数を配列でまとめて渡すという考え方自体はありそうだと思っていましたが、スプラッティングという言葉を初めて知りました。これは収穫。

今度から調べるときは「PowerShell スプラッティング」で検索すれば最短でたどり着けます。

そしてMicrosoftのドキュメントが意外にも丁寧に解説されていたので非常に助かりました。

参考になったページ

qiita.com

qiita.com

docs.microsoft.com

docs.microsoft.com