0

最近、スクリプトでよくある問題にぶつかり、他の人がこの問題にどのように対処しているかを確認するために、スクリプトを公開することにしました。

tl; dr; さまざまな数のプロパティを持つオブジェクトをエクスポートしたいと思います。例えば; オブジェクト1には3つのIPアドレスがありますが、オブジェクト2には7つのIPアドレスがあります。

私は、カスタムプロパティを使用して新しいオブジェクトを作成し、結果を取得する方法としてこれらのオブジェクトを配列に挿入するように進化しました。より良い方法があるかどうか聞いてうれしいですが、これが私のやり方です。オブジェクトがリスト形式で表示されるため、このメソッドは画面に出力するときに100%機能します-Excellのようなもので読み取るために出力をキャプチャして保存する場合は、いくつかのエクスポート/アウトファイルメソッドを試しましたが無駄になりました。

以下は、オブジェクトを作成して保存する例です(ここでは、コードの機能は重要ではありません。生成される結果だけです)。

add-pssnapin Quest.ActiveRoles.ADManagement
$Groups = get-qadgroup AmbigousGroupNameHere-
$UserInfo = @()

ForEach ( $Group in $Groups ) {
    $CurrentGroupMembers = get-qadgroupmember $Group
    write-host "Processing group:" $Group
    ForEach ( $GroupMember in $CurrentGroupMembers ) {
        If ( $GroupMember.type -eq "User" ) {
            $counter = 1
            write-host "Processing member:" $GroupMember
            $UserObject = get-qaduser $GroupMember | select SamAccountName,FirstName,LastName

            $objUserInfo = New-Object System.Object
            $objUserInfo | Add-Member -MemberType NoteProperty -Name SamAccountName -Value $UserObject.SamAccountName
            $objUserInfo | Add-Member -MemberType NoteProperty -Name FirstName -Value $UserObject.FirstName
            $objUserInfo | Add-Member -MemberType NoteProperty -Name LastName -Value $UserObject.LastName

            $GroupMembership = get-qadgroup -ContainsMember $GroupMember | where name -like "AmbigousGroupNameHere-*"

            ForEach ( $GroupName in $GroupMembership ) {
                $objUserInfo | Add-Member -MemberType NoteProperty -Name CtxGroup$counter -Value $GroupName.SamAccountName
                $counter++
            }
            $UserInfo += $objUserInfo
        } else {
            write-host "This is a group - we are ignoring it."
        }
    }
}

$UserInfo | Export-Csv UsersOutput.csv -NoType

上記から、グループごとにオブジェクトプロパティ名を1ずつスケーリングしていることがわかります。CtxGroup$counter各ユーザーが持つ正しいグループ数に合わせてオブジェクトをスケーリングできます。デフォルトで画面に出力するときにこれがうまく機能することを確認しました。オブジェクトが一覧表示され、そのユーザーに一致する各グループの新しいプロパティを確認できます。

今問題のために。Iexport-csvまたはout-fileファイルが最初のオブジェクトに基づいて十分なヘッダーで生成されると、最初のオブジェクトが持つプロパティの量に基づいて見出しが作成されます。したがって、最初のユーザーに3つの一致するグループがあるとすると、見出しが作成されますCtxGroup1, CtxGroup2, CtxGroup3。素晴らしい!いいえ。

次のユーザーに5つの一致するグループがある場合、最初の3つだけが出力に含まれ、の見出しがないため、追加の2つは破棄されCtxGroup4, CtxGroup5ます。

いったい他の人はこれにどのように対処しますか?

サイドノート; 私は最初のオブジェクトを大量のオブジェクト(したがって見出し)を含むダミーとして作成することを検討しましたが、それはクールではなく、本当に非効率的だと感じます。

4

1 に答える 1

0

プロパティの数によって配列を並べ替えたいものを取得できますが$UserInfo、それは簡単ではありません。あなたの場合は、グループの数を追加して別のプロパティを追加します。

...
ForEach ( $GroupName in $GroupMembership ) {
                $objUserInfo | Add-Member -MemberType NoteProperty -Name CtxGroup$counter -Value $GroupName.SamAccountName
                $counter++
            }
$objUserInfo | Add-Member -MemberType NoteProperty -Name NbCtxGroup -Value ($counter - 1)
$UserInfo += $objUserInfo
...

そして、このプロパティで配列を降順で並べ替えます。

$UserInfo | Sort-Object -Property NbCtxGroup -Descending | Export-Csv .\F.csv

それはそれほどいいことではありませんが、それはトリックを行います。

見て :

$objUserInfo.psobject.Properties | Measure-Object
于 2012-11-21T04:46:46.453 に答える