csv output with variable from a function

This topic contains 4 replies, has 2 voices, and was last updated by  LBart 6 months, 3 weeks ago.

  • Author
    Posts
  • #65601

    LBart
    Participant
    function Get-NestedMembers
    {
        [CmdletBinding()]
        [Alias()]
        [OutputType([int])]
        Param
        (
            # Param1 help description
            [Parameter(Mandatory=$true,
                       Position=0)]
    
            [string]$ADGroup
    
        )
    
        Begin
        {
        }
        
        Process
        {
            $ADMembers=Get-ADGroupMember -Identity $ADGroup
    
            $ADMembers | ForEach-Object {
                         if ($_.objectClass -eq 'Group')
                         {
                            Get-NestedMembers -ADGroup $_.Name
                         }#end if
                         else
                         {
                            [PSCustomObject]@{Name=$_.Name;
                                              FromGroup=$ADGroup;
                                              LoginName=$_.SAMAccountName;
                                              DistinguishedName=$_.DistinguishedName}
                         }#end else    
                         }#end foreach 
        }#end Process
        
        End
        {
        }
    }#end function Get-NestedMembers
    
    Get-NestedMembers | Export-Csv 'ADGroup2.csv' -NoTypeInformation
    

    I have this function to get nested group members and the output is currently fine. However when the function runs it loses the variable $ADGroup which I believe is correct in PowerShell. Is there way to pass the variable so I can export-csv '$ADGroup.csv'. With my current file I have to rename it to the group name after each time I run this.

  • #65608

    Don Jones
    Keymaster

    So, your Begin/Process/End blocks are not used here, because your command doesn't accept pipeline input.

    I don't know what you mean by "lose" $ADGroup. You've defined $ADGroup as an input parameter. I would expect:

    Get-NestedMembers -ADGroup "something"
    

    When you run the command. That's how $ADGroup gets populated. But it only exists within Get-NestedMembers; there's no way for that parameter to be passed down the pipeline to another command like Export-Csv. What you'd do instead is write a small "controller" script.

    Param(
    [string]$ADGroup
    )
    Get-NestedMembers -ADGroup $ADGroup | Export-CSV "$ADGroup.csv"

    You'd then run that script, passing in whatever -ADGroup parameter you'd want.

    • #65616

      LBart
      Participant

      I started with the snippets so I just left the Begin/Process/End blocks.
      When I run it with:
      Get-NestedMembers -ADGroup $ADGroup | Export-CSV "$ADGroup.csv"

      This gets me this error.

      Get-NestedMembers : Cannot bind argument to parameter 'ADGroup' because it is an empty string.
      At C:\PSScripts\Functions\Get-NestedMembers1.ps1:55 char:28
      + Get-NestedMembers -ADGroup $ADGroup | Export-CSV "$ADGroup.csv"
      + ~~~~~~~~
      + CategoryInfo : InvalidData: (:) [Get-NestedMembers], ParameterBindingValidationException
      + FullyQualifiedErrorId : ParameterArgumentValidationErrorEmptyStringNotAllowed,Get-NestedMembers

      I must be missing something. I believe by design it removes the variable $ADGroup after the function runs so it is an empty string. Generally I run this and let it prompt for the ADGroup. That make it easiest to repeat for multiple groups.

  • #65622

    Don Jones
    Keymaster

    Yeah, you have to define $ADGroup before you can use it.

    $Thing = "something"
    Get-NestedMembers -ADGroup $Thing | Export-CSV "$Thing"
    

    You're likely getting confused because the same ADGroup variable name was being used in different scopes. Here, I've used a different variable name to try and make it clearer.

    • #65623

      LBart
      Participant

      That does work but it requires me to reset the $ADGroup for each group before running the function. Here is one I have as a script that does about the same thing but I haven't converted it to a function yet for the same reason. Sorry if this is a bit weird.
      Since it is not a function it passes through and names the folder by the group name.

          [CmdletBinding()]
          Param (
              [Parameter(Mandatory=$True)]
              [String]$ADGroup
          )
      
      Get-ADGroupMember -Identity $ADGroup |
          Select-Object -Property Name,
                              @{n='Loginname';e={$_.SAMAccountName}},
                              DistinguishedName |
          
       Export-Csv "$ADGroup.csv" -NoTypeInformation
      

You must be logged in to reply to this topic.