Cómo mostrar un Msgbox directamente desde CMD

16

Me gustaría mostrar un mensaje al usuario utilizando CMD. La forma en que sé hacerlo es creando un archivo .vbs (VBScript) y ejecutándolo desde CMD de esta manera:

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

start File.vbs

Pero lo que quiero hacer es mostrar el mensaje sin crear ningún archivo, directamente desde CMD. Quizás utilizando un comando para ejecutar VBScripts directamente desde CMD.

Bita
fuente
Busca el msgcomando. Es posible que no lo tenga si está ejecutando una edición Home de Windows, pero puede agregarlo simplemente copiando y pegando msg.exe desde una instalación Pro.
wysiwyg
Me gustaría algo un poco más "universal", para todas las versiones de Windows 10 si hay alguna manera.
Bita
Siempre hay PowerShell también. Oft pasó por alto, a pesar de que Microsoft ha comenzado claramente la transición a la eliminación de cmd prompt.
Appleoddity

Respuestas:

9

Como otros han dicho, no hay forma de hacer esto solo con cmd, pero aunque ese es el título de la pregunta, me parece que la parte sin archivo es más importante para usted y, en ciertas circunstancias, esto podría ser posible.

Con powershell, debería ser posible ejecutar código sin ningún archivo como este:

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

VBS no permite la ejecución directa de código a través de cscript o wscript, pero mshta sí. Puede usarlo así (si necesita varias líneas, use ':' como delimitador):

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

Como está basado, es posible que se vea afectado por algunas restricciones de gpo, por lo que si tiene la opción, PowerShell es probablemente la apuesta más segura

Syberdoor
fuente
Además de la advertencia anterior mshta, algunos programas antivirus lo consideran un proceso potencialmente no deseado. En el trabajo, mi intento de ejecutarlo resultó en un producto empresarial demasiado entusiasta (SentinelOne) para poner en cuarentena toda mi máquina y eliminarla de la red.
Jason
15

Como lo sugiere @wysiwyg, en las versiones Pro / Business * de Windows está buscando el Msgcomando. Está disponible en todas las versiones modernas de Windows (al menos desde XP). Para mostrar un mensaje al usuario actualmente conectado, ejecute lo siguiente:

msg %username% Your message here

El resultado se ve así: ingrese la descripción de la imagen aquí

Una consideración con este comando es que no puede personalizar el texto de la barra de título.

Puede obtener más información sobre Msg en TechNet .


* Si necesita una solución que funcione en todas las ediciones de Windows, incluida Home , en mi opinión, el método VBScript que ya conoce es la solución más simple para este problema. Funciona en todas las versiones y ediciones modernas de Windows en su configuración predeterminada, y es fácil de usar.

Yo digo reinstalar a Mónica
fuente
1
No del todo cierto. Había un comando de cuadro de mensaje dps desde que salieron las ventanas. Creo que se eliminó en Windows 7 u 8, ya que fue visto como un posible exploit.
Keltari
2

Necesitaba algo similar a esto hoy. Como no pude encontrar una solución de dependencia externa que me gustó ya que realmente no soy fanático de VBScript / Powershell, seguí adelante y escribí una:

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

Los cuadros de mensaje que produce son modales a la ventana de consola actual. Es decir, el usuario no puede hacer nada hasta que cierre el diálogo. Además, el código de retorno de la MessageBox()llamada se devuelve a la persona que llama para que un script pueda reaccionar a cualquier botón que se haya presionado. Y, por supuesto, es compatible con la gama completa de opciones para la MessageBox()API Win32.

Agregar un ejecutable de 80 KB a la mezcla podría no ser la taza de té de todos. Sin embargo, está estáticamente vinculado con el tiempo de ejecución de VC ++ y es compatible con Unicode, lo que explica por qué el archivo es tan grande dada la naturaleza minimalista de lo que hace. Y hay un problema menor de no poder pasar fácilmente nuevas líneas desde la línea de comandos para mostrar mensajes de varias líneas. Por otro lado, muestra el diálogo en menos tiempo de reloj de pared que cualquiera de las otras soluciones presentadas hasta ahora.

Por supuesto, si el tamaño del archivo no importa y los cuadros de diálogo crean una experiencia de usuario demasiado "directa" y / o no requieren la interacción del usuario, también me encontré con este ingenioso proyecto:

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

Que muestra un globo emergente en el área de notificación de estado de la pantalla usando IUserNotification . La desventaja es que el ejecutable de Notifu corre apenas 240KB. Otro ejemplo desafortunado de que COM crea una hinchazón innecesaria y me hace desear que haya una API simple y liviana para la función.

Para algo multiplataforma, hay zenity. Es principalmente para Linux, pero también hay puertos para Mac y Windows. El puerto zenity de Windows tiene un tamaño superior a 1 MB porque, bueno, GTK está bastante hinchado.

CubículoSoft
fuente
¿No porque tiene que enviar todos los gtk internamente mientras que las versiones nativas de Windows solo recogen las DLL de user32 / comctl que ya están allí?
user1686
¿Eh? Por favor aclare la pregunta.
CubicleSoft
1

Tengo una manera de hacer esto con cmd, pero básicamente incluye un archivo, pero el archivo se elimina instantáneamente después de que se ejecuta el vbs. Entonces no es realmente. Tu puedes hacer :

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 es solo vbs básico, como referencia, aquí. https://therevisionist.org/wp-content/uploads/2016/03/vbscript_msgbox_chart-e1458059002411.jpg?x47750 El código que le mostré hace un archivo que tiene código VBS, luego lo ejecuta usando cscript, luego elimina el archivo después de que se ejecute, haciendo que parezca que ha sido convocado por el indicador cmd. Para que se vea así más, simplemente use @echo off. Espero que esto haya ayudado!

Zer0Byt3
fuente