Mostrar un cuadro emergente / mensaje de un archivo por lotes de Windows

153

¿Hay alguna manera de mostrar un cuadro de mensaje desde un archivo por lotes (similar a cómo xmessagese puede usar desde bash-scripts en Linux)?

billyy
fuente
CMD.EXE, es un procesador de comandos de 32 bits que admite comandos de DOS.
Alan B
77
Se llama Símbolo del sistema de Windows.
Ricardo Polo Jaramillo

Respuestas:

121

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."

MsgBoxreferencia si está interesado en seguir esta ruta.

boflynn
fuente
gracias por hacerlo, crearé un archivo, escribiré estos datos y luego lo usaré, luego lo borraré. debería funcionar bien :)
billyy
1
Gran respuesta. De esta manera, puede tener un control total sobre los iconos, botones y título del cuadro. Además, cuando guarda su archivo en algún lugar a lo largo de PATH, lo llama desde cualquier ubicación. Creé algunos archivos para alertas con diferentes íconos.
Deus777
Agradable. Por cierto, no necesita usar CScript, al menos en Win10. Con CScript, obtengo texto adicional en el símbolo del sistema. Sin CScript, solo está la alerta, lo cual es genial
un niño de Dios el
No tenía cscript. Solía ​​empezar en su lugar.
sureshvv
127

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 sendo msg. net sendfunciona 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.exesolo durará 60 segundos. Sin embargo, esto puede anularse con el /time:xxinterruptor.

Joey
fuente
2
Puede usar variables env para obtener el usuario local -% USERNAME%. msg.exe está en mi máquina XP Home, pero he escuchado cuentas anecdóticas de que no está en todas las versiones de Vista. Creo que el servicio detrás de NET SEND está deshabilitado en estos días.
McDowell el
Bien, gracias, olvidé el envvar (rara vez uso algo más allá de% UserProfile% y mis propios definidos en lotes :)). Sin embargo, es curioso que tengas razón sobre el servicio Messenger. Ni siquiera existe en mi VM XP, pero el envío neto todavía existe. Sin embargo, msg.exe funciona allí.
Joey el
18
Pensé que faltaba una opción viable en las respuestas y la proporcioné. No pasa nada aquí. Tampoco necesitas sentirte obligado a hacer algo ni estoy diciendo de alguna manera que Boflynn está mal. Solo estaba agregando otra opción que debería estar perfectamente bien para preguntas que no tienen una sola respuesta definitiva. Además, probablemente no sea el único con esta pregunta y es posible que otros no quieran usar VBScript por cualquier motivo. Este es un sitio de la comunidad, no únicamente el suyo :-)
Joey
8
Yo mismo usé esto para generar un mensaje de "Te amo" en la PC de mi novia desde un shell remoto.
Camilo Martin
1
En Windows 8 y 10, he encontrado que la versión de Windows es importante. Para mí funciona en pro pero no en casa. Otros han informado que funciona en Home Premium y Enterprise, Ultimate, etc. Parece que el viejo hogar no lo entiende (no existe en System32, pero se puede agregar).
shox
84

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^(^);
)
Ave
fuente
Esto funciona perfectamente desde el símbolo del sistema, pero cuando lo pego en un archivo por lotes, me sale este error: close() was unexpected at this time.
eye_mew
@eye_mew tal vez necesites eliminar esos ^caracteres de escape en un archivo bat
phuclv
1
Me funcionó perfectamente desde un archivo por lotes (estoy en Windows 7) ¿Podemos ejecutar cualquier Javascript de esta manera? ¿Cómo devolveríamos valores al archivo por lotes?
Jerry Jeremiah
1
Aquí hay algunos ejemplos sorprendentes de cosas que puede hacer: dostips.com/forum/viewtopic.php?t=5311 El ejemplo LocalDateTime devuelve un valor. Gracias por la idea!
Jerry Jeremiah
Genial node.js de Microsoft antes del servidor JavaScript era genial, una oportunidad perdida para ellos.
Daniel Sokolowski el
76

Esto abrirá otra ventana de símbolo del sistema:

START CMD /C "ECHO My Popup Message && PAUSE"
Dave Webb
fuente
1
Ty impresionante! podría usar esto en algunos otros scripts :)
billyy
3
Una mejor opción sería: start cmd /c "@echo off & mode con cols=18 lines=2 & echo My Popup Message & pause>nul"cambiar cols=18la cantidad de caracteres en el mensaje + 2. Y el lines=2a cualquiera que sea la cantidad de líneas es + 1.
ender_scythe
1
deshacerse de la PAUSA y usarcmd /k
Artelius
34

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!

Unihedron
fuente
3
No necesitas la <script/>etiqueta.
surfasb
? cómo insertar una nueva línea (líneas en blanco) en el texto cuando se utiliza -> MSG * <texto>
ZEE
@ZEE Si usa solo, 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.
Usuario5910
30

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/jscripthí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/.bathíbrido (debe guardarse como .bat). Esta vez utiliza .NETy compila un pequeño .exearchivo 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
npocmaka
fuente
29

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
dc1
fuente
15

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):

        Detener0x10 Detener
        Signo de interrogación0x20 Signo de interrogación
        Signo de exclamación0x30 Signo de exclamación
        Marca informativa0x40 Signo de información

Adaptado del artículo de Microsoft TechNet PowerTip: Use PowerShell para mostrar la ventana emergente .

Usuario5910
fuente
10
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  
p2013
fuente
2
¿Cómo se obtiene una respuesta del script VB?
Suit Boy Apps
7

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"

Max Runacres
fuente
Los documentos dicen que "*" "enviará un mensaje a todas las sesiones en el servidor especificado", es decir. interrumpirá los servicios de terminal o el cambio rápido de usuario
Fowl
2
podrías usarmsg %SESSIONNAME% msg
Fowl
5
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

MoE bis
fuente
La misma respuesta está presente desde 2009
jeb
¡Vaya! _ _ <Por favor, elimínelo :)
MoE bis
? cómo insertar una nueva línea (líneas en blanco) en el texto
ZEE
3
msg * /time:0 /w <C:\Somewhere\Message.txtdonde en el archivo hay texto normal (que contiene CrLf's).
MoE bis
4

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.

Macke
fuente
un aviso podría hacerlo ... ¿tiene más información al respecto?
billyy
1
echo "xx", pausa o set / p var = prompt son opciones cmd.exe
Macke
@ nickl-: mejor de esta manera?
Macke
3

Utilizo una utilidad llamada msgbox.exe desde aquí: http://www.paulsadowski.com/WSH/cmdprogs.htm

Zhongshu
fuente
Según el antivirus de Symantec, este archivo contiene un troyano.
David
3
@David: he tenido archivos de lotes y de texto marcados como hostiles por los antivirus. De hecho, el antivirus AVG detectó una instrucción de línea de comandos y afirmó que era un virus.
James K
2
FWIW Virus Total dice que 11/51 los verificadores de virus detectan virus en ese archivo: virustotal.com/en/file/…
Matthew Lock
3

Puedes usar Zenity . Zenity permite la ejecución de cuadros de diálogo en scripts de línea de comandos y shell. También se puede encontrar más información en Wikipedia .

Es multiplataforma: aquí se puede encontrar un instalador de Windows para Windows .

parvus
fuente
3

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.

Rafi
fuente
Detectado como virus xD
Julien
2

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.

Entropía
fuente
Puedo rundll32.exe user32.dll,MessageBoxA Xmostrar 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?
Jerry Jeremiah
rundll32.exe según el documento solo puede ejecutar aquellos procedimientos diseñados específicamente para este propósito, ya que deben analizar la parte de "argumentos opcionales". Las funciones de MessageBox-ish no se diseñaron de esta manera. ¿Por qué funciona a través de Win + R (cuadro Ejecutar), sigue siendo una gran pregunta!
Yuriy Pozniak
1

msg * /server:127.0.0.1 Escriba su mensaje aquí

Franco
fuente
Windows cmd.exe dice: 'msg' no se reconoce como un comando interno o externo, un programa operable o un archivo por lotes.
Anthony Hatzopoulos
@AnthonyHatzopoulos eso se debe a que solo es compatible con XP
pattyd
@pattyd XP y más tarde, en realidad
Jesan Fafon
@JesanFafon no, fue descontinuado después de XP ... Creo que te refieres a XP y anteriores
pattyd
@pattyd En Windows 8.1, where msgregresa C:\Windows\System32\msg.exe. Creo que estás pensandonet send
Jesan Fafon
1

Esta aplicación puede hacer eso si convierte (ajusta) sus archivos por lotes en archivos ejecutables.


  1. Cuadro de mensaje simple

    %extd% /messagebox Title Text
    

  1. Mensaje de error

    %extd% /messagebox  Error "Error message" 16
    
  2. 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}
alguien23432
fuente
0

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)

colsVersió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"

T.Todua
fuente
@ender_scythe funciona el comentario ( 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.
cdlvcdlv
@cdlvcdlv He actualizado la respuesta. debería funcionar ahora para todos, revíselo.
T.Todua
Funciona de hecho ... siempre que no haya un archivo nombrado xen el directorio actual o no le importe perderlo.
cdlvcdlv
Hiciste un comentario perfectamente funcional y lo rompiste. Luego trataste de agregar algo de valor (te lo concederé) pero luego al precio de perder cualquier archivo con un nombre no tan improbable. Si alguien (por curiosidad) prueba su código con tan mala suerte, perderá el archivo para siempre. Además, si existe una carpeta llamada 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 .
cdlvcdlv
qué ingratitud ... No me he roto, pero actualicé, expliqué e incluso di una solución automática ... (pero hay personas como tú, que no puedo satisfacer). buena suerte
T.Todua
0

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>
RDR
fuente
-3

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
Alien ilegal
fuente
voto negativo porque la instalación no continuará si (% machine_type% == virtual_machine) == true
anion