If you’ve ever popped a toast notification in PowerShell using the Windows Runtime (WinRT), you’ve probably discovered that, whilst it works fine in PowerShell 5, it doesn’t work at all in PowerShell Core (5/6/7+). That’s because the WinRT assemblies are not included in PowerShell Core – WinRT is an exclusively Windows thing and PowerShell Core is intended for cross-platform use.
That being said, you can still pop a toast notification with PS Core using much the same code you use for PowerShell 5 – you just need to reference a couple of dlls from the Windows SDK.
Below is some example code which will pop a simple toast notification in either PS 5 or PS 6+. For PowerShell Core, it will install the Microsoft.Windows.SDK.NET.Ref NuGet package for the current user which contains the required dlls.
| If ($PSVersionTable.PSVersion.Major -lt 6) | |
| { | |
| $null = [Windows.UI.Notifications.ToastNotificationManager, Windows.UI.Notifications, ContentType = WindowsRuntime] | |
| $null = [Windows.Data.Xml.Dom.XmlDocument, Windows.Data.Xml.Dom.XmlDocument, ContentType = WindowsRuntime] | |
| } | |
| else | |
| { | |
| # Check for the NuGet package provider and install it if necessary | |
| if ($null -eq (Get-PackageProvider –Name NuGet)) | |
| { | |
| try | |
| { | |
| $null = Install-PackageProvider –Name NuGet –Force –Scope CurrentUser –ErrorAction Stop | |
| } | |
| catch | |
| { | |
| throw $_.Exception.Message | |
| } | |
| } | |
| # Check for the Microsoft.Windows.SDK.NET.Ref NuGet package and install it if necessary | |
| If ($null -eq (Get-Package –ProviderName NuGet –Name Microsoft.Windows.SDK.NET.Ref –AllVersions –ErrorAction SilentlyContinue)) | |
| { | |
| try | |
| { | |
| $null = Install-Package –Name Microsoft.Windows.SDK.NET.Ref –ProviderName NuGet –Force –Scope CurrentUser –ErrorAction Stop | |
| } | |
| catch | |
| { | |
| throw $_.Exception.Message | |
| } | |
| } | |
| # Get the latest version of the WinRT.Runtime.dll and Microsoft.Windows.SDK.NET.dll files | |
| $WinRTRuntime = Get-ChildItem –Path "$env:LOCALAPPDATA\PackageManagement\NuGet\Packages\Microsoft.Windows.SDK.NET.Ref.*" –Filter "WinRT.Runtime.dll" –Recurse –ErrorAction SilentlyContinue | | |
| Sort-Object –Property VersionInfo.FileVersion –Desc | Select –ExpandProperty FullName | Select –First 1 | |
| $WinSDKNet = Get-ChildItem –Path "$env:LOCALAPPDATA\PackageManagement\NuGet\Packages\Microsoft.Windows.SDK.NET.Ref.*" –Filter "Microsoft.Windows.SDK.NET.dll" –Recurse –ErrorAction SilentlyContinue | | |
| Sort-Object –Property VersionInfo.FileVersion –Desc | Select –ExpandProperty FullName | Select –First 1 | |
| # Load the WinRT.Runtime.dll and Microsoft.Windows.SDK.NET.dll files | |
| Add-Type –Path $WinRTRuntime –ErrorAction Stop | |
| Add-Type –Path $WinSDKNet –ErrorAction Stop | |
| } | |
| # Notification parameters | |
| $Title = "Hello matey!" | |
| $AudioSource = "ms-winsoundevent:Notification.Default" | |
| $SubtitleText = "I say, ol' chap, it's time for a brew. Polly put the kettle on, and all that. While you prepare a cuppa, we'll install some updates." | |
| # Define the toast notification in XML format | |
| [xml]$ToastTemplate = @" | |
| <toast duration="long"> | |
| <visual> | |
| <binding template="ToastGeneric"> | |
| <text>Windows Updates – you know you love 'em</text> | |
| <group> | |
| <subgroup> | |
| <text hint-style="title" hint-wrap="true" >$Title</text> | |
| </subgroup> | |
| </group> | |
| <group> | |
| <subgroup> | |
| <text hint-style="subtitle" hint-wrap="true" >$SubtitleText</text> | |
| </subgroup> | |
| </group> | |
| </binding> | |
| </visual> | |
| <audio src="$AudioSource"/> | |
| </toast> | |
| "@ | |
| # Load the notification into the required format | |
| $ToastXml = New-Object –TypeName Windows.Data.Xml.Dom.XmlDocument | |
| $ToastXml.LoadXml($ToastTemplate.OuterXml) | |
| # Display | |
| $App = "Windows.SystemToast.WindowsUpdate.MoNotification2" | |
| [Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier($App).Show($ToastXml) |
Alternatively you can use the excellent BurntToast PowerShell module, which works on PS Core and makes use of the Windows Community Toolkit to display toast notifications.

