functions/Export-MyTimer.ps1

Function Export-MyTimer {
    [cmdletbinding(SupportsShouldProcess)]
    [OutputType('None')]
    Param(
        [Parameter(
            Position = 0,
            ValueFromPipelineByPropertyName,
            HelpMessage = 'Enter a MyTimer name.'
        )]
        [ValidateNotNullOrEmpty()]
        [ArgumentCompleter({$global:MyTimerCollection.values.Name.Foreach({ if ($_ -match "\s") {"'$_'"} else {$_}})})]
        [String]$Name,
        [Parameter(
            Mandatory,
            HelpMessage = 'Enter the name and path of an XML file'
        )]
        [ValidateNotNullOrEmpty()]
        [ValidatePattern('\.xml$')]
        [String]$Path
    )

    Begin {
        Write-Verbose "Starting: $($MyInvocation.MyCommand)"
        $found = [System.Collections.Generic.list[object]]::new()
    }
    Process {
        Write-Verbose "Using PSBoundParameters: `n $(New-Object PSObject -Property $PSBoundParameters | Out-String)"
        if ($Name) {
            Write-Verbose "Finding timer variable $Name"
            $found.Add($global:MyTimerCollection["$name"])
        }
        else {
            Write-Verbose 'Finding all timer variables'
            $found.AddRange([object[]]$global:MyTimerCollection.values)
        }
    } #process
    End {
        If ($found) {
            Try {
                Write-Verbose "Exporting $($found.count) timer(s) to $Path"
                $found | Export-Clixml -Path $path -ErrorAction Stop
            }
            Catch {
                Write-Error $_
            }
        }
        else {
            Write-Warning 'No matching timers found.'
        }
        Write-Verbose "Ending: $($MyInvocation.MyCommand)"
    }

}