Invoke-Command
や Invoke-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 }
今回検索したキーワード
- PowerShell 引数 まとめて
- PowerShell 引数 配列
- PowerShell 引数を追加
- PowerShell 配列を引数
- PowerShell 配列で渡す
- PowerShell ハッシュ 追加
引数を配列でまとめて渡すという考え方自体はありそうだと思っていましたが、スプラッティングという言葉を初めて知りました。これは収穫。
今度から調べるときは「PowerShell スプラッティング」で検索すれば最短でたどり着けます。
そしてMicrosoftのドキュメントが意外にも丁寧に解説されていたので非常に助かりました。