大量のPowerShellのコマンドを実行することがあるときに、CSV形式のパラメータ一覧を読み込ませてコマンドを一括実行する方法を知っておくと、とても便利です。
本記事では、例として、大量のコマンドを実行するシナリオとその実現方法詳細を説明します。
シナリオ
ある組織で、Teamsの利用を開放することになりました。
Teams利用開始にあたり以下のような準備をします。
- 課ごとのチームをあらかじめ作成しておく
- 課は200個ある
この場合、200個のチームを作成する必要があります。
もちろんTeams管理センター(GUI)から一つずつ手作業で作成する方法もありますが、この個数であればやはりPowerShellコマンドで一括実行し効率をあげたいです。
ではこのPowerShellコマンド200個はどうやって準備しますか?
私がこれまでに一番よくやった方法としては、まずコマンド実行に必要なパラメータをExcelファイルに一覧化、同じシート内でExcel関数によりパラメータを埋め込んだコマンドを生成する方法です。
ただ、この方法では、パラメータの数が多いときに関数が複雑になったり、関数の参照がずれて誤ったコマンドを作成してしまったり、それにより個数が多くチェックできないため誤ったままコマンドを実行してしまったりする、という難点があります。
Import-Csvを使う
そこで今回ご紹介したいのが、CSVを読み込ませてコマンドを実行する「Import-Csv」を使う方法です。
コマンド構成
Import-Csvのコマンド構成は以下です。オプションにForeachを付けて、この中でコマンドを繰り返し実行します。
Import-Csv "CSVのファイルパス" | Foreach { "一括実行したいコマンド" }
"CSVのファイルパス"部分には、 "一括実行したいコマンド"に渡すパラメータの一覧CSVを指定します。今回 "一括実行したいコマンド"は、以下のチーム作成を行うNew-Teamコマンドです。
New-Team -DisplayName "チーム" -Description "チームの説明" -Visibility "チームの種類"
読み込ませるCSV(パラメータ)の準備
Import-Csvのコマンドの"CSVのファイルパス"部分に指定するCSVを準備します。
New-Teamコマンドに必要な3つのパラメータを一覧にしますが、必ず.csv形式で作成してください。この時のCSVのヘッダ名は何でもOKです。わかりやすいものにしてください。
※日本語でも問題ありませんが、特殊文字や絵文字等はPowerShellに読み込ませた際にエラーとなる可能性があるため避けてください。
コマンドの形成
Import-Csvコマンドにチーム作成コマンドを埋め込むとこうなります。
(これではまだコマンド実行できません。)
Import-Csv "CSVのファイルパス" | Foreach { New-Team -DisplayName "チーム" -Description "チームの説明" -Visibility "チームの種類" }
実行できる形にするには、New-Teamのパラメータの部分("チーム"、"チームの説明"、"チームの種類"の部分)を変数にしてCSVから読み込んだ値を動的にセットできるようにします。
CSVの項目名(ヘッダに記載している文字列)の先頭に"$_."を付与すると、CSVの対応する列から値を読み込んで変数にセットします。
(これではまだコマンド実行できません。)
Import-Csv "CSVのファイルパス" | Foreach { New-Team -DisplayName $_.チーム名 -Description $_.チームの説明 -Visibility $_.チームの種類 }
一番大事な点として、CSVのヘッダ名とImport-Csvコマンド内の変数名($_.チーム名、$_.チームの説明、$_.チームの種類 の部分)を必ず一致させて下さい。
ここが一致していないと、Import-Csvコマンドを実行してもCSVから値を読み込めません。
準備したCSVのファイルパスをImport-Csvコマンドに埋め込めばコマンドは完成です。
Import-Csv "C:\チーム作成コマンド\チーム作成リスト.csv" | Foreach { New-Team -DisplayName $_.チーム名 -Description $_.チームの説明 -Visibility $_.チームの種類 }
※準備したCSVのファイルパスを確認(コピー)する方法
コマンド実行
PowerShellを起動し、コマンドを実行します。
今回はTeamsのコマンドであるため、Import-Csvコマンド実行前にTeams管理センターへの接続コマンド(Connect-MicrosoftTeams)を実行しています。
これでCSVの行数分、繰り返しNew-Teamコマンドが実行されます。
CSVに10行のチーム情報があれば、このコマンドを実行するだけで10個のチームが作成されます。
トラブルシュート
最後に、このコマンドを実行するときに起こりがちなエラーをご紹介します。
Import-Csvコマンドを実行したとき、上記のような”引数を確認できません。引数がnullまたは空です。…”エラーになったときは、読み込ませているCSVファイルに問題があります。
以下の点を再確認してみてください。
- .csv形式のファイルであるか(.xlsxなどの他のファイル形式になってないか)
- CSVの中身が文字化けしていないか
「CSVの中身が文字化けしていないか」を確認する際は、Excelアプリではなくメモ帳アプリで開いてみてください。
CSVファイルの中身が文字化けしていると以下のような状態になっています。
このエラーになるときの多くは、最初は.xlsx形式で作成したファイルを後から.csvにしたため(ファイル名をリネームしただけ)、ファイルの実態としては.xlsx形式のままで結局ファイルを読み込めなくなっています。
ファイルを作成するとき(最初に保存するとき)からCSVファイルとして作成したファイルを使うようにしてください。
終わりに
このImport-Csvコマンドの一番良いと思う点は、作業対象のリストを加工しなくて良い、というところだと思っています。
作業を立案・計画する人と実際に作業を行う人が別の人であることは多々ありますが、今回のシナリオで言うと、「どんなチームを作るかを考える人」と「実際にチームの作成作業をする人」が別だった場合に、Import-Csvコマンドを使うかどうかで作業工程・作業リスクに大きな差が出ます。
Import-Csvコマンドを使わない場合、「どんなチームを作るかを考える人」からもらったチーム一覧を「実際にチームの作成作業をする人」が加工してコマンドを作成することになり、手間と誤ったコマンドが作成されるリスクが発生します。
また、作業実施前に作業対象があってるかの確認として「どんなチームを作るかを考える人」に加工した一覧を見せて正しいかをチェックしてもらうことが難しくなります。
ですが、このImport-Csvコマンドを使うことにより、「どんなチームを作るかを考える人」に作りたいチームの一覧をCSVファイルで作ってもらえさえすれば、「実際にチームの作成作業をする人」はそのCSVファイルをそのままコマンドに読み込ませるだけで良くなります。
作業工程をシンプルにすることは作業時の事故を減らすことにつながるので、ぜひこのような方法をたくさん知っておいてください。
Hiroko, Kimura(日本ビジネスシステムズ株式会社)
Microsoft 365製品の提案~運用が担当領域、特にTeams/Teams Phone多めです。趣味は音楽とテレビと映画。趣味にしたいのは筋トレ(エンジニアには筋肉が必要)。
担当記事一覧