ContainerHandling/Get-NavContainerSession.ps1

<#
 .Synopsis
  Get (or create) a PSSession for a NAV/BC Container
 .Description
  Checks the session cache for an existing session. If a session exists, it will be reused.
  If no session exists, a new session will be created.
 .Parameter containerName
  Name of the container for which you want to create a session
 .Parameter silent
  Include the silent switch to avoid the welcome text
 .Example
  $session = Get-NavContainerSession -containerName navserver
  PS C:\>Invoke-Command -Session $session -ScriptBlock { Set-NavServerInstance -ServerInstance $ServerInstance -restart }
#>

function Get-NavContainerSession {
    [CmdletBinding()]
    Param (
        [string] $containerName = "navserver",
        [switch] $silent
    )

    Process {
        $containerId = Get-NavContainerId -containerName $containerName

        if ($sessions.ContainsKey($containerId)) {
            $session = $sessions[$containerId]
            try {
                $ok = Invoke-Command -Session $session -ScriptBlock { $true }
            }
            catch {
                Remove-PSSession -Session $session
                $sessions.Remove($containerId)
            }
        }
        if (!($sessions.ContainsKey($containerId))) {
            $session = New-PSSession -ContainerId $containerId -RunAsAdministrator
            Invoke-Command -Session $session -ScriptBlock { Param([bool]$silent)

                $ErrorActionPreference = 'Stop'
                $runPath = "c:\Run"
                $myPath = Join-Path $runPath "my"

                function Get-MyFilePath([string]$FileName)
                {
                    if ((Test-Path $myPath -PathType Container) -and (Test-Path (Join-Path $myPath $FileName) -PathType Leaf)) {
                        (Join-Path $myPath $FileName)
                    } else {
                        (Join-Path $runPath $FileName)
                    }
                }

                . (Get-MyFilePath "prompt.ps1") -silent:$silent | Out-Null
                . (Get-MyFilePath "ServiceSettings.ps1") | Out-Null
                . (Get-MyFilePath "HelperFunctions.ps1") | Out-Null

                $txt2al = ""
                if ($roleTailoredClientFolder) {
                    $txt2al = Join-Path $roleTailoredClientFolder "txt2al.exe"
                    if (!(Test-Path $txt2al)) {
                        $txt2al = ""
                    }
                }

                Set-Location $runPath
            } -ArgumentList $silent
            $sessions.Add($containerId, $session)
        }
        $sessions[$containerId]
    }
}
Set-Alias -Name Get-BCContainerSession -Value Get-NavContainerSession
Export-ModuleMember -Function Get-NavContainerSession -Alias Get-BCContainerSession