¿Cómo se pueden crear mensajes emergentes en un script por lotes?

Necesito saber cómo hacer mensajes emergentes en scripts por lotes sin usar VBScript o KiXtart o cualquier otro lenguaje de progtwigción / scripting externo. No tengo ninguna pista sobre esto … ni siquiera tenía un punto de partida. Soy consciente de NET SEND pero el servicio de Messenger está desactivado en mi entorno actual.

Con respecto a la respuesta de LittleBobbyTable: NET SEND no funciona en Vista o Windows 7. Ha sido reemplazado por MSG.EXE

Existe una solución bruta que funciona en todas las versiones de Windows: un mensaje emergente en bruto puede enviarse STARTING una nueva ventana de cmd.exe que se cierra una vez que se presiona una tecla.

 start "" cmd /c "echo Hello world!&echo(&pause" 

Si desea que la secuencia de comandos se detenga hasta que se desestime el cuadro de mensaje, puede agregar la opción / WAIT.

 start "" /wait cmd /c "echo Hello world!&echo(&pause" 
 msg * "Enter Your Message" 

¿Esto ayuda?

Puede aprovechar CSCRIPT.EXE o WSCRIPT.EXE (que han estado presentes en todas las versiones de Windows desde, creo, Windows 95) de esta manera:

 echo msgbox "Hey! Here is a message!" > %tmp%\tmp.vbs cscript /nologo %tmp%\tmp.vbs del %tmp%\tmp.vbs 

o

 echo msgbox "Hey! Here is a message!" > %tmp%\tmp.vbs wscript %tmp%\tmp.vbs del %tmp%\tmp.vbs 

También puede elegir el comando PopUp más personalizable. Este ejemplo le da una ventana de 10 segundos para hacer clic en Aceptar, antes de que se agote el tiempo de espera:

 echo set WshShell = WScript.CreateObject("WScript.Shell") > %tmp%\tmp.vbs echo WScript.Quit (WshShell.Popup( "You have 10 seconds to Click 'OK'." ,10 ,"Click OK", 0)) >> %tmp%\tmp.vbs cscript /nologo %tmp%\tmp.vbs if %errorlevel%==1 ( echo You Clicked OK ) else ( echo The Message timed out. ) del %tmp%\tmp.vbs 

En su contexto anterior, tanto cscript como wscript actuarán de la misma manera. Cuando se wscript desde un archivo por lotes, bot cscript y wscript el archivo por lotes hasta que finalicen su script, luego permitirán que el archivo continúe.

Cuando se llama manualmente desde el símbolo del sistema, cscript no devolverá el control al símbolo del sistema hasta que finalice, mientras que wscript creará un hilo seprate para la ejecución de su script, devolviendo el control al símbolo del sistema incluso antes de que el script haya finalizado.

Otros métodos discutidos en este hilo no hacen que la ejecución de los archivos por lotes se pause mientras se espera que se haga clic en el mensaje. Su selección será dictada por sus necesidades.

Nota: Al usar este método, hay varias configuraciones de botones e íconos disponibles para cubrir varias consultas de sí / no / cancelar / abortar / reintentar al usuario: https://technet.microsoft.com/en-us/library/ee156593.aspx

enter image description here

Pocas formas más (en todas ellas, la secuencia de comandos espera que se presione el botón a diferencia de msg.exe ).

1) El más geek y hackiest: usa IEXPRESS para crear un pequeño exe que creará una ventana emergente con un solo botón ( puede crear dos tipos más de mensajes emergentes ). Works en TODAS las ventanas desde XP y superior:

 ;@echo off ;setlocal ;set ppopup_executable=popupe.exe ;set "message2=click OK to continue" ; ;del /q /f %tmp%\yes >nul 2>&1 ; ;copy /y "%~f0" "%temp%\popup.sed" >nul 2>&1 ;(echo(FinishMessage=%message2%)>>"%temp%\popup.sed"; ;(echo(TargetName=%cd%\%ppopup_executable%)>>"%temp%\popup.sed"; ;(echo(FriendlyName=%message1_title%)>>"%temp%\popup.sed" ; ;iexpress /n /q /m %temp%\popup.sed ;%ppopup_executable% ;rem del /q /f %ppopup_executable% >nul 2>&1 ;pause ;endlocal ;exit /b 0 [Version] Class=IEXPRESS SEDVersion=3 [Options] PackagePurpose=InstallApp ShowInstallProgramWindow=1 HideExtractAnimation=1 UseLongFileName=0 InsideCompressed=0 CAB_FixedSize=0 CAB_ResvCodeSigning=0 RebootMode=N InstallPrompt=%InstallPrompt% DisplayLicense=%DisplayLicense% FinishMessage=%FinishMessage% TargetName=%TargetName% FriendlyName=%FriendlyName% AppLaunched=%AppLaunched% PostInstallCmd=%PostInstallCmd% AdminQuietInstCmd=%AdminQuietInstCmd% UserQuietInstCmd=%UserQuietInstCmd% SourceFiles=SourceFiles [SourceFiles] SourceFiles0=C:\Windows\System32\ [SourceFiles0] %FILE0%= [Strings] AppLaunched=subst.exe PostInstallCmd= AdminQuietInstCmd= UserQuietInstCmd= FILE0="subst.exe" DisplayLicense= InstallPrompt= 

2) Usando MSHTA . También funciona en todas las máquinas Windows desde XP y superior (a pesar de que OP no quiere idiomas “externos”, el jsvascript aquí está minimizado). Debería guardarse como .bat :

 @if (true == false) @end /*! @echo off mshta "about:" %* goto :EOF */ alert("Hello, world!"); 

o en una línea:

 mshta "about:" 

o

 mshta "javascript:alert('message');close()" 

o

 mshta.exe vbscript:Execute("msgbox ""message"",0,""title"":close") 

3) Aquí está el híbrido parametrizado .bat/jscript (debe guardarse como un bat ). De nuevo usa jscript a pesar de la solicitud OP pero como es un murciélago, puede llamarse como un archivo bat sin preocupaciones. Utiliza POPUP que permite un poco más control que los más populares MSGBOX . Utiliza WSH, pero no MSHTA como en el ejemplo anterior.

  @if (@x)==(@y) @end /***** jscript comment ****** @echo off cscript //E:JScript //nologo "%~f0" "%~nx0" %* exit /b 0 @if (@x)==(@y) @end ****** end comment *********/ var wshShell = WScript.CreateObject("WScript.Shell"); var args=WScript.Arguments; var title=args.Item(0); var timeout=-1; var pressed_message="button pressed"; var timeout_message="timedout"; var message=""; function printHelp() { WScript.Echo(title + "[-title Title] [-timeout m] [-tom \"Time-out message\"] [-pbm \"Pressed button message\"] [-message \"pop-up message\"]"); } if (WScript.Arguments.Length==1){ runPopup(); WScript.Quit(0); } if (args.Item(1).toLowerCase() == "-help" || args.Item(1).toLowerCase() == "-h" ) { printHelp(); WScript.Quit(0); } if (WScript.Arguments.Length % 2 == 0 ) { WScript.Echo("Illegal arguments "); printHelp(); WScript.Quit(1); } for (var arg = 1 ; arg 

4) y un híbrido jscript.net/.bat (debe guardarse como .bat ). Esta vez usa .NET y comstack un pequeño archivo .exe que podría eliminarse:

 @if (@X)==(@Y) @end /****** silent jscript comment ****** @echo off :::::::::::::::::::::::::::::::::::: ::: compile the script :::: :::::::::::::::::::::::::::::::::::: setlocal ::if exist "%~n0.exe" goto :skip_comstacktion :: searching the latest installed .net framework for /f "tokens=* delims=" %%v in ('dir /b /s /a:d /o:-n "%SystemRoot%\Microsoft.NET\Framework\v*"') do ( if exist "%%v\jsc.exe" ( rem :: the javascript.net compiler set "jsc=%%~dpsnfxv\jsc.exe" goto :break_loop ) ) echo jsc.exe not found && exit /b 0 :break_loop call %jsc% /nologo /out:"%~n0.exe" "%~f0" :::::::::::::::::::::::::::::::::::: ::: end of comstacktion :::: :::::::::::::::::::::::::::::::::::: :skip_comstacktion :: :::::::::: "%~n0.exe" %* :::::::: :: endlocal exit /b 0 ****** end of jscript comment ******/ import System; import System.WIndows; import System.Windows.Forms var arguments:String[] = Environment.GetCommandLineArgs(); MessageBox.Show(arguments[1],arguments[0]); 

5) y al final una sola llamada a powershell que crea una ventana emergente (se puede llamar desde la línea de comandos o desde un lote si está instalado powershell):

 powershell [Reflection.Assembly]::LoadWithPartialName("""System.Windows.Forms""");[Windows.Forms.MessageBox]::show("""Hello World""", """My PopUp Message Box""") 

6) Aunque la solución msg ya está publicada como respuesta, esta es una mejor manera de usarla:

 msg * /self /w "hello world" 

/self es un modificador no documentado que forzará a msg a enviar el mensaje solo al usuario actual.

msg * Hola mundo

funciona para mi..

Su mejor opción es usar NET SEND como está documentado en el sitio de Rob van der Woude .

De lo contrario, deberá usar un progtwig de scripting externo. Los archivos por lotes realmente están destinados a enviar mensajes a través de ECHO .

Esto es muy simple porque he creado un par de líneas de código que harán esto por ti

Así que establece una variable como msg y luego usa este código. aparece en un cuadro de mensaje de VBS.

CÓDIGO:

 @echo off echo %msg% >vbs.txt copy vbs.txt vbs.vbs del vbs.txt start vbs.vbs timeout /t 1 del vbs.vbs cls 

Esto es solo algo que se me ocurrió, debería funcionar para la mayoría de sus necesidades de mensajes y también funciona con Spaces a diferencia de algunos scripts por lotes

Es fácil hacer un mensaje, así es cómo:

Primero abra el teclado y escriba:

 msg "Message",0,"Title" 

y guardarlo como Message.vbs.

Ahora en su tipo de archivo por lotes:

 Message.vbs %* 

msg * message goes here

Ese método es muy simple y fácil, y debería funcionar en cualquier archivo por lotes, creo. El único “inconveniente” de este método es que solo puede mostrar 1 mensaje a la vez, si hay más de un mensaje, se mostrará uno detrás de otro dependiendo del orden en que los coloque dentro del código. También asegúrese de que haya un operador repetitivo o en bucle diferente en su archivo de proceso por lotes o se cerrará automáticamente y solo aparecerá este mensaje. Si necesita un operador de bucle de fondo “silencioso”, aquí hay uno:

pause >nul

Eso debería mantenerlo en funcionamiento, pero luego se cerrará después de presionar un botón.

También para mantener todos los comandos “en silencio” cuando se ejecuta, para que solo se ejecuten y no muestren que se escribieron en el archivo, simplemente coloque la siguiente línea al principio del archivo por lotes:

@echo off

¡Espero que todos estos consejos hayan sido útiles!

 @echo off title message echo what's the password? set/p "pass=>" if not %pass% == password goto fail msg *correct: Correct password!!! goto end :fail msg *wrong: Wrong password!!! :end