ContainerHandling/Get-NavContainerSession.ps1

<#
 .Synopsis
  Get (or create) a PSSession for a Nav 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
 .Example
  $session = Get-NavContainerSession -containerName navserver
  PS C:\>Invoke-Command -Session $session -ScriptBlock { Set-NavServerInstance -ServerInstance NAV -restart }
#>

function Get-NavContainerSession {
    [CmdletBinding()]
    Param
    (
        [Parameter(Mandatory=$true)]
        [string]$containerName,
        [Parameter(Mandatory=$false)]
        [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)

                $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 "HelperFunctions.ps1") | Out-Null

                $txt2al = $NavIde.replace("finsql.exe","txt2al.exe")
                Set-Location $runPath
            } -ArgumentList $silent
            $sessions.Add($containerId, $session)
        }
        $sessions[$containerId]
    }
}
Export-ModuleMember -function Get-NavContainerSession