AppMgt/Install-RDHNAVApp.ps1

function Install-RDHNAVApp {
    <#
    .SYNOPSIS
    Installs App on a NAV Container on a remote Docker Host.
     
    .DESCRIPTION
    Before installing the app on the NAV ServerInstance of a Container on a remote Docker Host, the function will copy the local AppFile to the remote Docker Host.
     
    .PARAMETER DockerHost
    The DockerHost VM name to reach the server that runs docker and hosts the container
     
    .PARAMETER DockerHostCredentials
    The credentials to log into your docker host
     
    .PARAMETER DockerHostUseSSL
    Switch: use SSL or not
     
    .PARAMETER DockerHostSessionOption
    SessionOptions if necessary
         
    .PARAMETER ContainerName
    ContainerName
     
    .PARAMETER AppFileName
    The path to the local .app-file
     
    .PARAMETER DoNotDeleteAppFile
    Will not delete the AppFile from the RemoteDockerHost.
     
    #>

    param(
        [Parameter(Mandatory = $true)]
        [String] $DockerHost,
        [Parameter(Mandatory = $false)]
        [System.Management.Automation.PSCredential] $DockerHostCredentials,
        [Parameter(Mandatory = $false)]
        [Switch] $DockerHostUseSSL,
        [Parameter(Mandatory = $false)]
        [System.Management.Automation.Remoting.PSSessionOption] $DockerHostSessionOption,
        [Parameter(Mandatory = $true)]
        [String] $ContainerName,
        [Parameter(Mandatory = $true)]
        [String] $AppFileName,
        [Parameter(Mandatory = $false)]
        [Switch] $DoNotDeleteAppFile
    )
    
    Copy-FileToDockerHost `
        -DockerHost $DockerHost `
        -DockerHostCredentials $DockerHostCredentials `
        -DockerHostUseSSL:$DockerHostUseSSL `
        -DockerHostSessionOption $DockerHostSessionOption `
        -ContainerDestinationFolder "C:\ProgramData\navcontainerhelper\" `
        -FileName $AppFileName `
        -ErrorAction Stop
    
    $LocalAppPath = "C:\ProgramData\navcontainerhelper\" + (get-item $AppFileName).Name
    
    Write-host "Installing App $AppFileName on $ContainerName on remote dockerhost $DockerHost" -ForegroundColor Green

    Invoke-Command -ComputerName $DockerHost -UseSSL:$DockerHostUseSSL -Credential $DockerHostCredentials -SessionOption $DockerHostSessionOption -ScriptBlock {
        param(
            $ContainerName, $LocalAppPath
        )
        
        $Session = Get-NavContainerSession -containerName $ContainerName
        Invoke-Command -Session $Session -ScriptBlock {
            param(
                $LocalAppPath
            )
        
            $App = Get-NAVAppInfo -Path $LocalAppPath
            
            Get-NAVAppInfo -ServerInstance NAV -Name $App.Name -Publisher $App.Publisher -Version $App.Version |
            Uninstall-NAVApp
            
            Get-NAVAppInfo -ServerInstance NAV -Name $App.Name -Publisher $App.Publisher -Version $App.Version |
            Unpublish-NAVApp
            
            Publish-NAVApp `
            -ServerInstance NAV `
            -Path $LocalAppPath `
            -SkipVerification
            
            Sync-NAVApp `
            -ServerInstance NAV `
            -Name $App.Name `
            -Publisher $App.Publisher `
            -Version $App.Version
            
            Install-navapp `
            -ServerInstance NAV `
            -Name $App.Name `
            -Publisher $App.Publisher `
            -Version $App.Version                
            
            Write-host " Installed $($App.Name) from $($App.Publisher)" -ForegroundColor Gray
            
            if (-not $DoNotDeleteAppFile) {
                Remove-Item -Path $LocalAppPath -Force
            }
        }   -ArgumentList $LocalAppPath
    }   -ArgumentList $ContainerName, $LocalAppPath

}