By Steve Endow
On January 23, 2021, I recorded a video showing how to create a simple text file using AL in Business Central.
Here is the video:
https://www.youtube.com/watch?v=_GUzlFKJFQk
Below is the sample code from that video.
Steve Endow is a Microsoft MVP who works with Microsoft Dynamics 365 Business Central, Power Apps, Power Automate, Azure, .NET, and SQL Server
Dynamics 365 BC Resources List: https://bit.ly/bcresources
By Steve Endow
On January 23, 2021, I recorded a video showing how to create a simple text file using AL in Business Central.
Here is the video:
https://www.youtube.com/watch?v=_GUzlFKJFQk
Below is the sample code from that video.
By Steve Endow
UPDATE: If you're interested in a convenient way to run the BcContainerHelper PowerShell commands, check out Krzysztof's Azure Data Studio Notebook with sample BcContainerHelper commands. Jupyter Notebooks are a great way to include documentation and commands in a single convenient format.
On August 11, 2020, Freddy Kristiansen announced that he had released BcContainerHelper.
You can read his blog post here:
https://freddysblog.com/2020/08/11/bccontainerhelper/
You will definitely want to read the entire blog post carefully, and perhaps read it a few times, as he shares quite a few important details about the new BcContainerHelper.
![]() |
Same Great Container Helper, But Updated and Upgraded! |
I made a video showing how I updated from NavContainerHelper to BcContainerHelper. The process went flawlessly.
Here are the PowerShell Docker commands that I used to perform my update.
![]() |
No soup for you! |
![]() |
Email notification when an update occurs |
#v1.0 - March 27, 2021
#
$server = $env:COMPUTERNAME
#Define date values
$simpleDate = Get-Date -Format "M/d/yy"
$dateTime = Get-Date -Format "M/d/yy HH:mm"
$fileDateTime = Get-Date -Format "yyyy-MM-dd HHmm"
#Define the module name
$moduleName = 'BcContainerHelper'
$body = ""
$message = ""
$updated = $false
#Specify file location for activity transcript log file
$transcriptFile = "D:\BCPowerShell\Logs\" + $fileDateTime + " " + $server + " " + $moduleName + " Update Log.txt"
#Start recording transcript
Start-Transcript -Path $transcriptFile
#Record the start time
$StartTime = $(get-date)
#Define email configuration
$emailFrom = "myemail@gmail.com"
$emailTo = "myemail@gmail.com"
$smtpServer = "smtp.gmail.com"
$port = "587"
#Email password file created using: Read-Host -AsSecureString | ConvertFrom-SecureString | Out-File -FilePath D:\BCPowerShell\Gmail_password.securestring
$passwordFile = "D:\BCPowerShell\Gmail_password.securestring"
$securePassword = ConvertTo-SecureString (Get-Content -Path $passwordFile)
$smtpCred = New-Object -TypeName PSCredential ($emailFrom, $securePassword)
$subject = $server + ": " + $simpleDate + " " + $moduleName + " Update Log";
$started = "Start time: " + $StartTime
$body += $started + "`n`n"
Try
{
#Get currently installed version
$currentVersion = (Get-InstalledModule $moduleName -ErrorAction SilentlyContinue).Version.ToString()
}
Catch
{
$currentVersion = "(not installed)"
}
#Get the latest version available
$latestVersion = (Find-Module $moduleName).Version.ToString()
#If we don't have the latest version installed
If ($currentVersion -ne $latestVersion)
{
$message = "Current version: " + $currentVersion + "`nLatest version: " + $latestVersion;
$message += "`n`nUpdating to version " + $latestVersion;
#Remove existing version(s)
Uninstall-Module $moduleName -Force -AllVersions -ErrorAction SilentlyContinue
#Install latest version
Install-Module $moduleName -Force
$updated = $true;
#Verify version number
$currentVersion = (Get-InstalledModule $moduleName).Version.ToString()
$message += "`nUpdate complete";
$message += "`nCurrent version is now " + $currentVersion;
$body += "`n" + $message;
Write-Output $message
}
Else
{
#If we are on the latest version, log that info
$message = "You are on the latest version of " + $moduleName + ": " + $currentVersion;
Write-Output $message
}
#Record end time
$EndTime = $(get-date)
$output = "`nEnd time: " + $EndTime
$body += "`n" + $output
Write-Output $output
#Calculate elapsed time
$elapsedTime = $EndTime - $StartTime
$totalTime = "{0:HH:mm:ss}" -f ([datetime]$elapsedTime.Ticks)
$output = "Elapsed time: " + $totalTime
$body += "`n" + $output
Write-Output $output
$body += "`n`nFull log file is attached"
#Finish the transcript recording
#The Transcript must be stopped before trying to send the email,
#otherwise the log file will be locked, causing the email to fail
Stop-Transcript
if ($updated)
{
#Send the email
Send-MailMessage -From $emailFrom -To $emailTo `
-Subject $subject `
-Body $body `
-Attachments $transcriptFile `
-SmtpServer $smtpServer `
-Credential $smtpCred `
-Port $port `
-UseSsl
}
![]() |
Just tell me how it went... |
![]() |
PowerShell isn't too bad |
Open Powershell / Powershell ISE on HOST machine using Run As Administrator
NOTE: When referring to a Container ID or Image ID, you can use the first
few characters of the ID if they are unique--you do not have to always
use the full ID.
Check NavContainerHelper Version
Get-InstalledModule NavContainerHelper
Fresh Install of NavContainerHelper
Install-module navcontainerhelper
Import-Module navcontainerhelper
Install Latest NavContainerHelper
If you KNOW you don't have multiple versions installed:
Update-Module NavContainerHelper -Force
If you MIGHT have multiple versions installed:
$MyModuleName = <modulename>
Uninstall-Module $MyModuleName -allversions
Install-Module $MyModuleName
NOTE: I do not recommend using the -Force option with Install-Module.
It can bypass valuable warnings that you want to know about.
Alternate method to Remove Old Versions of NavContainerHelper
$ModuleName = 'navcontainerhelper';
$Latest = Get-InstalledModule $ModuleName;
Get-InstalledModule $ModuleName -AllVersions | ? {$_.Version -ne $Latest.Version} | Uninstall-Module -WhatIf
Container Management Commands
Compact Container listing:
docker ps --format "table {{.Names}}\t{{.ID}}\t{{.CreatedAt}}\t{{.Status}}"
Full listing:
docker ps
docker ps -a
docker start <id>
docker stop <id>
docker container inspect
Remove Container
Recommended method:
Remove-BCContainer <containername>
Manual Docker method:
docker stop <id>
docker rm <id>
Manually clean up hosts file
Manually remove desktop icons
Manually remove extensions from C:\ProgramData\NavContainerHelper\Extensions\
Stop all running containers:
docker stop $(docker ps -aq)
Images
docker images
docker images -a
Remove Image
docker rmi <id>
docker rmi <repository>:<tag>
Remove all images:
docker rmi $(docker images -aq)
Clean up old images
Remove orphaned images with "< none >" identifiers:
docker images -q -f dangling=true | % { docker rmi $_ }
Remove orphaned images:
docker image prune -f
Remove orphaned AND UNUSED images:
WARNING: Be careful with this: It will remove generic OS images used by NavContainerHelper!
docker image prune -a -f
Get Artifact Info for an existing BC Container:
Get-BcContainerArtifactUrl containername
Get-NavContainerArtifactUrl containername
Diagnostics
Get-BcContainerEventLog
Create New BC Container
New-BcContainerWizard
https://blog.baudson.de/blog/stop-and-remove-all-docker-containers-and-images
By Steve Endow In the software / consulting world, we're sometimes given data that is messy, and we, the software developers, consultan...