PowewShellで一括処理をするスクリプトを考える際のステップ:後編

はじめに

PowerShellのスクリプトを例に、あまりスクリプト作成に慣れていない方向けに、一括処理までの考え方をステップごとに分けて説明しています。

前回は、スクリプトの前段階として、テストデータの用意やPowerShellコマンドレット、パラメーターの確認まで行いました。

blog.jbs.co.jp

今回もステップごとに考え、最終的に繰り返しを使ったスクリプトを完成させます。

ゴールの確認

現状、PowerShellのコマンドレットやパラメーターまで判明しています。

$PasswordProfile = New-Object -TypeName Microsoft.Open.AzureAD.Model.PasswordProfile
$PasswordProfile.Password = "<Password>"
New-AzureADUser -Department:技術部  -DisplayName:BlogUserB  -GivenName:UserB  -JobTitle:部長  -MailNickName:bloguserB  -State:東京都  -Surname:Blog  -UserPrincipalName:bloguserB@example.com  -UserType:Member -AccountEnabled:$False -PasswordProfile:$PasswordProfile

ここから、下記のような複数のデータを一括処理できる形に持っていきくのが今回のゴールです。

ID 役職 部署 勤務地
bloguserA Blog UserA 部長 技術部 東京
bloguserB Blog UserB 課長 技術部 大阪
(中略)
bloguserG Blog UserG 一般社員 技術部 東京

変数への置き換え

現在、New-AzureADUserでの処理は決め打ちの値が入っています。いったんこれを、変数を使う形に置き換えたいと思います。

変数名は、分かりやすくするために、New-AzureADUserのパラメーター名をそのまま使いたいと思います。

$Department = "技術部"
$DisplayName = "BlogUserB"
$GivenName = "UserB"
$JobTitle = "部長"
$MailNickName = "bloguserB"
$State = "東京都"
$Surname = "Blog"
$UserPrincipalName = "bloguserB@example.com"

$PasswordProfile = New-Object -TypeName Microsoft.Open.AzureAD.Model.PasswordProfile
$PasswordProfile.Password = "<Password>"

New-AzureADUser -Department:$Department -DisplayName:$DisplayName -GivenName:$GivenName -JobTitle:$JobTitle -MailNickName:$MailNickName -State:$State -Surname:$Surname -UserPrincipalName:$UserPrincipalName -UserType:Member -AccountEnabled:$False -PasswordProfile:$PasswordProfile

前回作成したBlogUserBを一度削除してから上記を実行し、ユーザーが作成できることを確認します。

変数に置き換えてもコマンドレットが実行できることを確認しました。

CSVのデータと変数のマッチング

続いで、CSVのデータのどれを使ってどの変数に割り当てるかを考えます。

変数名 値の例 使用する列や値
$Department "技術部" [部署]
$DisplayName "BlogUserB" [姓] + [名]
$GivenName "UserB" [名]
$JobTitle "部長" [役職]
$MailNickName "bloguserB" [ID]
$State "東京都" [勤務地]
$Surname "Blog" [姓
$UserPrincipalName "bloguserB@example.com" [ID] + "@example.com"

こうしてみると、CSVにそのままの値が無く、複数の列や特定の文字列を使って生成する必要があるパラメーターもある事が分かります。

列名の変更

列名が日本語のままでも出来ないわけではないのですが、パラメーターに合わせて英語に置き換えたほうが分かりやすいので、そのようにします。

MailNickName Surname GivenName JobTitle Department State
bloguserA Blog UserA 部長 技術部 東京
bloguserB Blog UserB 課長 技術部 大阪
(中略)
bloguserG Blog UserG 一般社員 技術部 東京

その上で、先ほどの変数リストも更新します。

変数名 値の例 使用する列や値
$Department "技術部" [Department]
$DisplayName "BlogUserB" [Surname] + [GivenName]
$GivenName "UserB" [GivenName]
$JobTitle "部長" [JobTitle]
$MailNickName "bloguserB" [MailNickName]
$State "東京都" [State]
$Surname "Blog" [Surname]
$UserPrincipalName "bloguserB@example.com" [MailNickName] + "@example.com"

CSVファイルを読み込む

修正したCSVファイルを読み込み、すべてのデータを読み込めているか、行や列を指定して値を取り出せるかどうか確認します。

$users = Import-CSV -Path ./UserList.csv -Encoding UTF8
$users | FT
$users[0]
$users.MailNickName
$users.JobTitle[1]

意図通りに値を取り出せました。

データの行数を減らす

この先のスクリプトを作成するにあたって、いきなり値が複数あると切り分けが難しいことがあります。

そこで、まずは1行だけのデータを用意しておきます。

MailNickName Surname GivenName JobTitle Department State
bloguserA Blog UserA 部長 技術部 東京

繰り返しを実行する

ここまできてようやく繰り返しの処理に入っていきます。

今回は、foreachを使い、繰り返しの処理毎に変数をセットしなおす形にしました。*1

# CSVファイルを読み込む
$users = Import-CSV -Path ./UserList.csv -Encoding UTF8

# パスワードの設定
$PasswordProfile = New-Object -TypeName Microsoft.Open.AzureAD.Model.PasswordProfile
$PasswordProfile.Password = "<Password>"

# ユーザーの作成
foreach($user in $users){
    # CSVから変数を設定
    $Department = $user.Department
    $DisplayName = $user.Surname + $user.GivenName
    $GivenName = $user.GivenName
    $JobTitle = $user.JobTitle
    $MailNickName = $user.MailNickName
    $State = $user.State
    $Surname = $user.Surname
    $UserPrincipalName = $user.MailNickName + "@example.com"
    # ユーザーの作成
    New-AzureADUser -Department:$Department -DisplayName:$DisplayName -GivenName:$GivenName -JobTitle:$JobTitle -MailNickName:$MailNickName -State:$State -Surname:$Surname -UserPrincipalName:$UserPrincipalName -UserType:Member -AccountEnabled:$False -PasswordProfile:$PasswordProfile
}

うまく実行できました。

ここでうまくいかない場合は、foreach内の各変数がきちんと設定されているか、一つ一つ確認しましょう。

複数のデータで実施する

いよいよ仕上げです。

先ほどテストデータを1行にしましたが、元の件数に戻します。

MailNickName Surname GivenName JobTitle Department State
bloguserA Blog UserA 部長 技術部 東京
bloguserB Blog UserB 課長 技術部 大阪
(中略)
bloguserG Blog UserG 一般社員 技術部 東京

もう一度スクリプトを実行したところ、複数のユーザーを一度に作成することが出来ました。

注意点

今回のスクリプトは、すべてのパラメーターが指定されている前提となっています。 例えば、一般社員は部署のプロパティに値を設定していない事がある、といった場合はその処理を別途考える必要があります。今回のメインではないのでそこは割愛します。

おわりに

一括処理までの考え方を、かなり細かくステップごとに分けてみました。

慣れてくればスキップできるところは出てくるので、毎回このステップを踏む必要はないかと思います。必要な部分をピックアップして活用いただければ幸いです。

*1:$user.Departmentなどを直接New-AzureADUserで指定してもいいのですが、今回は動作確認済みのNew-AzureADUserの引数を変更しなくてもいい、という事を優先しました。

執筆担当者プロフィール
舟越 匠

舟越 匠(日本ビジネスシステムズ株式会社)

人材開発部に所属。社内向けの技術研修をメインにしつつ、JBS Tech BlogやMS認定資格取得の推進役もやっています。資格としてはAzure Solutions Architect Expertを所持。好きなサービスはPower Automate / Logic Apps。好きなアーティストはZABADAK。

担当記事一覧