Public/Get-RetentionPolicyReport.ps1

function Get-RetentionPolicyReport {
    <#
    .SYNOPSIS
        Exports Microsoft Purview retention policies, rules, and retention labels to CSV.
    .DESCRIPTION
        Requires an active Connect-IPPSSession. Read-only.
    .PARAMETER OutputFolder
        Folder for CSV output. Defaults to ./output.
    .EXAMPLE
        Get-RetentionPolicyReport
    .NOTES
        Role required: Compliance Administrator or Records Management (view).
    #>

    [CmdletBinding()]
    param(
        [string]$OutputFolder = (Join-Path (Get-Location) 'output')
    )
    $ErrorActionPreference = 'Stop'
    if (-not (Get-Command Get-RetentionCompliancePolicy -ErrorAction SilentlyContinue)) {
        throw 'Get-RetentionCompliancePolicy not found. Run Connect-IPPSSession first.'
    }
    New-Item -ItemType Directory -Path $OutputFolder -Force | Out-Null
    $stamp = Get-Date -Format 'yyyyMMdd-HHmm'

    $policies = foreach ($policy in Get-RetentionCompliancePolicy -DistributionDetail) {
        $rule = Get-RetentionComplianceRule -Policy $policy.Name | Select-Object -First 1
        [pscustomobject]@{
            Policy              = $policy.Name
            Enabled             = $policy.Enabled
            Mode                = $policy.Mode
            DistributionStatus  = $policy.DistributionStatus
            ExchangeLocation    = $policy.ExchangeLocation.Name -join ';'
            SharePointLocation  = $policy.SharePointLocation.Name -join ';'
            OneDriveLocation    = $policy.OneDriveLocation.Name -join ';'
            ModernGroupLocation = $policy.ModernGroupLocation.Name -join ';'
            TeamsChatLocation   = $policy.TeamsChatLocation.Name -join ';'
            RetentionDuration   = $rule.RetentionDuration
            RetentionAction     = $rule.RetentionComplianceAction
            ExpirationDateOption = $rule.ExpirationDateOption
        }
    }
    $policyFile = Join-Path $OutputFolder "RetentionPolicies-$stamp.csv"
    $policies | Export-Csv -Path $policyFile -NoTypeInformation

    $labels = Get-ComplianceTag | Select-Object Name, RetentionAction, RetentionDuration, RetentionType, IsRecordLabel, Regulatory, WhenChangedUTC
    $labelFile = Join-Path $OutputFolder "RetentionLabels-$stamp.csv"
    $labels | Export-Csv -Path $labelFile -NoTypeInformation

    Write-Information "Policies: $(@($policies).Count) -> $policyFile" -InformationAction Continue
    Write-Information "Labels: $(@($labels).Count) -> $labelFile" -InformationAction Continue
}