Несмотря на то, что PowerShell консольный язык, иногда необходимо из скрипта PowerShell оповестить пользователя об определенном событии или необходимости выполнить определенное действие. Например, вывести уведомление о завершении какого-либо длительного PoSh скрипта, или об наступлении какого-то важного события.
Самый простой способ вывести окошко с произвольным тестом через подсистему сценариев Windows – Wscript.
Следующий код выведет обычное текстовое окно с необходимым текстом и кнопкой OK.
$wshell = New-Object -ComObject Wscript.Shell
$Output = $wshell.Popup("Скрипт формирования отчета выполнен")
С помощью различных свойств метода Popup вы можете настроить вид модального окна сообщения. В том числе можно вернуть в скрипт результаты ответа пользователя на вопрос (Да / Нет).
$Output = $wshell.Popup("Скрипт формирования отчета завершен! Хотите вывести его на экран?",0,"Отчет готов",4+32)
Общий синтаксис и параметры метода Popup:
Popup(<Text>,<SecondsToWait>,<Title>,<Type>)
Параметры:
- <Text> — строка, текст сообщения.
- <SecondsToWait> — необязательный, число. Количество секунд, по истечении которого окно будет автоматически закрыто.
- <Title> — необязательный, строка. Текст заголовка окна сообщения.
- <Type> — необязательный, число. Комбинация флагов, определяет тип кнопок и значка. Возможные значения флагов:
- 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)
Спасибо за PoSH музыку, улыбнуло 🙂
Прикольно.
Можно скриптом рассылать уведомления, прям замена net send времен хп 🙂
Как отправить на терминальном сервере, эти сообщение для всех пользователей сразу?
В галерее технета есть скрипт для управления сессиями на терминальных серверах. Только нужно немного подправить «под себя».
msg * Текст
Здравствуйте. у меня к вам вопрос. Как читать эти сообщения в Windows 10. К примеру есть приложение, оно показывает уведомления, например несколько раз в день. Вот мне нужно запускать файл при уведомлении, не важно что там написано, мне нужно открывать все уведомления именно из одного приложения, как можно это сделать? Может не обязательно запускать отдельный файл для запуска, а сделать все одним скриптом? Я не знаю где лежит идентификатор приложений для этих уведомлений. Я бы мог и заплатить, все равно буду обращаться к фрилансерам. Спасибо за любую информацию относящуюся к данному вопросу.
Доброго дня.
Не понял вашу задачу. Вы хотите чтобы ваш powershell скрипт перехватывал сообщения, выводимые в сессию пользователя и как-то их обрабатывал?
А как отправить на удалённый ПК «ballons»?
Так не работает.
New-PSSession -ComputerName PC-name
Invoke-Command -ComputerName PC-name -ScriptBlock {
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)
}
Через Invoke-Command тоже.
$cred = Get-Credential
$s = New-PSSession -ComputerName PC-Name -Credential $cred
Invoke-Command -Session $s -FilePath C:\Scripts\ballons.ps1
Еще бы опубликовать как пользователю голосом передать произвольное сообщение (через синтезатор голоса).
Воспроизвести текст через встроенный синтезатор голоса Windows10 (используется текущий голос синтезатора речи):
Add-Type –AssemblyName System.Speech
$SpeechSynthesizer = New-Object –TypeName System.Speech.Synthesis.SpeechSynthesizer
$SpeechSynthesizer.Speak('Закройте программы, сейчас компьютер будет перезагружен')
Надо бы проверять, а то по умолчанию девушка только английский секет)
$SpeechSynthesizer.GetInstalledVoices().VoiceInfo
Ну да )
Уведомления не выводит
Не могу победить такую проблему: в сессии пользователя каждые 10 минут запускается скрипт пингования по расписанию. Так вот синее окно powershell всплывает поверх других окон в самый неподходящий момент. Не смог в настройках расписания сделать окно невидимым или свернутым. Как сделать, чтобы окно скрипта было невидимым?
Запускайте через планировщик так:
PowerShell.exe -windowstyle hidden { тут ваш код }
Не помогает. Всё равно появляется окно повершела на секунду.
Здравствуйте. А как поставить уведомление при печати. Чтобы у пользователя при отправки на печать появлялось окно с подтверждением и количеством отправляемых на печать листов
Можно перхватывать и парсить eventы печати из event viewer и отображать данные из них этим popup скриптом.
Тот же вопрос, как этот скрипт отправить на удаленный ПК ? через Invoke-Command не работает.
Посмотрите на модуль _https://github.com/Windos/BurntToast — он должен стоять на удаленном компьютере
Invoke-Command -ComputerName RemotePC -ScriptBlock {New-BurntToastNotification -Text 'Test'}
и вот еще пример, на api:
_https://smsagent.blog/2019/06/11/just-for-fun-send-a-remote-toast-notification/
приветствую.
есть такая конструкция для вывода уведомления windows —
powershell {
[reflection.assembly]::loadwithpartialname('System.Windows.Forms')
[reflection.assembly]::loadwithpartialname('System.Drawing')
$notify=new-object system.windows.forms.notifyicon
$notify.icon=[System.Drawing.SystemIcons]::Information
$notify.visible=$true
$notify.showballoontip(10,'Defender','Need reboot',[system.windows.forms.tooltipicon]::Warning)
}
можно ли в нижней строке ([system.windows.forms.tooltipicon]::Warning) иконку заменить на свою ссылкой из .dll ?
Заменить стандартную иконку можно так:
$Icon = New-Object system.drawing.icon (".\icon\test.ico")
$notify.Icon = $Icon
каким образом это относится к моему вопросу?