Как отобразить Msgbox напрямую из CMD


16

Я хотел бы отобразить сообщение для пользователя с помощью CMD. Я знаю, как это сделать, создав файл .vbs (VBScript) и выполнив его из CMD следующим образом:

(echo MsgBox "Line 1" ^& vbCrLf ^& "Line 2",262192, "Title")> File.vbs

start File.vbs

Но я хочу отобразить сообщение, не создавая никакого файла, прямо из CMD. Может быть, с помощью команды для запуска VBScripts прямо из CMD.


Посмотрите на msgкоманду. У вас может не быть этого, если вы используете домашнюю версию Windows, но вы можете добавить ее, просто скопировав и вставив msg.exe из установки Pro.
wysiwyg

Я бы что-то чуть более "универсальный", для всех версий Windows 10, если есть способ.
Бита

Там всегда есть PowerShell. Oft упустили из виду, хотя Microsoft явно начала переход к устранению командной строки cmd.
Appleoddity

Ответы:


9

Как уже говорили другие, нет способа сделать это чисто с помощью cmd, но, хотя это и есть название вопроса, мне кажется, что часть без файла более важна для вас, и при определенных обстоятельствах это может быть возможно.

С PowerShell должно быть возможно запустить код без любого файла, как это:

PowerShell -Command "Add-Type -AssemblyName PresentationFramework;[System.Windows.MessageBox]::Show('Hello World')"

VBS не разрешает прямое выполнение кода через cscript или wscript, но mshta разрешает. Вы можете использовать его следующим образом (если вам нужно несколько строк, используйте «:» в качестве разделителя):

mshta vbscript:Execute("msgbox ""Hello World"":close")

Так как он базируется, то есть на него могут повлиять некоторые ограничения gpo, поэтому, если у вас есть выбор, то PowerShell, вероятно, является более безопасной ставкой.


В дополнение к приведенному выше предупреждению mshta, некоторые антивирусные программы считают это потенциально нежелательным процессом. На работе моя попытка запустить его привела к чрезмерно усердному корпоративному продукту (SentinelOne), который изолировал всю мою машину и удалил ее из сети.
Джейсон

15

Как подсказывает @wysiwyg, в версиях Windows для Pro / Business * вы ищете Msgкоманду. Он доступен во всех современных версиях Windows (по крайней мере, в XP). Чтобы отобразить сообщение для текущего пользователя, выполнившего следующее:

msg %username% Your message here

Результат выглядит так: введите описание изображения здесь

Одним из соображений, связанных с этой командой, является то, что вы не можете настраивать текст Titlebar.

Вы можете узнать больше о Msg на TechNet .


* Если вам нужно решение, которое работает во всех выпусках Windows, включая Home , на мой взгляд, метод VBScript, который вам уже известен, является самым простым решением этой проблемы. Он работает на всех современных версиях и выпусках Windows в конфигурации по умолчанию и прост в использовании.


1
Не совсем верно. С момента выхода окна была команда dps message box. Я полагаю, что это было удалено в Windows 7 или 8, поскольку это рассматривалось как возможный эксплойт.
Келтари

2

Мне нужно что-то похожее на это сегодня. Так как я не смог найти решение для внешних зависимостей, которое мне понравилось, так как я на самом деле не фанат VBScript / Powershell, я решил написать следующее:

https://github.com/cubiclesoft/messagebox-windows

Окна сообщений, которые он создает, являются модальными для текущего окна консоли. То есть пользователь не может ничего сделать, пока не закроет диалог. Кроме того, код возврата от MessageBox()вызова возвращается вызывающей стороне, чтобы скрипт мог реагировать на нажатие любой кнопки. И, конечно же, он поддерживает полный набор параметров MessageBox()Win32 API.

Добавление исполняемого файла размером 80 КБ может не быть чашей чая для всех. Тем не менее, он статически связан с средой выполнения VC ++ и поддерживает Unicode, что объясняет, почему файл такой большой, учитывая минималистический характер его работы. Кроме того, существует небольшая проблема, заключающаяся в невозможности простого перехода на новые строки из командной строки для отображения многострочных сообщений. С другой стороны, он отображает диалоговое окно за меньшее время, чем любое другое решение, представленное до сих пор.

Конечно, если размер файла не имеет значения, а диалоги создают слишком «пользовательский» интерфейс и / или не требуют взаимодействия с пользователем, я также столкнулся с этим изящным проектом:

https://www.paralint.com/projects/notifu/

Который отображает всплывающую подсказку в области уведомлений о состоянии экрана с помощью IUserNotification . Недостатком является то, что исполняемый файл Notifu работает всего лишь 240 КБ. Еще один прискорбный пример того, что COM создает ненужный раздув и оставляет меня желать, чтобы был простой и легкий API для этой функции.

Для чего-то кроссплатформенного есть zenity. В основном это для Linux, но есть порты Mac и Windows. Размер Windows-порта zenity превышает 1 МБ, потому что GTK довольно раздутый.


Не потому, что он должен доставлять все gtk изнутри, в то время как родные версии Windows просто выбирают библиотеки DLL user32 / comctl, которые уже есть?
user1686 9.0918

А? Пожалуйста, уточните вопрос.
CubicleSoft

1

У меня есть способ сделать это с помощью cmd, но он в основном включает в себя файл, но файл удаляется сразу после выполнения VBS. Так что на самом деле это не так. Ты можешь сделать :

echo x=msgbox("Hey! Here is a message!",Type+Icon+Action,"Hey! Here is a title!") > %tmp%\tmp.vbs
cscript //nologo %tmp%\tmp.vbs
del %tmp%\tmp.vbs

Type + Icon + Action - это просто основные VBS, для справки, здесь. https://therevisionist.org/wp-content/uploads/2016/03/vbscript_msgbox_chart-e1458059002411.jpg?x47750 Код, который я показал вам, создает файл с кодом VBS, затем он исполняется с использованием cscript, затем удаляет файл после его выполнения, чтобы он выглядел так, как будто его вызвал запрос cmd. Чтобы это выглядело больше, просто используйте @echo off. Надеюсь, это помогло!


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.