Висновок повідомлень користувачам за допомогою PowerShell

Незважаючи на те, що PowerShell консольний мову, іноді необхідно з скрипта PowerShell оповістити користувача про певну подію або необхідності виконати певну дію. Наприклад, вивести повідомлення про завершення будь-якого тривалого PoSh скрипта, або про настання якогось важливого події.

Найпростіший спосіб вивести віконце з довільним тестом через підсистему сценаріїв Windows - Wscript.

Наступний код виведе звичайне текстове вікно з необхідним текстом і кнопкою OK.

$ Wshell = New-Object -ComObject Wscript.Shell
$ Output = $ wshell.Popup ( "Скрипт формування звіту виконаний")

За допомогою різних властивостей методу Popup ви можете налаштувати вигляд модального вікна повідомлення. У тому числі можна повернути в скрипт результати відповіді користувача на питання (Так / Ні).

$ Output = $ wshell.Popup ( "Скрипт формування звіту завершено! Хочете вивести його на екран?", 0, "Звіт готовий", 4 + 32)

Загальний синтаксис і параметри методу Popup:

Popup (,,,)

параметри:

  • - рядок, текст повідомлення.
  • - необов'язковий, число. Кількість секунд, після закінчення якого вікно буде автоматично закрито.
  • - необов'язковий, рядок. Текст заголовка вікна повідомлення.
  • - необов'язковий, число. Комбінація прапорів, визначає тип кнопок і значка. Можливі значення прапорів:
    • 0 - кнопка ОК.
    • 1 - кнопки ОК і Скасування.
    • 2 - кнопки Стоп, Повтор, Пропустити.
    • 3 - кнопки Так, Ні, Скасування.
    • 4 - кнопки Та й Ні.
    • 5 - кнопки Повтор і Скасування.
    • 16 - значок Stop.
    • 32 - значок Question.
    • 48 - значок Exclamation.
    • 64 - значок Information.

Опис: повертає ціле значення, за допомогою якого можна дізнатися, яка кнопка була натиснута користувачем. Можливі значення:

  • -1 - таймаут.
  • 1 - кнопка ОК.
  • 2 - кнопка Скасування.
  • 3 - кнопка Стоп.
  • 4 - кнопка Повтор.
  • 5 - кнопка Пропустити.
  • 6 - кнопка Так.
  • 7 - кнопка Ні.

Більш привабливі і приємні погляду спливаючі повідомлення (ballons) можна вивести в Windows 7, 8.1 і 10 через API Windows Forms. Наступний PowerShell код виведе спливаюче повідомлення поруч з панеллю повідомлень Windows 10, яке автоматично зникне через 10 секунд.

Add-Type -AssemblyName System.Windows.Forms
$ Global: balmsg = New-Object System.Windows.Forms.NotifyIcon
$ Path = (Get-Process -id $ pid) .Path
$ Balmsg.Icon = [System.Drawing.Icon] :: ExtractAssociatedIcon ($ path)
$ Balmsg.BalloonTipIcon = [System.Windows.Forms.ToolTipIcon] :: Warning
$ Balmsg.BalloonTipText = 'Це текст спливаючого повідомлення для користувача Windows 10'
$ Balmsg.BalloonTipTitle = "Увага $ Env: USERNAME"
$ Balmsg.Visible = $ true
$ Balmsg.ShowBalloonTip (10000)

Крім того для створення барвистих спливаючих повідомлень в Windows 10 (PowerShell 5.0) можна використовувати окремий PowerShell модуль BurntToast з галереї PowerShell.

Модуль встановлюється з онлайн сховища за допомогою менеджера пакетів Windows 10:
Install-Module -Name BurntToast

Тепер, наприклад, в раніше розглянутий скрипт автоматичного відключення від Wi-FI мережі при підключенні до Ethernet можна додати барвисте повідомлення:

New-BurntToastNotification -Text "Відключення від Wi-Fi мережі", "Ви були відключені від Wi-Fi мережі, тому що ВШЕ пристрій було підключено до швидкісного Ethernet підключення." -AppLogo C: \ PS \ changenetwork.png

Отже, тепер ви знаєте як вивести повідомлення користувача через PowerShell. Якщо у користувача є динаміки, можна навіть зіграти йому мелодію:

[Console] :: beep (440,500)
[Console] :: beep (440,500)
[Console] :: beep (440,500)
[Console] :: beep (349,350)
[Console] :: beep (523,150)
[Console] :: beep (440,500)
[Console] :: beep (349,350)
[Console] :: beep (523,150)
[Console] :: beep (440,1000)
[Console] :: beep (659,500)
[Console] :: beep (659,500)
[Console] :: beep (659,500)
[Console] :: beep (698,350)
[Console] :: beep (523,150)
[Console] :: beep (415,500)
[Console] :: beep (349,350)
[Console] :: beep (523,150)
[Console] :: beep (440,1000)
[Console] :: beep (880,500)
[Console] :: beep (440,350)
[Console] :: beep (440,150)
[Console] :: beep (880,500)
[Console] :: beep (830,250)
[Console] :: beep (784,250)
[Console] :: beep (740,125)
[Console] :: beep (698,125)
[Console] :: beep (740,250)
[Console] :: beep (455,250)
[Console] :: beep (622,500)
[Console] :: beep (587,250)
[Console] :: beep (554,250)
[Console] :: beep (523,125)
[Console] :: beep (466,125)
[Console] :: beep (523,250)
[Console] :: beep (349,125)
[Console] :: beep (415,500)
[Console] :: beep (349,375)
[Console] :: beep (440,125)
[Console] :: beep (523,500)
[Console] :: beep (440,375)
[Console] :: beep (523,125)
[Console] :: beep (659,1000)
[Console] :: beep (880,500)
[Console] :: beep (440,350)
[Console] :: beep (440,150)
[Console] :: beep (880,500)
[Console] :: beep (830,250)
[Console] :: beep (784,250)
[Console] :: beep (740,125)
[Console] :: beep (698,125)
[Console] :: beep (740,250)
[Console] :: beep (455,250)
[Console] :: beep (622,500)
[Console] :: beep (587,250)
[Console] :: beep (554,250)
[Console] :: beep (523,125)
[Console] :: beep (466,125)
[Console] :: beep (523,250)
[Console] :: beep (349,250)
[Console] :: beep (415,500)
[Console] :: beep (349,375)
[Console] :: beep (523,125)
[Console] :: beep (440,500)
[Console] :: beep (349,375)
[Console] :: beep (261,125)
[Console] :: beep (440,1000)