src/Connection/Get-XrmConnection.ps1

<#
    .SYNOPSIS
    Get connections from XrmToolBox.

    .DESCRIPTION
    Browse and retrieve information from XrmToolBox saved connections.

    .PARAMETER ListAvailable
    Specify if you want to see all connections or all instances.

    .PARAMETER XtbConnectionPath
    XTB connections folder path. (Default: $env:APPDATA\MscrmTools\XrmToolBox\Connections)
#>

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

        [Parameter(Mandatory = $false)]
        [String]
        $XtbConnectionPath = "$env:APPDATA\MscrmTools\XrmToolBox\Connections"
    )
    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 {   
        $StopWatch = [System.Diagnostics.Stopwatch]::StartNew(); 
        Trace-XrmFunction -Name $MyInvocation.MyCommand.Name -Stage Start -Parameters ($MyInvocation.MyCommand.Parameters); 
    }    
    process {

        $name = $PSBoundParameters.Name;
        $instanceName = $PSBoundParameters.InstanceName;
               
        if ($PSBoundParameters.ContainsKey('Name')) {  
            $targetFilePath = "$XtbConnectionPath\$($Name).xml";
            
            $connection = Import-XrmConnection -FilePath $targetFilePath;
            if (-not $Global:XrmContext) {
                $Global:XrmContext = New-XrmContext;
            }
            $Global:XrmContext.CurrentConnection = $connection;

            if ($PSBoundParameters.ContainsKey('InstanceName')) {
                $instance = $connection.Instances | Where-Object -Property "Name" -EQ -Value $InstanceName;
                $Global:XrmContext.CurrentInstance = $instance;
                $instance;                
            }
            else {
                if ($ListAvailable) {                    
                    $connection.Instances;
                }
                $connection;
            }
        }
        else {            
            $xtbConnectionFilePath = "$XtbConnectionPath\MscrmTools.ConnectionsList.xml"
            $xtbContent = [xml] [IO.File]::ReadAllText($xtbConnectionFilePath);

            $connections = @();
            foreach ($file in $xtbContent.ConnectionsList.Files.ConnectionFile) {
                $connection = Import-XrmConnection -FilePath $file.Path;
                $connections += $connection;
            }
            $connections | Select-Object Name;
        }   
    }
    end {
        $StopWatch.Stop();
        Trace-XrmFunction -Name $MyInvocation.MyCommand.Name -Stage Stop -StopWatch $StopWatch;
    }    
}

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

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

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

    $fileNames = @(Get-ChildItem -Path "$env:APPDATA\MscrmTools\XrmToolBox\Connections" -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-XrmConnection -ParameterName "InstanceName" -ScriptBlock {

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

    if (-not ($fakeBoundParameters.ContainsKey("Name"))) {
        return @();
    }
    $fileName = "$($fakeBoundParameters.Name).xml"; 
    $targetFilePath = [IO.Path]::Combine("$env:APPDATA\MscrmTools\XrmToolBox\Connections", $fileName);
    $connection = Import-XrmConnection -FilePath $targetFilePath;

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