Я не нашел способа сделать так, что бы вызываемое окно было поверх всех остальных окон, с помощью стандартных средств PS:
[System.Windows.Forms.MessageBox]::Show("Message","Title")
Но я знаю что в VBS есть свойство MsgBox под названием SystemModal, которое как раз и заставляет появляться popup окно поверх всех, расположенных на экране.
Мы можем убедиться в этом так:
# Добавляем в сеанс возможность использовать VBS Add-Type -AssemblyName Microsoft.VisualBasic
# Смотрим доступные свойства [System.Enum]::GetNames( [Microsoft.VisualBasic.MsgBoxStyle] )
Убедившись в наличии нужного свойства, мы можем использовать этот Workaround aka «костыль»:
# Выводим MsgBox поверх всех окон [Microsoft.VisualBasic.Interaction]::MsgBox("Text", "OKOnly,SystemModal,Information", "Title")
UPD:
В итоге я разобрался, как используя Forms.MessageBox сделать окно «поверх всех».
( $FrmMain = New-Object 'System.Windows.Forms.Form' ).TopMost = $True [System.Windows.Forms.MessageBox]::Show($FrmMain,"Текст", "Заголовок", 4, 48)
На первый взгляд этот способ ничем не лучше предыдущего, но он немного короче и не требует подгрузки дополнительных компонентов.
А так же в PowerShell версии 6.1 удален командлет Add-Type.
Хотя VisualBasic по прежнему должен подгружаться через .NET
[System.Reflection.Assembly]::loadwithpartialname("Microsoft.VisualBasic")
Посмотреть доступные типы форм и иконок можно следующими командами
[System.Enum]::GetNames([System.Windows.Forms.MessageBoxButtons])
[System.Enum]::GetNames([System.Windows.Forms.MessageBoxIcon])
Еще у полученных параметров есть соответствующие им числовые коды, кстати такие же как и в VBS:
# Выбор типа используемой формы Ok = 0 OkCancel = 1 AbortRetryIgnore = 2 YesNoCancel = 3 YesNo = 4 RetryCancel= 5 # А доступные иконки с помощью Critical = 16 Question = 32 Warning = 48 Informational = 64
Записать ответ диалогового окна в переменную
Бонусом напишу, что для получения ответа в переменную нужно просто присвоить ей команду на вызов окна:
$ans = [System.Windows.Forms.MessageBox]::Show($FrmMain,"Вы хотите открыть Блокнот?", "Подтверждение", 4, 32) if($ans -eq "Yes"){start Notepad}
использовал ваш вариант через VBS т.к. не смог добиться положения окна наверху если скрипт запускается как task.
здесь(https://social.technet.microsoft.com/Forums/Windows/ru-RU/a9cdbb52-75ea-4fac-a04a-dcdbf1dbac48/formtopmost-true-10851077?forum=scrlangru) описывается проблемка, но мне решение не помогло.
спасибо!