¿Hay alguna manera de mostrar un cuadro de mensaje desde un archivo por lotes (similar a cómo xmessage
se puede usar desde bash-scripts en Linux)?
¿Hay alguna manera de mostrar un cuadro de mensaje desde un archivo por lotes (similar a cómo xmessage
se puede usar desde bash-scripts en Linux)?
Respuestas:
Haría un archivo VBScript muy simple y lo llamaría usando CScript para analizar los parámetros de la línea de comandos.
Algo como lo siguiente guardado en MessageBox.vbs
:
Set objArgs = WScript.Arguments
messageText = objArgs(0)
MsgBox messageText
Que llamarías como:
cscript MessageBox.vbs "This will be shown in a popup."
MsgBox
referencia si está interesado en seguir esta ruta.
En primer lugar, DOS no tiene nada que ver con eso, probablemente desee una solución de línea de comandos de Windows (de nuevo: no 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
funciona solo en versiones anteriores de Windows:
net send localhost Some message to display
Sin embargo, esto también depende del servicio de Messenger que se ejecute.
Para versiones más recientes (XP y posteriores, aparentemente):
msg "%username%" Some message to display
Cabe señalar que un cuadro de mensaje enviado usando msg.exe
solo durará 60 segundos. Sin embargo, esto puede anularse con el /time:xx
interruptor.
Puede mostrar un poco de flash, pero no se requieren archivos temporales. Debería funcionar desde algún lugar de la era IE5 (IIRC).
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^(^);
)
close() was unexpected at this time
.
^
caracteres de escape en un archivo bat
Esto abrirá otra ventana de símbolo del sistema:
START CMD /C "ECHO My Popup Message && PAUSE"
start cmd /c "@echo off & mode con cols=18 lines=2 & echo My Popup Message & pause>nul"
cambiar cols=18
la cantidad de caracteres en el mensaje + 2. Y el lines=2
a cualquiera que sea la cantidad de líneas es + 1.
cmd /k
Tratar :
Msg * "insert your message here"
Si está utilizando command.com de Windows XP, se abrirá un cuadro de mensaje.
Me parece que abrir una nueva ventana de cmd no es exactamente lo que pedías. También puede usar VBScript , y usar esto con su archivo .bat. Lo abriría desde el archivo bat con este comando:
cd C:\"location of vbscript"
Lo que esto hace es cambiar el directorio command.com buscará archivos, luego en la siguiente línea:
"insert name of your vbscript here".vbs
Luego cree un nuevo documento de Bloc de notas , escriba
<script type="text/vbscript">
MsgBox "your text here"
</script>
Luego lo guardaría 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 haga clic en Guardar!
<script/>
etiqueta.
msg *
se le pedirá que ingrese un mensaje seguido de ctrl-Z. Puede ingresar saltos de línea aquí que aparecerán en su mensaje.
Pocas formas más.
1) El más geek y más hackeado: utiliza IEXPRESS para crear un pequeño ejecutable que creará una ventana emergente con un solo botón ( puede crear dos tipos más de mensajes emergentes ). Funciona en CADA ventana de 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) Utilizando MSHTA
. También funciona en todas las máquinas Windows desde XP y superiores (a pesar de que el OP no quiere lenguajes "externos", el JavaScript aquí está minimizado). Debe 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 .bat/jscript
híbrido parametrizado (debe guardarse como bat
). Nuevamente usa JavaScript a pesar de la solicitud de OP, pero como es un murciélago, 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 jscript.net/.bat
híbrido (debe guardarse como .bat
). Esta vez utiliza .NET
y compila un pequeño .exe
archivo 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 aquí
start "" cmd /c "echo(&echo(&echo Hello world! &echo(&pause>nul"
7 ) Para las notificaciones de la bandeja del sistema, puede intentar esto :
call SystemTrayNotification.bat -tooltip warning -time 3000 -title "Woow" -text "Boom" -icon question
De esta manera, su archivo por lotes creará un script VBS y mostrará una ventana emergente. Después de que se ejecute, el archivo por lotes eliminará ese archivo intermedio.
La ventaja de usar MSGBOX es que es realmente personalizable (cambiar el título, el ícono, etc.) mientras que MSG.exe no lo es tanto.
echo MSGBOX "YOUR MESSAGE" > %temp%\TEMPmessage.vbs
call %temp%\TEMPmessage.vbs
del %temp%\TEMPmessage.vbs /f /q
Aquí hay una variante de PowerShell que no requiere cargar ensamblajes antes de crear la ventana, sin embargo, funciona 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 de "0x0" a un valor a continuación para mostrar iconos en el cuadro de diálogo (consulte Método emergente para obtener más información):
0x10 Detener
0x20 Signo de interrogación
0x30 Signo de exclamación
0x40 Signo de información
Adaptado del artículo de Microsoft TechNet PowerTip: Use PowerShell para mostrar la ventana emergente .
echo X=MsgBox("Message Description",0+16,"Title") >msg.vbs
–Puedes escribir cualquier número de 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 de 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
Mensaje * "inserte su mensaje aquí"
funciona bien, solo guarde como un archivo .bat en el bloc de notas o asegúrese de que el formato esté configurado en "todos los archivos"
msg %SESSIONNAME% msg
msg * /time:0 /w Hello everybody!
Este mensaje espera para siempre hasta que se hace clic en Aceptar (dura solo un minuto de forma predeterminada) y funciona bien en Windows 8.1
msg * /time:0 /w <C:\Somewhere\Message.txt
donde en el archivo hay texto normal (que contiene CrLf's).
Para hacer esto, debe tener un pequeño programa que muestre un cuadro de mensaje y ejecutarlo desde su archivo por lotes.
Sin embargo, puede abrir una ventana de consola que muestre un mensaje, pero no es posible obtener un cuadro de mensaje GUI usando cmd.exe y solo amigos, AFAIK.
Utilizo una utilidad llamada msgbox.exe desde aquí: http://www.paulsadowski.com/WSH/cmdprogs.htm
Siguiendo la respuesta de @ Fowl, puede mejorarlo con un tiempo de espera que solo aparece durante 10 segundos usando lo siguiente:
mshta "javascript:var sh=new ActiveXObject( 'WScript.Shell' ); sh.Popup( 'Message!', 10, 'Title!', 64 );close()"
Ver aquí para más detalles.
Puede invocar la función dll desde user32.dll, creo que algo así
Rundll32.exe user32.dll, MessageBox (0, "text", "titleText", {marcas adicionales para el cuadro de mensaje superior, etc.})
Escribiéndolo desde mi teléfono, no me juzguen ... de lo contrario vincularía las banderas adicionales.
rundll32.exe user32.dll,MessageBoxA X
mostrar un cuadro de mensaje con X como título cuando lo hago en el cuadro Ejecutar. No importa lo que haga X, no puedo hacer que se interprete como múltiples parámetros: todo entra en el título. Entonces rundll32.exe user32.dll,MessageBoxA (0, "MyTitle", "MyText", 0)
muestra un cuadro de mensaje con un título de (0, "MyTitle", "MyText", 0)
Pero no puedo hacer que funcione EN TODO desde la línea de comandos, solo desde el cuadro Ejecutar. En la línea de comando no hace nada en absoluto. ¿Funciona seguro desde una línea de comandos o desde un archivo por lotes o solo desde el cuadro Ejecutar?
msg * /server:127.0.0.1 Escriba su mensaje aquí
where msg
regresa C:\Windows\System32\msg.exe
. Creo que estás pensandonet send
Esta aplicación puede hacer eso si convierte (ajusta) sus archivos por lotes en archivos ejecutables.
Cuadro de mensaje simple
%extd% /messagebox Title Text
Mensaje de error
%extd% /messagebox Error "Error message" 16
Cancelar Intentar nuevamente Cuadro de mensaje
%extd% /messagebox Title "Try again or Cancel" 5
4) Cuadro de mensaje "Nunca más me preguntes"
%extd% /messageboxcheck Title Message 0 {73E8105A-7AD2-4335-B694-94F837A38E79}
Una mejor opción
set my_message=Hello world
&& start cmd /c "@echo off & mode con cols=15 lines=2 & echo %my_message% & pause>nul"
Descripción:
lines=
cantidad de líneas, más 1
cols=
cantidad de caracteres en el mensaje, más 3 (Sin embargo, el mínimo debe ser 15
)
cols
Versión auto calculada :set my_message=Hello world
&& (echo %my_message%>EMPTY_FILE123 && FOR %? IN (EMPTY_FILE123 ) DO SET strlength=%~z? && del EMPTY_FILE123 ) && start cmd /c "@echo off && mode con lines=2 cols=%strlength% && echo %my_message% && pause>nul"
start cmd /c "@echo off & mode con cols=18 lines=2 & echo My Popup Message & pause>nul"
). El tuyo no. Repite el mensaje, pero no puede establecer el tamaño de la ventana que regresa The screen cannot be set to the number of lines and columns specified.
al menos en mi Windows 7.
x
en el directorio actual o no le importe perderlo.
x
, su comando simplemente falla. No me lo agradezcas y solo arregla tu código. Ni siquiera necesita usar una sola línea. Y si cree que su código es tan bueno, publíquelo en Code Review .
Aquí está mi script por lotes que reuní en base a las buenas respuestas aquí y en otras publicaciones
Puede configurar el tiempo de espera del título e incluso dormir para programarlo para esta última & \ n para una nueva línea
Póngale el nombre popup.bat y póngalo en su carpeta de ruta de Windows para trabajar globalmente en su PC
Por ejemplo popup Line 1\nLine 2
, producirá un cuadro emergente de 2 líneas (tipo popup /?
de uso)
Aqui esta el codigo
<!-- : Begin CMD
@echo off
cscript //nologo "%~f0?.wsf" %*
set pop.key=[%errorlevel%]
if %pop.key% == [-1] set pop.key=TimedOut
if %pop.key% == [1] set pop.key=Ok
if %pop.key% == [2] set pop.key=Cancel
if %pop.key% == [3] set pop.key=Abort
if %pop.key% == [4] set pop.key=Retry
if %pop.key% == [5] set pop.key=Ignore
if %pop.key% == [6] set pop.key=Yes
if %pop.key% == [7] set pop.key=No
if %pop.key% == [10] set pop.key=TryAgain
if %pop.key% == [11] set pop.key=Continue
if %pop.key% == [99] set pop.key=NoWait
exit /b
-- End CMD -->
<job><script language="VBScript">
'on error resume next
q =""""
qsq =""" """
Set objArgs = WScript.Arguments
Set objShell= WScript.CreateObject("WScript.Shell")
Popup = 0
Title = "Popup"
Timeout = 0
Mode = 0
Message = ""
Sleep = 0
button = 0
If objArgs.Count = 0 Then
Usage()
ElseIf objArgs(0) = "/?" or Lcase(objArgs(0)) = "-h" or Lcase(objArgs(0)) = "--help" Then
Usage()
End If
noWait = Not wait()
For Each arg in objArgs
If (Mid(arg,1,1) = "/") and (InStr(arg,":") <> 0) Then haveSwitch = True
Next
If not haveSwitch Then
Message=joinParam("woq")
Else
For i = 0 To objArgs.Count-1
If IsSwitch(objArgs(i)) Then
S=split(objArgs(i) , ":" , 2)
select case Lcase(S(0))
case "/m","/message"
Message=S(1)
case "/tt","/title"
Title=S(1)
case "/s","/sleep"
If IsNumeric(S(1)) Then Sleep=S(1)*1000
case "/t","/time"
If IsNumeric(S(1)) Then Timeout=S(1)
case "/b","/button"
select case S(1)
case "oc", "1"
button=1
case "ari","2"
button=2
case "ync","3"
button=3
case "yn", "4"
button=4
case "rc", "5"
button=5
case "ctc","6"
button=6
case Else
button=0
end select
case "/i","/icon"
select case S(1)
case "s","x","stop","16"
Mode=16
case "?","q","question","32"
Mode=32
case "!","w","warning","exclamation","48"
Mode=48
case "i","information","info","64"
Mode=64
case Else
Mode=0
end select
end select
End If
Next
End If
Message = Replace(Message,"/\n", "°" )
Message = Replace(Message,"\n",vbCrLf)
Message = Replace(Message, "°" , "\n")
If noWait Then button=0
Wscript.Sleep(sleep)
Popup = objShell.Popup(Message, Timeout, Title, button + Mode + vbSystemModal)
Wscript.Quit Popup
Function IsSwitch(Val)
IsSwitch = False
If Mid(Val,1,1) = "/" Then
For ii = 3 To 9
If Mid(Val,ii,1) = ":" Then IsSwitch = True
Next
End If
End Function
Function joinParam(quotes)
ReDim ArgArr(objArgs.Count-1)
For i = 0 To objArgs.Count-1
If quotes = "wq" Then
ArgArr(i) = q & objArgs(i) & q
Else
ArgArr(i) = objArgs(i)
End If
Next
joinParam = Join(ArgArr)
End Function
Function wait()
wait=True
If objArgs.Named.Exists("NewProcess") Then
wait=False
Exit Function
ElseIf objArgs.Named.Exists("NW") or objArgs.Named.Exists("NoWait") Then
objShell.Exec q & WScript.FullName & qsq & WScript.ScriptFullName & q & " /NewProcess: " & joinParam("wq")
WScript.Quit 99
End If
End Function
Function Usage()
Wscript.Echo _
vbCrLf&"Usage:" _
&vbCrLf&" popup followed by your message. Example: ""popup First line\nescaped /\n\nSecond line"" " _
&vbCrLf&" To triger a new line use ""\n"" within the msg string [to escape enter ""/"" before ""\n""]" _
&vbCrLf&"" _
&vbCrLf&"Advanced user" _
&vbCrLf&" If any Switch is used then you must use the /m: switch for the message " _
&vbCrLf&" No space allowed between the switch & the value " _
&vbCrLf&" The switches are NOT case sensitive " _
&vbCrLf&"" _
&vbCrLf&" popup [/m:""*""] [/t:*] [/tt:*] [/s:*] [/nw] [/i:*]" _
&vbCrLf&"" _
&vbCrLf&" Switch | value |Description" _
&vbCrLf&" -----------------------------------------------------------------------" _
&vbCrLf&" /m: /message:| ""1 2"" |if the message have spaces you need to quote it " _
&vbCrLf&" | |" _
&vbCrLf&" /t: /time: | nn |Duration of the popup for n seconds " _
&vbCrLf&" | |<Default> untill key pressed" _
&vbCrLf&" | |" _
&vbCrLf&" /tt: /title: | ""A B"" |if the title have spaces you need to quote it " _
&vbCrLf&" | | <Default> Popup" _
&vbCrLf&" | |" _
&vbCrLf&" /s: /sleep: | nn |schedule the popup after n seconds " _
&vbCrLf&" | |" _
&vbCrLf&" /nw /NoWait | |Continue script without the user pressing ok - " _
&vbCrLf&" | | botton option will be defaulted to OK button " _
&vbCrLf&" | |" _
&vbCrLf&" /i: /icon: | ?/q |[question mark]" _
&vbCrLf&" | !/w |[exclamation (warning) mark]" _
&vbCrLf&" | i/info|[information mark]" _
&vbCrLf&" | x/stop|[stop\error mark]" _
&vbCrLf&" | n/none|<Default>" _
&vbCrLf&" | |" _
&vbCrLf&" /b: /button: | o |[OK button] <Default>" _
&vbCrLf&" | oc |[OK and Cancel buttons]" _
&vbCrLf&" | ari |[Abort, Retry, and Ignore buttons]" _
&vbCrLf&" | ync |[Yes, No, and Cancel buttons]" _
&vbCrLf&" | yn |[Yes and No buttons]" _
&vbCrLf&" | rc |[Retry and Cancel buttons]" _
&vbCrLf&" | ctc |[Cancel and Try Again and Continue buttons]" _
&vbCrLf&" ---> | ---> |The output will be saved in variable ""pop.key""" _
&vbCrLf&"" _
&vbCrLf&"Example:" _
&vbCrLf&" popup /tt:""My MessageBox"" /t:5 /m:""Line 1\nLine 2\n/\n\nLine 4""" _
&vbCrLf&"" _
&vbCrLf&" v1.9 By RDR @ 2020"
Wscript.Quit
End Function
</script></job>
solo necesita aparecer cuando está dentro de una máquina virtual, 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