Public/Discovery/Export-QCsvData.ps1

function Export-QCsvData {
    <#
.SYNOPSIS
Use Export-CsvData instead.. this is a one-off function!!!!
Export ProxyAddresses from a CSV and output one per line. Filtering if desired. Automatically a csv will be exported.
 
.DESCRIPTION
Export ProxyAddresses from a CSV and output one per line. Filtering if desired. Automatically a csv will be exported.
 
.PARAMETER Row
Parameter description
 
.PARAMETER JoinType
Parameter description
 
.PARAMETER Match
This matches one or more items when looking at email addresses. This uses the logic operator OR.
For example -Match @("smtp:","onmicrosoft.com") means it will find all attributes that match smtp: OR onmicrosoft.com
 
.PARAMETER caseMatch
Same as Match parameter but case sensitive
 
.PARAMETER matchAnd
The same as Match parameter but uses the AND logic operator
 
.PARAMETER caseMatchAnd
The same as matchAnd parameter but case sensitive
 
.PARAMETER MatchNot
The same as Match but with the comparison operator of NOT. Uses logic operator of OR.
For example -MatchNot @("smtp:","onmicrosoft.com") means it will find all attributes that DO NOT MATCH smtp: OR onmicrosoft.com
 
.PARAMETER caseMatchNot
The same as MatchNot but case sensitive
 
.PARAMETER MatchNotAnd
The same as MatchNot but with the logic operator of AND.
 
.PARAMETER caseMatchNotAnd
The same as MatchNotAnd but case sensitive
 
.PARAMETER Domain
Parameter description
 
.PARAMETER NewDomain
Parameter description
 
.EXAMPLE
Import-Csv .\CSVofADUsers.csv | Export-QCsvData -caseMatchAnd "brann" -MatchNotAnd @("JAIME","John") -JoinType and -fileName "NewCsv.csv"
 
.EXAMPLE
Import-Csv .\CSVofADUsers.csv | Export-QCsvData -caseMatchAnd "Harry Franklin" -MatchNotAnd @("JAIME","John") -JoinType or -fileName "NewCsv.csv"
 
.EXAMPLE
Import-Csv .\CSVofADUsers.csv | Export-QCsvData -Match "." -JoinType and -fileName "NewCsv.csv"
Above matches all in column you choose "FindInColumn" including blanks
 
.EXAMPLE
Import-Csv .\CSVofADUsers.csv | Export-QCsvData -Match "^\s" -JoinType and -fileName "NewCsv.csv"
Above matches all in column you choose "FindInColumn" excluding blanks. This match currently does not work!
 
.NOTES
Input (from the CSV) of the Addresses (to be imported into ProxyAddresses attribute in Active Directory) are expected to be semicolon separated.
Example:
import-csv .\file.csv | Export-QCsvData -JoinType and -FindInColumn ProxyAddresses -caseMatch "SMTP:" -StripPrefix -AddPrefix "smtp:" -fileName "NewCsv.csv"
import-csv .\file.csv | Export-QCsvData -JoinType and -FindInColumn ProxyAddresses -caseMatch "SMTP:" -Domain "fabrikam.com" -NewDomain "contoso.com" -fileName "NewCsv.csv"
import-csv .\file.csv | Export-QCsvData -JoinType and -FindInColumn ProxyAddresses -Match "SIP:" -fileName "NewCsv.csv"
import-csv .\file.csv | Export-QCsvData -JoinType and -FindInColumn ProxyAddresses -Match "SIP:" -Domain "fabrikam.com" -NewDomain "contoso.com" -fileName "NewCsv.csv"
import-csv .\file.csv | Export-QCsvData -JoinType and -FindInColumn ProxyAddresses -caseMatch "SMTP:" -fileName "NewCsv.csv"
import-csv .\file.csv | Export-QCsvData -JoinType and -FindInColumn ProxyAddresses -caseMatch "SMTP:" -Domain "fabrikam.com" -NewDomain "contoso.com" -StripPrefix -fileName "NewCsv.csv"
 
#>

    [CmdletBinding(SupportsShouldProcess = $true)]
    param (

        [Parameter()]
        [string]$ReportPath,

        [Parameter(Mandatory = $true)]
        [string]$fileName,

        [Parameter(Mandatory = $true)]
        [ValidateSet("and", "or")]
        [String]$JoinType,

        [Parameter(Mandatory = $true)]
        [ValidateSet("ProxyAddresses", "EmailAddresses", "EmailAddress", "AddressOrMember", "x500", "UserPrincipalName", "PrimarySmtpAddress", "MembersName", "Member", "Members", "MemberOf", "Aliases", "Owners", "Managers")]
        [String]$FindInColumn,

        [Parameter()]
        [String[]]$Match,

        [Parameter()]
        [String[]]$caseMatch,

        [Parameter()]
        [String[]]$matchAnd,

        [Parameter()]
        [String[]]$caseMatchAnd,

        [Parameter()]
        [String[]]$MatchNot,

        [Parameter()]
        [String[]]$caseMatchNot,

        [Parameter()]
        [String[]]$MatchNotAnd,

        [Parameter()]
        [String[]]$caseMatchNotAnd,

        [Parameter()]
        [string]$Domain,

        [Parameter()]
        [string]$NewDomain,

        [Parameter()]
        [switch]$StripPrefix,

        [Parameter()]
        [ValidateSet("SMTP:", "smtp:", "SIP:", "sip:", "x500:")]
        [string]$AddPrefix,

        [Parameter(ValueFromPipeline = $true, Mandatory = $true)]
        $Row

    )
    Begin {
        if ($Domain -and (! $NewDomain)) {
            Write-Warning "Must use NewDomain parameter when specifying Domain parameter"
            break
        }
        if ($NewDomain -and (! $Domain)) {
            Write-Warning "Must use Domain parameter when specifying NewDomain parameter"
            break
        }

        if (-not $ReportPath) {
            $ReportPath = '.\'
            $theReport = $ReportPath | Join-Path -ChildPath $fileName
        }
        New-Item -ItemType Directory -Path $ReportPath -ErrorAction SilentlyContinue
        $theReport = $ReportPath | Join-Path -ChildPath $fileName

        $filterElements = $psboundparameters.Keys | Where-Object { $_ -match 'Match' } | ForEach-Object {

            if ($_.EndsWith('And')) {
                $logicOperator = ' -and '
            }
            else {
                $logicOperator = ' -or '
            }

            $comparisonOperator = switch ($_) {
                { $_.StartsWith('case') } { '-cmatch' }
                default { '-match' }
            }

            if ($_.Contains('Not')) {
                $comparisonOperator = $comparisonOperator -replace '^-(c?)', '-$1not'
            }

            $elements = foreach ($value in $psboundparameters[$_]) {
                '$_ {0} "{1}"' -f $comparisonOperator, $value
            }
            $elements -join $logicOperator
        }
        if ($filterElements) {
            $filterString = '({0})' -f ($filterElements -join (') -{0} (' -f $JoinType))
            $filter = [ScriptBlock]::Create($filterString)
            Write-Verbose "Filter being used: $filter"
        }
    }
    Process {
        ForEach ($CurRow in $Row) {
            # Add Error Handling for more than one SMTP:
            $Email = $CurRow.Email
            $Name = $CurRow.Name
            $Description = $CurRow.Description
            $DisplayName = $CurRow.DisplayName
            $WhoCanContactOwner = $CurRow.whoCanContactOwner
            $RecipientTypeDetails = $CurRow.RecipientTypeDetails
            $PrimarySmtpAddress = $CurRow.PrimarySmtpAddress
            $objectGUID = $CurRow.objectGUID
            $OU = $CurRow.OU
            $UserPrincipalName = $CurRow.UserPrincipalName
            $msExchRecipientTypeDetails = $CurRow.msExchRecipientTypeDetails
            $mail = $CurRow.mail
            if ($filter) {
                $Address = $CurRow."$FindInColumn" -split "`r`n" | Where-Object $filter
                Write-Verbose "Filtered Address: $Address"
            }
            else {
                $Address = $CurRow.EmailAddresses
            }
            if ($Domain) {
                $Address = $Address | ForEach-Object {
                    $_ -replace ([Regex]::Escape($Domain), $NewDomain)
                }
            }
            if ($StripPrefix) {
                $Address = $Address | ForEach-Object {
                    (($_).split(':'))[1]
                }
            }
            if ($AddPrefix) {
                $Address = $Address | ForEach-Object {
                    '{0}{1}' -f $AddPrefix, $_
                }
            }
            $AllProxyAddresses = $($CurRow."$FindInColumn")

            if ((-not [String]::IsNullOrWhiteSpace($AllProxyAddresses)) -and ([String]::IsNullOrWhiteSpace($PrimarySmtpAddress))) {
                $PrimarySmtpAddress = $CurRow."$FindInColumn" | Where-Object {$_ -cmatch 'SMTP:'}
            }
            if ($PrimarySmtpAddress -cmatch 'SMTP:') {
                $PrimaryTrimmed = $PrimarySmtpAddress.Substring(5)
            }

            if ($Address) {
                foreach ($CurAddress in $Address) {
                    [PSCustomObject]@{
                        Email                      = $Email
                        Name                       = $Name
                        AddressOrMember            = $CurAddress
                        FoundInColumn              = $FindInColumn
                        WhoCanContactOwner         = $WhoCanContactOwner
                        Description                = $Description
                        DisplayName                = $DisplayName
                        OU                         = $OU
                        UserPrincipalName          = $UserPrincipalName
                        PrimarySmtpAddress         = $PrimarySmtpAddress
                        PrimarySmtpTrimmed         = $PrimaryTrimmed
                        RecipientTypeDetails       = $RecipientTypeDetails
                        msExchRecipientTypeDetails = $msExchRecipientTypeDetails
                        objectGUID                 = $objectGUID
                    } | Export-Csv $theReport -Append -NoTypeInformation -Encoding UTF8
                }
            }
            else {
                [PSCustomObject]@{
                    Email                      = $Email
                    Name                       = $Name
                    AddressOrMember            = ""
                    FoundInColumn              = $FindInColumn
                    WhoCanContactOwner         = $WhoCanContactOwner
                    Description                = $Description
                    DisplayName                = $DisplayName
                    OU                         = $OU
                    UserPrincipalName          = $UserPrincipalName
                    PrimarySmtpAddress         = $PrimarySmtpAddress
                    PrimarySmtpTrimmed         = $PrimaryTrimmed
                    RecipientTypeDetails       = $RecipientTypeDetails
                    msExchRecipientTypeDetails = $msExchRecipientTypeDetails
                    objectGUID                 = $objectGUID
                } | Export-Csv $theReport -Append -NoTypeInformation -Encoding UTF8
            }
        }
    }
    End {

    }
}