Public/New-DotNetToast.ps1

Function New-DotNetToast {
    <#
    .SYNOPSIS
        Создает новое всплывающее уведомление (Toast).
    .DESCRIPTION
        Функция использует Windows.UI.Notifications.ToastNotification для отображения всплывающих сообщений.
    .PARAMETER Title
        Заголовок всплывающего окна.
    .PARAMETER Message
        Текс сообщения, которое будет отображатся в виде Toast.
    .PARAMETER Logo
        Путь к файлу с иконкой для отображения.
    .EXAMPLE
        PS C:\> $Title = 'Ошибка при настройке системы'
        PS C:\> $Message = 'Вам необходимо обратится в IT-отдел, т.к. в этот сеансе что-то пошло не так...'
        PS C:\> $Logo = 'C:\Tools\_aux\pic\message_error_icon64.png'
        PS C:\> New-DotNetToast -Title $Title -Message $Message -Logo $Logo
 
    .NOTES
    Задача данной функции - создать информационное сообщение. Обработка щелчка мыши или добавление кнопок не предусмотрены.
    Если есть задача создавать более функциональные уведомления - используйте модуль BurntToast
    #>


    [cmdletBinding()]
    Param(
        [Parameter(Mandatory = $true, ValueFromPipeline = $false, Position = 0)]
        [System.String]
        $Title,
        [Parameter(Mandatory = $true, ValueFromPipeline = $false, Position = 1)]
        [System.String]
        $Message,
        [Parameter(Mandatory = $false, ValueFromPipeline = $false, Position = 2)]
        [System.String]
        $Logo
    )

    try {
        if ($IsLinux) {
            throw [System.Configuration.ConfigurationException]::New('This operation system does not supported.')
        }
        # Определяем тип ОС, так как не везде можно показать Toast notification
        $OSInstallationType = (Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion").InstallationType
        switch ($OSInstallationType) {
            # Это пригодится, если мы на Core-версии сервера.
            'Server Core' {
                Add-Type -AssemblyName PresentationFramework
                [System.Windows.MessageBox]::Show($Message, $Title)
                break
            }
            # Все остальное, кроме Core-сервера
            Default {

                $XmlString = @"
<toast>
    <visual>
    <binding template="ToastGeneric">
        <text>$Title</text>
        <text>$Message</text>
        <image src="$Logo" placement="appLogoOverride" hint-crop="square" />
    </binding>
    </visual>
    <audio src="ms-winsoundevent:Notification.Default" />
</toast>
"@


                $AppId = '{1AC14E77-02E7-4E5D-B744-2EB1AE5198B7}\WindowsPowerShell\v1.0\powershell.exe'
                #Add-Type -Path 'C:\Program Files\WindowsPowerShell\Modules\BurntToast\0.6.2\lib\Microsoft.Toolkit.Uwp.Notifications\Microsoft.Toolkit.Uwp.Notifications.dll'
                $null = [Windows.UI.Notifications.ToastNotificationManager, Windows.UI.Notifications, ContentType = WindowsRuntime]
                $null = [Windows.Data.Xml.Dom.XmlDocument, Windows.Data.Xml.Dom.XmlDocument, ContentType = WindowsRuntime]

                $ToastXml = [Windows.Data.Xml.Dom.XmlDocument]::new()

                $ToastXml.LoadXml($XmlString)

                $Toast = [Windows.UI.Notifications.ToastNotification]::new($ToastXml)

                [Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier($AppId).Show($Toast)
            }
        }
    }
    catch {
        Write-Error -Exception $PSItem.Exception
    }
}