comando - Mostrar un cuadro emergente/mensaje de un archivo por lotes de Windows
comando msg windows 7 (20)
¿Hay alguna manera de mostrar un cuadro de mensaje desde un archivo por lotes (similar a cómo se puede usar xmessage
desde bash-scripts en Linux)?
Aquí hay una variante de PowerShell que no requiere cargar ensamblajes antes de crear la ventana, sin embargo se ejecuta notablemente más lento (~ + 50%) que el comando PowerShell MessageBox publicado aquí por @npocmaka:
powershell (New-Object -ComObject Wscript.Shell).Popup("""Operation Completed""",0,"""Done""",0x0)
Puede cambiar el último parámetro "0x0" para mostrar diferentes iconos en el cuadro de diálogo, ej. 0x40 muestra una "marca de información". Vea el método emergente para referencia.
Adaptado del artículo de Microsoft TechNet PowerTip: use PowerShell para mostrar la ventana emergente .
De esta manera, su archivo por lotes creará un script VBS y mostrará una ventana emergente. Después de ejecutarse, el archivo por lotes eliminará ese archivo intermedio.
La ventaja de utilizar MSGBOX es que es realmente compatible (cambie el título, el icono, etc.) mientras que MSG.exe no es tanto.
echo MSGBOX "YOUR MESSAGE" > %temp%/TEMPmessage.vbs
call %temp%/TEMPmessage.vbs
del %temp%/TEMPmessage.vbs /f /q
En primer lugar, DOS no tiene nada que ver con eso, es probable que desee una solución de línea de comandos de Windows (nuevamente: sin DOS, Windows puro, simplemente no una ventana, sino una consola).
Puede usar el método VBScript proporcionado por boflynn o puede usar mal net send
o msg
. net send
solo funciona en versiones anteriores de Windows:
net send localhost Some message to display
Sin embargo, esto también depende del servicio de Messenger para ejecutarse.
Para versiones más nuevas (XP y posteriores, aparentemente):
msg "%username%" Some message to display
Se debe tener en cuenta que un cuadro de mensaje enviado con msg.exe
solo durará 60 segundos. Sin embargo, esto puede anularse con el modificador /time:xx
.
Esta application puede hacer eso, si convierte (envuelve) sus archivos por lotes en archivos ejecutables.
Simple Messagebox
%extd% /messagebox Title Text
Mensaje de error
%extd% /messagebox Error "Error message" 16
Cancelar Try Again Messagebox
%extd% /messagebox Title "Try again or Cancel" 5
4) "Nunca me preguntes otra vez" Messagebox
%extd% /messageboxcheck Title Message 0 {73E8105A-7AD2-4335-B694-94F837A38E79}
Esto abrirá otra ventana del Símbolo del sistema:
START CMD /C "ECHO My Popup Message && PAUSE"
Haría un archivo VBScript muy simple y lo llamaría usando CScript para analizar los parámetros de la línea de comando.
Algo como lo siguiente guardado en MessageBox.vbs
:
Set objArgs = WScript.Arguments
messageText = objArgs(0)
MsgBox messageText
Cual llamarías como:
cscript MessageBox.vbs "This will be shown in a popup."
Referencia de MsgBox
si estás interesado en seguir esta ruta.
Msg * "inserta tu mensaje aquí"
funciona bien, simplemente guarde como un archivo .bat en el bloc de notas o asegúrese de que el formato esté configurado en "todos los archivos"
Para hacer esto, necesita tener un pequeño programa que muestre un cuadro de mensaje y lo ejecute desde su archivo por lotes.
Sin embargo, podría abrir una ventana de consola que muestre un mensaje, pero no es posible obtener un cuadro de mensaje GUI usando cmd.exe y sus amigos, AFAIK.
Pocas maneras más.
1) Más geek y hackiest: usa IEXPRESS para crear un pequeño exe que creará un pop-up con un solo botón ( puede crear dos tipos más de mensajes emergentes ). Funciona 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=<None>
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 JavaScript aquí está minimizado). Debería guardarse como .bat
:
@if (true == false) @end /*!
@echo off
mshta "about:<script src=''file://%~f0''></script><script>close()</script>" %*
goto :EOF */
alert("Hello, world!");
o en una línea:
mshta "about:<script>alert(''Hello, world!'');close()</script>"
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 bat
). Nuevamente usa JavaScript a pesar de la solicitud OP, pero como es un bate, puede llamarse como un archivo bat sin preocupaciones. Utiliza POPUP que permite un poco más de control que el MSGBOX más popular. 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="timed out";
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<args.Length;arg=arg+2) {
if (args.Item(arg).toLowerCase() == "-title") {
title = args.Item(arg+1);
}
if (args.Item(arg).toLowerCase() == "-timeout") {
timeout = parseInt(args.Item(arg+1));
if (isNaN(timeout)) {
timeout=-1;
}
}
if (args.Item(arg).toLowerCase() == "-tom") {
timeout_message = args.Item(arg+1);
}
if (args.Item(arg).toLowerCase() == "-pbm") {
pressed_message = args.Item(arg+1);
}
if (args.Item(arg).toLowerCase() == "-message") {
message = args.Item(arg+1);
}
}
function runPopup(){
var btn = wshShell.Popup(message, timeout, title, 0x0 + 0x10);
switch(btn) {
// button pressed.
case 1:
WScript.Echo(pressed_message);
break;
// Timed out.
case -1:
WScript.Echo(timeout_message);
break;
}
}
runPopup();
4) y un híbrido jscript.net/.bat
(debe guardarse como .bat
). Esta vez usa .NET
y compila 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_compilation
:: 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 compilation ::::
::::::::::::::::::::::::::::::::::::
:skip_compilation
::
::::::::::
"%~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) Y el enfoque de dbenham visto here
start "" cmd /c "echo(&echo(&echo Hello world! &echo(&pause>nul"
Podría mostrar un pequeño flash, pero no se requieren archivos temporales. Debería funcionar todo el camino de regreso a algún lugar en la era (IIRC) IE5.
mshta javascript:alert("Message/n/nMultiple/nLines/ntoo!");close();
No olvides escapar de tus paréntesis si estás usando if
:
if 1 == 1 (
mshta javascript:alert^("1 is equal to 1, amazing."^);close^(^);
)
Puede invocar la función dll desde user32.dll, creo que algo así como
Rundll32.exe user32.dll, MessageBox (0, "text", "titleText", {flags adicionales para me gusta topbox, etc.})
Escribiéndolo desde mi teléfono, no me juzgues ... de lo contrario uniría las banderas adicionales.
SOLO necesita emergente cuando está dentro de una vm, por lo que, técnicamente, debería haber algún código como:
if %machine_type% == virtual_machine then
echo message box code
else
continue normal installation code
Siguiendo la respuesta de @ Fowl, puedes mejorarlo con un tiempo de espera para que solo aparezca durante 10 segundos usando lo siguiente:
mshta "javascript:var sh=new ActiveXObject( ''WScript.Shell'' ); sh.Popup( ''Message!'', 10, ''Title!'', 64 );close()"
Mira here para más detalles.
Tratar :
Msg * "insert your message here"
Si está utilizando command.com de Windows XP, se abrirá un cuadro de mensaje.
Creo que abrir una nueva ventana de cmd no es exactamente lo que estaba pidiendo. También puede usar VBScript y usar esto con su archivo .bat. Lo abrirías desde el archivo bat con este comando:
cd C:/"location of vbscript"
Lo que hace es cambiar el directorio desde el cual command.com buscará los archivos, luego en la siguiente línea:
"insert name of your vbscript here".vbs
Luego, crea un nuevo documento de Notepad , escriba
<script type="text/vbscript">
MsgBox "your text here"
</script>
A continuación, guarde esto como un archivo .vbs (colocando ".vbs" al final del nombre del archivo), guárdelo como "Todos los archivos" en el cuadro desplegable debajo del nombre del archivo (para que no se guarde como .txt ), luego haz clic en Guardar!
Utilizo una utilidad llamada msgbox.exe desde aquí: http://www.paulsadowski.com/WSH/cmdprogs.htm
msg * /server:127.0.0.1 Escriba su mensaje aquí
Una mejor opción
start cmd /c "@echo off & mode con cols=12 lines=2 & echo My Message & pause>nul"
USO
cols=
cantidad de caracteres en el mensaje, más 2
lines=
cantidad de líneas, más 1
(Gracias a @ender_scythe )
echo X=MsgBox("Message Description",0+16,"Title") >msg.vbs
-puede escribir cualquier número entre 0,1,2,3,4 en lugar de 0 (antes del símbolo ''+'') y aquí está el significado de cada número:
0 = Ok Button
1 = Ok/Cancel Button
2 = Abort/Retry/Ignore button
3 = Yes/No/Cancel
4 = Yes/No
-puedes escribir cualquier número entre 16,32,48,64 en lugar de 16 (después del símbolo ''+'') y aquí está el significado de cada número:
16 – Critical Icon
32 – Warning Icon
48 – Warning Message Icon
64 – Information Icon
msg * /time:0 /w Hello everybody!
Este mensaje espera hasta que se haga clic en Aceptar (solo dura un minuto por defecto) y funciona bien en Windows 8.1