PowerShellスクリプトを書くとき、特定のデータを検索してそのデータをオブジェクトに保存し、ほとんどの場合それをCSV形式でエクスポートすることがよくあります。 この記事では、PSObject を使用してこれらすべてを行う方法を紹介します。

私が見つけたオブジェクトのデータを格納する最も簡単な方法は、PSObject を使用してデータを格納することです。 データを格納する必要がある複数のオブジェクトがある場合、各 PSObject を配列に格納できます。 この配列は CSV にエクスポートできます。

PSObject は、データがキーと値のペアで保存されるハッシュテーブルに非常によく似ています。

PSObjectの作成

前述のように、PowerShell の PSObject はキー & 値ペア型の構造を使用しています。 PSObjectにデータを格納するために必要なことは、キーを定義し、そのキーに値を格納することです。 以下の例では、新しいPSObjectを作成し、そのオブジェクトにいくつかのデータを格納しています。 この例では、2つの「キー」(Key1 と Key2)を作成しています。

実際のシナリオでは、キーと値はオブジェクトに関する説明タイプの情報を含んでいます。 したがって、たとえば、ファイルに関する情報を格納する場合、Name、FileExtension、Path、および Size のようなキーと値のペアを作成することができます。

PowerShell 2.0

$MyPSObject = New-Object -TypeName psobject -Property @{ Key1 = 'Value1' Key2 = 'Value2'}

PowerShell 3.0 & above

PowerShell 3.0 およびそれ以降では、次のコードを使用して PSObject を作成することが推奨されます。 これは、作成された各キー値の順序を維持するためで、CSV にエクスポートするときにソート順が維持されます。

$MyPSObject = @{ Key1 = 'Value1' Key2 = 'Value2'}

Storing multiple PSObjects in an array

これまでは、1 つのオブジェクトに関する情報(たとえば、ファイル)の格納を見てきましが、これからは、1 つのオブジェクトの情報を格納することができます。 フォルダーを列挙し、そのフォルダー内のすべてのファイルについての情報を格納する必要がある場合はどうでしょうか。 その場合、各ファイルに対して PSObject を作成し(個々のデータを格納するため)、これらの PSObject をすべて配列に格納します。 これにより、複数のオブジェクトの情報を保存およびエクスポートすることが非常に簡単になります。

ここで、PSObject を配列内に格納する方法を説明します。 複数のファイルに対してこれを行うには、ForEach ループの内部で次のように実行します。 この例では、次のことを行います。

従業員名のリストがあるテキスト ファイルを読み取ります。 各名前について、AD で検索し、ユーザー名や電子メール アドレスなどの追加情報を収集します。 その後、このデータを CSV に出力します。

ソリューション例

以下のスクリプトは、テキスト ファイル内のすべての社員名を列挙し、それぞれの社員について AD で検索して追加の社員情報を取得します。 このデータはそれぞれ $hItemDetails.

という独自の PSObject に格納されます。

CSV にエクスポートするときにデータが正しい順序になるように、新しい PSObject を作成する @{} という方法を使用します (PowerShell 3.0 以上でのみ利用可能です)。 最後に、社員が複数いるので、各PSObjectを$aResultsという配列に格納しています。 この配列は、CSV.

Import-Module ActiveDirectory$aResults = @()$List = Get-Content "C:\Temp\List.txt" ForEach ($Item in $List) { $Item = $Item.Trim() $User = Get-ADUser -Filter { displayName -like $Item -and SamAccountName -notlike "a-*" -and Enabled -eq $True } -Properties SamAccountName, GivenName, Surname, telephoneNumber $sEmail = $User.GivenName + "." + $User.Surname + "@test.com" $hItemDetails = @ { FullName = $Item UserName = $User.SamAccountName Email = $sEmail Tel = $User.telephoneNumber } #Add data to array $aResults += $hItemDetails}$aResults | Export-CSV "C:\Temp\Results.csv"

にエクスポートされます。

コメントを残す

メールアドレスが公開されることはありません。