Functions/Connection/Get-CdsConnection.ps1

<#
    .SYNOPSIS
    Explore connection files.
#>

function Get-CdsConnection {
    [CmdletBinding()]
    param
    (
        [Parameter(Mandatory = $false)]
        [Switch]
        $ListAvailable,

        [Parameter(Mandatory = $false)]
        [switch]
        $DoNotDecryptPassword        
    )
    dynamicparam {
        $dynamicParameters = New-Object -TypeName System.Management.Automation.RuntimeDefinedParameterDictionary;
             
        # Define Dynamic Parameter : Name
        $nameParameterAttributes = New-Object -TypeName System.Collections.ObjectModel.Collection[System.Attribute];
        $nameParameterAttribute = New-Object System.Management.Automation.ParameterAttribute;
        $nameParameterAttribute.Mandatory = (-not $ListAvailable);        
        $nameParameterAttributes.Add($nameParameterAttribute);        
        $nameParameter = New-Object -TypeName System.Management.Automation.RuntimeDefinedParameter("Name", [string], $nameParameterAttributes);
        $dynamicParameters.Add("Name", $nameParameter);
                                 
        # Define Dynamic Parameter : InstanceName
        $instanceNameParameterAttributes = New-Object -TypeName System.Collections.ObjectModel.Collection[System.Attribute];
        $instanceNameParameterAttribute = New-Object System.Management.Automation.ParameterAttribute;
        $instanceNameParameterAttributes.Add($instanceNameParameterAttribute);        
        $instanceNameParameter = New-Object -TypeName System.Management.Automation.RuntimeDefinedParameter("InstanceName", [string], $instanceNameParameterAttributes);
        $dynamicParameters.Add("InstanceName", $instanceNameParameter);
              
        return $dynamicParameters;    
    }
    begin {   
        $Global:CdsContext = New-CdsContext;
        $StopWatch = [System.Diagnostics.Stopwatch]::StartNew(); 
        Trace-CdsFunction -Name $MyInvocation.MyCommand.Name -Stage Start -Parameters ($MyInvocation.MyCommand.Parameters); 
    }    
    process {
        $name = $PSBoundParameters.Name;
        $instanceName = $PSBoundParameters.InstanceName;
               
        if ($name) {  
            $targetFilePath = [IO.Path]::Combine($Global:PowerCdsModuleFolderPath, "$name.xml");
            
            $cdsConnection = Import-CdsConnection -FilePath $targetFilePath -DoNotDecryptPassword:$DoNotDecryptPassword;
            $Global:CdsContext.CurrentConnection = $cdsConnection;

            if ($instanceName) {
                $cdsInstance = $cdsConnection.Instances | Where-Object -Property "Name" -EQ -Value $instanceName;
                $Global:CdsContext.CurrentInstance = $cdsInstance;
                $cdsInstance;                
            }
            else {
                if ($ListAvailable) {                    
                    $cdsConnection.Instances;
                }
                $cdsConnection;
            }
        }
        else {                          
            $files = Get-ChildItem -Path $Global:PowerCdsModuleFolderPath -Include "*.xml" -Recurse;
            $connections = @();
            foreach ($file in $files) {
                $cdsConnection = Import-CdsConnection -FilePath $file.FullName -DoNotDecryptPassword:$DoNotDecryptPassword;
                $connections += $cdsConnection;
            }
            $connections;
        } 
    }
    end {
        $StopWatch.Stop();
        Trace-CdsFunction -Name $MyInvocation.MyCommand.Name -Stage Stop -StopWatch $StopWatch;
    }    
}

Export-ModuleMember -Function Get-CdsConnection -Alias *;

Register-ArgumentCompleter -CommandName Get-CdsConnection -ParameterName "Name" -ScriptBlock {

    param($CommandName, $ParameterName, $WordToComplete, $CommandAst, $FakeBoundParameters)

    $fileNames = @(Get-ChildItem -Path $Global:PowerCdsModuleFolderPath -Include "*.xml" -Recurse | Select-Object -Property BaseName);
    $validNames = @();
    $fileNames | Sort-Object -Property BaseName  | ForEach-Object {
        $validNames += $_.BaseName;
    }
    return $validNames | Where-Object { $_ -like "$wordToComplete*" };
}

Register-ArgumentCompleter -CommandName Get-CdsConnection -ParameterName "InstanceName" -ScriptBlock {

    param($CommandName, $ParameterName, $WordToComplete, $CommandAst, $FakeBoundParameters)

    if (-not ($fakeBoundParameters.ContainsKey("Name"))) {
        return @();
    }
    $fileName = "$($fakeBoundParameters.Name).xml"; 
    $targetFilePath = [IO.Path]::Combine($Global:PowerCdsModuleFolderPath, $fileName);
    $cdsConnection = Import-CdsConnection -FilePath $targetFilePath;

    $validInstanceNames = @();
    $cdsConnection.Instances | Sort-Object -Property Name | ForEach-Object {
        $validInstanceNames += $_.Name;
    }           
    return $validInstanceNames | Where-Object { $_ -like "$wordToComplete*" };
}