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"
にエクスポートされます。