Search code examples
powershellcsvactive-directory-grouppscustomobject

pscustomobject multiple lines per row


I have some code so far, but would like it to result in a table with multiple lines for users per group.

Currently, it creates a table like this:

Group Users
abcgroup1 Alice
abcgroup1 Bob
abcgroup2 Bob
abcgroup2 Jason
abcgroup3 Eve

I would like it to instead create a table like this:

Group Users
abcgroup1 Alice
Bob
abcgroup2 Bob
Jason
abcgroup3 Eve
$Groups = get-adgroup -Filter 'name -like "*abc*"'

$Results = foreach( $Group in $Groups ){

    Get-ADGroupMember -Identity $Group | foreach {

        [pscustomobject]@{

            Group = $Group.Name

            Users = $_.Name

            }

        }

    }

$Results

$Results | Export-Csv C:\abc_search.txt -NoTypeInformation

Solution

  • You can use -join operator concatenating by CRLF `r`n. This will result in a multiline string:

    $Groups = Get-ADGroup -Filter "name -like '*abc*'"
    $Results = foreach($Group in $Groups)
    {
        [pscustomobject]@{
            Group = $Group.Name
            Members = (Get-ADGroupMember -Identity $Group).Name -join "`r`n"
        }
    }
    
    $Results | Format-Table -Wrap -Autosize
    $Results | Export-Csv C:\abc_search.csv -NoTypeInformation
    

    Note that I'm using -Wrap on Format-Table, needed to correctly display multiline strings on the console.

    The other option you could use is Out-String thought that would also require the use of .TrimEnd() method to get rid of the trailing new line:

    Members = ((Get-ADGroupMember -Identity $Group).Name | Out-String).TrimEnd()