Public/Show-SMBeat.ps1

#Requires -Version 5.1

function Show-SMBeat {
    <#
    .SYNOPSIS
        Builds and exports an HTML report with defaults.
    .DESCRIPTION
        Aggregates samples and writes HTML in one step. CSV only with -Csv.
        Default window is all samples still on disk (first listen to now).
        Files go to Documents\SMBeat-Reports on the machine that runs the cmdlet.
        Theme is health. Language follows the UI of that machine.
    .PARAMETER Csv
        Also write CSV files (shares, clients, users, servers, optional time series).
        Off by default.
    .PARAMETER NoOpen
        Write the files but do not open the HTML report. Default is to open it.
    .PARAMETER PassThru
        Return the report object after writing the files (for scripts).
    #>

    [CmdletBinding(DefaultParameterSetName = 'Local')]
    param(
        [Parameter(ParameterSetName = 'ComputerName', ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
        [string[]]$ComputerName,

        [Parameter(ParameterSetName = 'Session')]
        [System.Management.Automation.Runspaces.PSSession[]]$Session,

        [pscredential]$Credential,
        [System.Management.Automation.Runspaces.AuthenticationMechanism]$Authentication,
        [switch]$UseSSL,
        [int]$Port,
        [System.Management.Automation.Remoting.PSSessionOption]$SessionOption,
        [int]$ThrottleLimit = 32,

        [datetime]$Start,
        [datetime]$End,
        [int]$LastHours,
        [int]$LastDays,
        [int]$LastWeeks,
        [ValidateSet('Hour', 'Day', 'Week')]
        [string[]]$Granularity = @('Hour', 'Day', 'Week'),
        [object]$TimeZone,
        [string]$Path,
        [string]$OutputPath,
        [ValidateSet('de', 'en')]
        [string]$Language,
        [ValidateSet('de', 'en')]
        [string]$CsvCulture,
        [ValidateSet('health', 'pine', 'dark')]
        [string]$Theme = 'health',
        [switch]$Csv,
        [switch]$NoOpen,
        [switch]$PassThru
    )

    begin {
        Assert-SMBeatRemotingExclusive -ComputerName $ComputerName -CimSession $null -Session $Session
        $names = New-Object System.Collections.Generic.List[string]
        $progressId = 60425
        $progressActivity = 'SMBeat report'
        $progressRead = 'Reading and aggregating data'
        $progressWrite = 'Writing HTML'
        if ($Csv) {
            $progressWrite = 'Writing HTML and CSV files'
        }
        if ((Get-SMBeatLanguage -Language $Language) -eq 'de') {
            $progressActivity = 'SMBeat-Bericht'
            $progressRead = 'Daten lesen und auswerten'
            $progressWrite = 'HTML-Datei schreiben'
            if ($Csv) {
                $progressWrite = 'HTML- und CSV-Dateien schreiben'
            }
        }
    }

    process {
        if ($PSCmdlet.ParameterSetName -eq 'ComputerName') {
            foreach ($name in @($ComputerName)) {
                if (-not [string]::IsNullOrWhiteSpace($name)) {
                    $names.Add($name) | Out-Null
                }
            }
            return
        }

        $get = @{
            Granularity = $Granularity
        }
        if ($PSBoundParameters.ContainsKey('Start')) { $get['Start'] = $Start }
        if ($PSBoundParameters.ContainsKey('End')) { $get['End'] = $End }
        if ($LastHours) { $get['LastHours'] = $LastHours }
        if ($LastDays) { $get['LastDays'] = $LastDays }
        if ($LastWeeks) { $get['LastWeeks'] = $LastWeeks }
        if ($TimeZone) { $get['TimeZone'] = $TimeZone }
        if ($Path) { $get['Path'] = $Path }
        if ($PSCmdlet.ParameterSetName -eq 'Session') {
            $get['Session'] = $Session
            if ($Credential) { $get['Credential'] = $Credential }
            if ($PSBoundParameters.ContainsKey('Authentication')) { $get['Authentication'] = $Authentication }
            if ($UseSSL) { $get['UseSSL'] = $true }
            if ($Port) { $get['Port'] = $Port }
            if ($SessionOption) { $get['SessionOption'] = $SessionOption }
            if ($ThrottleLimit) { $get['ThrottleLimit'] = $ThrottleLimit }
        }

        try {
            Write-Progress -Id $progressId -Activity $progressActivity -Status $progressRead -PercentComplete 10
            $report = Get-SMBeatReport @get
            Write-Progress -Id $progressId -Activity $progressActivity -Status $progressWrite -PercentComplete 85
            Write-SMBeatReportFiles -Report $report -OutputPath $OutputPath -Language $Language -CsvCulture $CsvCulture -Theme $Theme -Csv:$Csv -Open:(-not $NoOpen)
            if ($PassThru) {
                $report
            }
        }
        finally {
            Write-Progress -Id $progressId -Activity $progressActivity -Completed
        }
    }

    end {
        if ($PSCmdlet.ParameterSetName -ne 'ComputerName') {
            return
        }
        if ($names.Count -eq 0) {
            return
        }

        $get = @{
            ComputerName = $names.ToArray()
            Granularity  = $Granularity
        }
        if ($PSBoundParameters.ContainsKey('Start')) { $get['Start'] = $Start }
        if ($PSBoundParameters.ContainsKey('End')) { $get['End'] = $End }
        if ($LastHours) { $get['LastHours'] = $LastHours }
        if ($LastDays) { $get['LastDays'] = $LastDays }
        if ($LastWeeks) { $get['LastWeeks'] = $LastWeeks }
        if ($TimeZone) { $get['TimeZone'] = $TimeZone }
        if ($Path) { $get['Path'] = $Path }
        if ($Credential) { $get['Credential'] = $Credential }
        if ($PSBoundParameters.ContainsKey('Authentication')) { $get['Authentication'] = $Authentication }
        if ($UseSSL) { $get['UseSSL'] = $true }
        if ($Port) { $get['Port'] = $Port }
        if ($SessionOption) { $get['SessionOption'] = $SessionOption }
        if ($ThrottleLimit) { $get['ThrottleLimit'] = $ThrottleLimit }

        try {
            Write-Progress -Id $progressId -Activity $progressActivity -Status $progressRead -PercentComplete 10
            $report = Get-SMBeatReport @get
            Write-Progress -Id $progressId -Activity $progressActivity -Status $progressWrite -PercentComplete 85
            Write-SMBeatReportFiles -Report $report -OutputPath $OutputPath -Language $Language -CsvCulture $CsvCulture -Theme $Theme -Csv:$Csv -Open:(-not $NoOpen)
            if ($PassThru) {
                $report
            }
        }
        finally {
            Write-Progress -Id $progressId -Activity $progressActivity -Completed
        }
    }
}