PowerShell で CSV ファイルを読み取るための Import-CSV の使い方

PowerShell でImport-CSVを使用するのは、単にデータを読み取るためだけではありません。Active Directory、Exchange、その他構造化データを扱うシステムで一括タスクを自動化するためには、必須と言えるでしょう。数十ものアカウントのユーザー情報を手動で更新しようとしたことがある方なら、この機能の便利さを実感していただけるでしょう。すべてのユーザー情報をCSV形式でインポートし、一度に編集できるため、特に数十、数百ものエントリを扱う場合には、大幅な時間節約につながります。さらに、手作業による入力ミスをなくし、一貫性を保つことにも役立ちます。ただし、エンコードや地域設定によっては問題が発生する場合があるので、エンコードや区切り文字の設定方法を知っておくと非常に役立ちます。

さて、ログイン名、メールアドレス、電話番号、部署といったユーザー情報をExcelシートに入力し、CSV形式で保存した場合、そのデータをPowerShellにインポートするのが一番です。そこから各行をループ処理してADユーザーを更新したり、その他のバッチ操作を実行したりできます。ADユーザーとコンピューターの画面を何時間も操作せずに、ユーザー属性を一括変更する必要がある場合に非常に便利です。

PowerShell で Import-CSV を使用してユーザーを管理する方法

CSVデータをインポートして読み込む方法

まず、CSV ファイルのパスを選択する必要があります (例: C:\PS\my_ad_users.csv)。以下を実行します。

$ADUsers = Import-CSV -Path C:\PS\my_ad_users.csv

このコマンドはCSVを変数に読み込み、各行をPSCustomObjectに変換します。少し奇妙に思えるかもしれませんが、一部のマシンではエンコードが適切でなかったり区切り文字がオフになっていると失敗する可能性があります。CSVのエンコードを確認してください(特殊文字を扱う場合はUTF-8が最も安全です)。また、CSVでカンマではなくセミコロンが使用されている場合は、追加してください-Delimiter ';'。デフォルトの区切り文字はカンマで、ほとんどの場合は標準です。

インポートした内容をもう一度確認したいですか? を呼び出して、ADlogin、Email、Phone などのどのプロパティが使用可能かを確認します。PowerShell は当然ながら各行をオブジェクトとして扱うため、 のように列にアクセスしたり、 を使って複数の列を一覧表示したり$ADUsers | Get-Memberできます。$_. EmailSelect-Object

データがおかしい場合のエンコードと区切り文字の修正方法

エンコードエラーに関する噂を耳にしましたか?ええ、特殊文字や非ラテン文字は、正しいエンコードを指定しないと文字化けすることがあります。その場合は、-Encoding UTF8次のように追加してみてください。

Import-CSV -Path C:\PS\my_ad_users.csv -Encoding UTF8

また、CSVがカンマ区切りでない場合は、適切な区切り文字を指定してください。例えば、セミコロンの場合は次のようになります。

$ADUsers = Import-CSV -Path C:\PS\my_ad_users.csv -Delimiter ';'

区切り文字がわからない場合は、実行して(Get-Culture).TextInfo. ListSeparator地域のデフォルトを確認してください。通常はコンマですが、セミコロンを使用する地域もあります。

CSVからのデータへのアクセスと使用

インポートすると、オブジェクトの配列が作成されます。すべてのプロパティを表示するには、 を使用します$ADUsers | Get-Member。すべてのメールを一覧表示するには、次のようにします。

$ADUsers. Email

特定の列が必要な場合は、— を使って選択すると、Select-Object作業内容がわかりやすくなります。4行目のように特定のユーザーが必要な場合は、単に実行します$ADUsers[3](開始値は0です)。これは、一括変更を実行する前に特定のデータをデバッグまたは検証したい場合に便利です。

ADユーザーを一括更新する方法

さて、いよいよ本題です。CSVファイルに基づいて実際にユーザーを更新します。各レコードをループ処理し、 Set-ADUserのようなコマンドレットを実行する予定です。もちろん、これにはActive Directoryモジュールがインストールされ、適切な権限が必要です。

典型的なループは次のとおりです。

# Loop through each user in the CSV and update AD attributes $ADUsers | ForEach-Object { Set-ADUser -Identity $_. ADlogin ` -MobilePhone $_. Phone ` -Department $_. Department ` -EmailAddress $_. Email } 

特にCSVに欠落データや不正なデータが含まれている場合、エラーが発生したり、更新が部分的にしか行われなかったりすることがありますのでご注意ください。設定によっては、チェックやtry-catchブロックを追加すると改善されることがあります。また、更新を頻繁に行う場合は、段階的に実行するか、まずは少量のバッチでテストすることをお勧めします。

あるいは、より短い構文を好む場合は、 foreach ループに直接パイプすることもできます。

Import-CSV C:\PS\my_ad_users.csv | ForEach-Object { Set-ADUser -Identity $_. AdLogin -MobilePhone $_. Phone -Department $_. Department -EmailAddress $_. Email } 

データが一貫しており、CSV が正しくフォーマットされている限り、これは正常に機能します。

追加情報またはカスタムデータの追加

場合によっては、現在の日付などの追加情報を各オブジェクトの新しいプロパティとして含めたい場合があります。これは、メンバーを追加することで実現できます。

$ADUsers | Add-Member -MemberType NoteProperty -Name Date -Value (Get-Date -Format dd/MM/yyyy)

なぜそうしないのでしょうか?後から変更を追跡しやすくなるからです。ただし、この追加データはエクスポートまたはどこかに保存しない限り、メモリ内のオブジェクトに残ることに注意してください。

その他の便利な使用例

  • メールボックスの一括エクスポート: CSV からのデータを使用したNew-MailboxExportRequest 。
  • CSV ファイルと同じループ アプローチを使用して、複数のユーザーを AD グループまたは Microsoft Entra ID グループに一度に追加します。

正直なところ、CSVのインポートとループ処理のコツをつかめば、タスクの自動化ははるかに速くなります。ただし、エンコードの問題や区切り文字の不一致には注意してください。これらはよくあるちょっとした問題です。

まとめ

  • 常に CSV エンコードを確認してください (UTF8 が最も安全です)。
  • カンマ以外の場合は正しい区切り文字を指定してください。
  • Get-Memberインポートしたデータを探索するために使用します。
  • データをループしてForEach-Object一括変更を自動化します。

まとめ

これで誰かの作業時間を少しでも短縮できれば幸いです。CSVのインポート、ループ、更新というパターンを一度覚えれば、なぜ手動でやっていたのかと不思議に思うでしょう。ただし、慎重に作業を進め、まずは小規模なバッチでテストし、可能であればADデータを必ずバックアップしてください。バッチ自動化は実際にどのように機能するかを一度体験すれば、本当に時間の節約になります。頑張ってください。