同じタスクを複数回実行することはありましたか? たとえば、GUIを使用して1つずつ複数のActive Directoryユーザーを作成することや、サーバーにログインして選択したフォルダから古いログを削除することはありましたか? もしはいと答えるなら、あなたは一人ではありません。 PowerShellのImport-Csv
とforeachループをマスターする時が来ました。
手動のタスクには問題はありません。それは時には必要です。しかし、CSVファイルの読み取りと処理に関しては、PowerShellのコマンドレットImport-Csv
とForEach
ループを使用することができます。
PowerShellのImport-Csv
コマンドレットは、CSVファイルのような表形式のデータソースからデータを読み取るための優れた方法です。その後、ForEach
ループを使用してCSVデータの各行を反復処理することができます。
この記事では、この強力な組み合わせを使用して、一括、単調で繰り返しのタスクを自動化する方法を学びます。
Import-Csv
コマンドレットとForEach
ループが初めての場合、または既に知っていることの復習が必要な場合は、以下のリンクを参照して詳しく学ぶことができます。
前提条件
この記事にはいくつかの例とデモがあります。一緒に進めるには、最初にいくつかの準備が必要です。
- A script editor such as Visual Studio Code, Atom, or Notepad++. Use whichever one you’re comfortable with.
- Windows PowerShell 5.1またはPowerShell Core 6+
- Exchange Onlineへのアクセス(Exchange Online関連の例を実際に試す場合はオプションです)。
Import-CsvとForEachループを活用する
次のセクションでは、実世界のシナリオで遭遇する可能性のある、Import-CsvコマンドレットとForEachループの使用例がいくつかあります。これらのPowerShellのインポートCSVforeachの例はそれぞれの目的に特化していますが、使用されている概念と技術が同じであることを理解することが重要です。
CSVからのレコードの読み取りと表示
おそらく、Import-Csv
とForEach
ループの最も基本的な使用法は、ファイルからレコードを読み取り、コンソールに表示することです。CSVファイルの構造はデータベースに似ています。列見出しを持ち、各行はレコードとして扱われます。
たとえば、以下はemployee.csv
というファイルの内容で、EmployeeID、Name、Birthdayの3つの列と4つのレコードからなります。

以下のコードは、employee.csvファイルの内容をインポートし、インポートされたデータをForEach-Object
コマンドレットにパイプします。その後、ForEach-Object
はインポートされたCSVの各レコードを処理し、コンソールに連結された値を表示します。以下のコードをコピーしてlist-employee.ps1として保存してください。
注意:以下の例で使用されているForEachループのタイプは、ForEach-Objectコマンドレットです。この記事の「The ForEach-Objectコマンドレット」セクションを参照してください。
スクリプトを保存したら、PowerShellでファイル名を呼び出して実行します。スクリプトを実行すると、以下のスクリーンショットに似た出力が表示されるはずです。

CSVからレコードを検索して表示する
前の例では、CSVからすべてのレコードを読み取り表示する方法を学びました。この例では、同じCSVファイルemployee.csvを使用しますが、今回はCSVからEmployeeIDを検索するためにPowerShell関数を作成します。
以下のコードスニペットは、Find-Employee
という名前のPowerShell関数で、パラメータは1つだけです。パラメータ名はEmployeeID
であり、CSVから検索するための従業員IDの値を受け入れます。
この関数を使用する前に、まずPowerShellセッションにインポートする必要があります。以下の2つの方法でFind-Employee
関数をメモリにインポートすることができます:
- 以下のコードをPowerShellにコピーして貼り付ける。
- スクリプトを
Find-Employee.ps1
として保存し、ドットソーシングテクニックを使用してインポートする。
注意:以下の例で使用されているForEachループのタイプはForEachステートメントです。この記事の「ForEachステートメント」セクションを参照してください。
関数コードをPowerShellセッションにインポートした後、以下のように関数名を入力して呼び出します。
EmployeeIDパラメータを使用せずに関数を実行すると、EmployeeIDの値を検索するためにプロンプトが表示されます。以下は例の出力です。

または、関数を実行する際にランタイムでEmployeeIDパラメータの値を指定することもできます。以下のように表示されます。
複数のサーバーからディスク容量の使用状況を取得する
システム管理者の間でよく行われるルーチンのタスクの1つは、複数のサーバーのディスク容量の使用状況を監視することです。ディスク容量の使用状況を確認するために、各サーバーにログインする代わりに、サーバー名、ドライブレター、閾値を含むCSVリストを作成し、PowerShellを使用してCSVファイルをインポートし、各行をループしてクエリを実行します。
リモートサーバーからディスクスペース使用量を取得するスクリプトを作成するには、まず以下のヘッダーを持つCSVリストを作成します:
- servername – これはクエリする名前サーバーです。
- disk – これはスペース使用量を取得するドライブのレターです。
- threshold – これはしきい値をGB単位で定義します。ディスクの空き容量がこの値よりも低い場合、レポートには警告ステータスが表示されます。
以下のサンプルでは、4つのレコードがリストアップされています。サーバー数や読み取るディスクの数に応じて、CSVファイルは異なります。
CSVが完成したら、ファイルをservers.csvとして保存します。これはPowerShellスクリプトによってインポートされる入力リストとして機能します。
ディスクスペース使用量の例を提供するために、以下のコードをスクリプトエディタにコピーしてdiskReport.ps1として保存します。スクリプトはCSVパスと同じ場所に保存する必要があります。
上記のスクリプトは、実行されると以下のアクションを実行します。
- 名前がservers.csvのcsvファイルをインポートし、
$server_list
変数に格納します。 $server_list
変数に格納されたサーバーリストをループします。- foreachループの各イテレーションでは、現在の行は
$server
変数で表されます。 Get-WmiObject
コマンドレットを使用して、サーバーからディスク情報を取得します。- 表示するために関連するプロパティのみ選択してください。
– サーバー名 – クエリされているシステムの名前です。
– ディスクの文字 – ドライブに割り当てられた文字です。
– サイズ(GB) – GB単位のディスクのサイズです。
– 空き容量(GB) – GB単位の空き容量のサイズです。
– しきい値(GB) – GB単位の定義されたしきい値です。
– ステータス – 空き容量(GB)の値がしきい値(GB)の値よりも小さい場合、ステータスは「警告」となります。それ以外の場合、ステータスは「正常」となります。
スクリプトファイルdiskReport.ps1を保存したので、PowerShellでその名前を呼び出して実行する準備が整いました。
実行されると、以下のスクリーンショットにスクリプトの出力が表示されます。

出力はCSVにエクスポートすることもできます。CSVにエクスポートすると、レポートを共有する際に便利です。エクスポートされたCSVファイルはメールで送信したり、ファイル共有やSharePointサイトにアップロードしたりすることができます。CSVへのエクスポートについての詳細は、Export-Csv: The PowerShell Way to Treat CSV Files as First Class Citizensを参照してください。
複数のActive Directoryユーザーの作成
この時点で、Import-Csv
とForEach
の使用方法についての良いアイデアを既に持っていると思います。次の例では、New-ADUser
とGet-ADUser
のコマンドレットを組み合わせて学習をさらに進めます。
new_employees.csv
というCSVファイルを受け取りました。このファイルには、HR部門から提供された新入社員のリストが含まれています。CSVファイルの各行は、オンボーディングするユーザーを表し、以下の列があります:FirstName、LastName、Department、State、EmployeeID、およびOffice。
ユーザー名は、従業員の名前の最初の文字と姓を連結したものにする必要があります(例:bparrはユーザーBob Parrの場合)。

CSVファイルが保存されたら、以下のスクリプトはImport-Csv
を使用してCSVファイルnew_employees.csvを読み取ります。その後、各行を反復処理し、値をNew-ADUser
の適切なパラメーターに渡します。
スクリプトを実行すると、新しいユーザーアカウントは既にActive Directoryに存在するはずです。ただし、ユーザーアカウントが実際に作成されたことを確認することは良い慣行です。
同じCSVファイルnew_employees.csvを参照して、以下のスクリプトはCSVをインポートし、foreachを使用してリスト内のADUserオブジェクトを取得します。
Office 365メールボックスにプロキシメールアドレスを追加する
Office 365のメールボックス管理では、複数のユーザーに対してプロキシアドレスを追加する要求は珍しくありません。通常、この種の要求では、管理者はユーザーのリストと追加するメールアドレスを受け取ります。以下は、CSVの例です。

注意: PowerShellでExchange Onlineのコマンドレットを実行する前に、まずExchange Online Managementシェルにログインする必要があります。
Import-Csv
とForEach
ループを使用して、PowerShellスクリプトでリストを一括処理することができます。以下のスクリプトは、その方法を示しています。
以下のスクリプトでは、new_address.csvファイルの内容をインポートし、$user_list
変数に格納します。そして、foreach()
メソッドを使用して、PowerShellはユーザーリスト全体をループし、各レコードのusername
とemail
の値を使用して各メールボックスに新しいメールアドレスを追加します。
スクリプトを実行すると、コンソールには出力が表示されません。画面出力がない場合、新しいメールアドレスが正常に追加されたことを意味します。しかし、メールアドレスが追加されたことを確認するにはどうすればよいでしょうか?
同じCSVファイルnew_address.csvを参照して、新しいアドレスが追加されたかどうかをImport-Csv
とForEach
を使用して確認できます。
以下のスクリプトでは、new_address.csvファイルの内容をインポートし、$user_list
変数に格納します。そして、foreach()
メソッドを使用して、PowerShellはユーザーリスト全体をループし、新しいメールアドレスがメールボックスのプロキシアドレスのリストに存在するかどうかを確認します。見つかった場合、ステータスはTrueとなります。それ以外の場合は、結果はFalseとなります。
バリデーションスクリプトが実行されると、以下のスクリーンショットに示されているような出力が表示されるはずです。以下の出力では、ステータスがすべてTRUEとなっており、これは新しいメールアドレスが各メールボックスに正常に追加されたことを意味しています。

メーリングリストへの毎日の天気予報の送信
この例では、購読者のメールアドレスとその地域または場所のリストが含まれたCSVファイルがあることを前提としています。これらの購読者は、その場所に特化したその日の天気予報を含む毎日のメールを期待しています。以下は、ファイル名がsubscribers.csvのサンプルCSVをご覧ください。

以下のCSVには、2人の購読者のみが含まれています。1人はロサンゼルスにおり、もう1人はマニラにいます。
以下のスクリプトでは、以下のアクションを実行します:
- subscribers.csvファイルからメールアドレスと地域情報をインポートする
- 各購読者に対して:
– 購読者の地域に基づいてhttps://wttr.in/から天気予報画像をダウンロードする
– 天気予報画像を購読者のメールアドレスに送信する
以下のスクリプトでは、上記のアクションを実行します。最初の3つの変数$senderAddress
、$smtpServer
、および$smtpPort
を変更する必要があります。その後、このコードをコピーしてSend-WeatherInfo.ps1
として保存します。スクリプトの各セクションの上にあるコメントを参照して、コードの詳細について学ぶことができます。
スクリプトを実行すると、以下の例のメールスクリーンショットと同様のメールが各購読者に送信されます。


概要
Import-Csv
とForEach
ループの組み合わせは、適用できるタスクの制限はありません。デリミタで区切られた列のリストが関わるかぎり、この強力な組み合わせを活用することができます。
この記事では、CSVファイルがデータベースと似ていること、データのインポートにImport-Csv
を使用し、ForEach
ループの反復中に値を参照する方法を学びました。
I hope that with the many examples provided in this article, you now understand more of the Import-Csv
and ForEach
. And, that you would be able to use the knowledge you gained in this article in your administration and automation tasks.
さらに読む
Source:
https://adamtheautomator.com/import-csv-and-the-foreach-loop/