windows自制终端提醒方案

90 阅读1分钟

前言

在win10上,有很多类番茄钟的提醒应用,我就想着能否在终端中自己实现,经过一番折腾后,实现了自给自足的效果(但是需要本地装.net开发包),所以不想折腾但又想在终端上使用的朋友,建议下载 BurntToast 包直接食用

实际代码加个人注释

function New-ToastNotification
{
    param
    (
        [String] $waitTime,
        [String] $FirstLine = '休息时间到啦',
        [Parameter(Mandatory = $false)]
        [ValidateSet('ToastImageAndText01',
                     'ToastImageAndText02',
                     'ToastImageAndText03',
                     'ToastImageAndText04',
                     'ToastText01',
                     'ToastText02',
                     'ToastText03',
                     'ToastText04')]
        [String] $Template = 'ToastText03'
    )
    

    [xml]$ToastTemplate = ([Windows.UI.Notifications.ToastNotificationManager]::GetTemplateContent([Windows.UI.Notifications.ToastTemplateType]::$Template)).GetXml()
    
    # 上文输出结构:<toast><visual><binding template="ToastText03"><text id="1"></text><text id="2"></text></binding></visual></toast>

    $TextElements = $ToastTemplate.GetElementsByTagName('text')
    foreach ($TextElement in $TextElements)
    {
      switch ($TextElement.id)
      {
        # 如果是 1 则执行,$null的存在意义是避免输出结构到终端
          '1' { $null = $TextElement.AppendChild($ToastTemplate.CreateTextNode($FirstLine)) }
      }
    }
    
    
    $ToastXml = New-Object -TypeName Windows.Data.Xml.Dom.XmlDocument
    $ToastXml.LoadXml($ToastTemplate.OuterXml)
    
    $AppId = '{1AC14E77-02E7-4E5D-B744-2EB1AE5198B7}\WindowsPowerShell\v1.0\powershell.exe'
    
    if($waitTime) {
      Start-Sleep $waitTime
    }
    [Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier($AppId).Show($ToastXml)
}

#调用方法
New-ToastNotification

总结

pwsh7能直接运行c#语法后,对于开发者而言,确实方便了很多,像上文的个人代码,直接调用了 uwp的 ui和方法,而不用编译成二进制

扩展阅读

ToastTemplateType 枚举

官网地址:learn.microsoft.com/zh-cn/uwp/a…

静态成员运算符::

调用.net框架类的静态属性和方法。要找到对象的静态属性和方法,请使用Get-Member cmdlet的静态参数。成员名可以是一个表达式。