SEくぼたの事件簿

インフラSEとしての活動を記録していきます

Powershellでの繰り返し処理(Foreach)の使い方

こんにちは

これまでいくつかブログを書いてみましたが、記載したものの中ではWindowsやActiveDirectory,Office365といった環境ではユーザー単位で設定することも多くスクリプトを作成しています。

 

その中で毎回のように繰り返し処理を利用しているので、今回は

PowerShellの繰り返し処理の記述」について書きたいと思います。

 

数年前まだ新入社員のころ(今でも気持ちは新入社員ですが!笑)にPowershellを利用し始めたのですが、最初は全く意味が分からず苦労しました。

そんな時必ずと言っていいほど色んな方が書いたブログを参考にしていました。

同じような方がいたときに少しでも助けになればと思い記録していきます。

 

  • foreachの利用例として特定のOffice365内のユーザー情報を取得

まずは、CSVファイルを作成します。

「C:\temp\test」というフォルダに「UserInformation.csv」というファイルを作成します。

f:id:KKubo19:20200818184629p:plain

 CSVファイルの中身はこんな感じで作成しています。

1行目はヘッダー情報としてUserPrincepalnameとDisplaynameとしています。(分かればなんでもいいです)

f:id:KKubo19:20200818192719p:plain

2行目のA列に対象のユーザー情報(メールアドレス)を並べていきます。

B列は今回なくてもよいのですが、説明のために書いています。

#Office365への接続
$Cred = Get-Credential
Connect-MsolService -Credential $Cred
#ソースデータファイルのパス指定
$Datapath = "C:\temp\Test\UserInformation.csv"
#データファイルのインポート(Shift-JIS)
$Datas = Import-Csv -Path $Datapath -Encoding Default
#データファイルの行数分ループ
foreach($Data in $Datas){
    Get-MsolUser -UserPrincipalName $Data.UserPrincipalname
}

f:id:KKubo19:20200818183617p:plain

  • 記載内容の解説

2,3行目でOffice365への接続

6行目でCSVファイルのパス指定

9行目でCSVファイルのインポート

12-14行目でユーザー情報の取得

を行っています。

 

2,3行目はOffice365への接続でどうしても必要な記述なので説明を省きます。

9行目でCSVファイルのインポートを行うと、$Datasという変数の中にCSVのデータが読み込まれます。

$Datasを実行するとこんな感じです。

f:id:KKubo19:20200818193648p:plain

$Datas.userprincipalnameを実行すると$Datas内の[UserPrincipalname]の箇所のみとりだせます。

f:id:KKubo19:20200818193812p:plain

[UserPrincipalname]はCSVファイルのヘッダー情報として[UserPrincipalname]と1行目に記載したのでその値となっています。

CSVファイルの1行目の名前を[UserPrincipalname]ではなく[UPN]するとここで実行するのは$Datas.UPNとなります。

このように変数名にを[.]でつないで変数内に格納されている特定の値のみ取得することも可能です。

 

今回Office365の特定のユーザー情報を取得するには以下のコマンドレットを実行する必要があります。

Get-MsolUser -UserPrincipalName ユーザーのメールアドレス

上記コマンドではユーザーのメールアドレスをそれぞれ指定して実行していく必要があります。

そんな時にforeachを利用します。

書き方は以下のような形です。

  • foreachの書き方
foreach($Data in $Datas){

}

foreach(変数名1 in 変数名2){}です。

ここで変数名1と変数名2を指定する必要があります。

そもそもforeachは繰り返し処理なので、繰り返し処理をしたい情報を変数名2にいれます。

今回は上記にも記載してきた通り、UserInformation.csvの情報を$Datasという変数に格納したため、変数名2は$Datasとしています。

foreachは$Datasのデータの終わり(今回はヘッダー情報を除くとCSVのデータは2行なので2回処理)まで繰り返し処理をします。※データの行数分繰り返し処理をしてくれます。

変数名1はここで新たに定義してよい変数です。そのため、名前は他と被らなければなんでもよいです。今回は$Dataとしました。

$Dataにどんな情報が入ってくるのか分かりにくいので以下の図にしました。

f:id:KKubo19:20200818195412p:plain

f:id:KKubo19:20200818195508p:plain

上記図のように繰り返し処理を実行しているタイミングによって$Data内に1行分の情報が格納されていきます。

これの何が嬉しいかというと、先ほどのコマンドレットで指定するユーザーのメールアドレスは一人一人指定していく必要がありました。

この指定方法を利用することで1ユーザーずつの情報を取得することができます。

次にforeach(変数名1 in 変数名2){}の{}についてです。

{}の間に記載した処理を変数名2($Datas分)繰り返し処理を実行します。

そのため例えば、

foreach($Data in $Datas){
     write-host A
}

と記載すると$Datas内のデータ数分(今回は2回)、[Write-Host A]というコマンドレットを繰り返し実行します。※コマンドレットに意味はないです。

ここで今回実施したかったコマンドレットは

Get-MsolUser -UserPrincipalName ユーザーのメールアドレス

であったことから{}内に上記コマンドレットを入れたらよいことが分かります。

foreach($Data in $Datas){
     Get-MsolUser -UserPrincipalName ユーザーのメールアドレス
}

ユーザーのメールアドレスの箇所にユーザー毎のメールアドレスを指定していく必要があるので

{}内にて$Dataという変数を利用します。

foreach($Data in $Datas){
    Get-MsolUser -UserPrincipalName $Data.UserPrincipalname
}

このように$Data.UserPrincipalnameと記載しておくと、データの行数分繰り返しながら、その行のUserPrincipalNameのみを指定することができます。
下図がイメージです。

f:id:KKubo19:20200818200931p:plain

f:id:KKubo19:20200818201032p:plain

このような記載をすることで{}内の処理の1回目は

Get-MsolUser -UserPrincipalName test2@jbtest.tk

2回目の処理は

Get-MsolUser -UserPrincipalName testUser@jbtest.tk

というようにコマンドレット内で指定する引数のデータをCSVファイル内のデータに合わせて変化させて使うことができます。

実行結果は下記の形です。

f:id:KKubo19:20200818201507p:plain

今回はユーザー情報を取得するのみでしたが、CSVファイルの列をもっと多数にして様々な情報を入れておき、実行するコマンドレットを変更して、ユーザー情報を登録したり変更したりすることができます。

とっても便利なので僕はよく利用しています。

みなさんすでに利用されているかもしれませんが、まだ利用したことないよって方はぜひ一度試してみてくださいね!

 

  • 最後に!

Twitterでも情報発信したいと思いますので、興味があったらフォローしてください!