Mostrar uma caixa de pop-up / mensagem de um arquivo em lotes do Windows

153

Existe uma maneira de exibir uma caixa de mensagem de um arquivo em lotes (semelhante a como xmessagepode ser usado a partir de scripts bash no Linux)?

billyy
fonte
CMD.EXE, é um processador de comandos de 32 bits que suporta comandos DOS.
Alan B
7
Chama-se prompt de comando do Windows.
Ricardo Polo Jaramillo

Respostas:

121

Eu criaria um arquivo VBScript muito simples e o chamaria usando CScript para analisar os parâmetros da linha de comando.

Algo como o seguinte foi salvo em MessageBox.vbs:

Set objArgs = WScript.Arguments
messageText = objArgs(0)
MsgBox messageText

Você chamaria assim:

cscript MessageBox.vbs "This will be shown in a popup."

MsgBoxreferência se você estiver interessado em seguir esta rota.

boflynn
fonte
graças a isso, criarei um arquivo para gravar esses dados e, em seguida, usá-los, para excluí-los. deve funcionar bem :)
billyy
1
Ótima resposta. Dessa forma, você pode ter controle total sobre os ícones, botões e título da caixa. Além disso, quando você salva seu arquivo em algum lugar ao longo do PATH, você o chama de qualquer local. Criei alguns arquivos para alertas com ícones diferentes.
precisa saber é o seguinte
Agradável. BTW, você não precisa usar o CScript, pelo menos no Win10. Com o CScript, recebo algum texto adicional no prompt de comando. Sem o CScript, existe apenas o alerta, o que é ótimo
Um Filho de Deus
Eu não tinha cscript. Eu costumava começar.
sureshvv
127

Antes de tudo, o DOS não tem nada a ver com isso; você provavelmente deseja uma solução de linha de comando do Windows (novamente: sem DOS, Windows puro, apenas não uma janela, mas um console).

Você pode usar o método VBScript fornecido por boflynn ou pode usar mal net sendou msg. net sendfunciona apenas em versões mais antigas do Windows:

net send localhost Some message to display

Porém, isso também depende do serviço do Messenger para ser executado.

Para versões mais recentes (XP e posteriores, aparentemente):

msg "%username%" Some message to display

Note-se que uma caixa de mensagem enviada usando msg.exedura apenas 60 segundos. No entanto, isso pode ser substituído pelo /time:xxcomutador.

Joey
fonte
2
Você pode usar variáveis ​​env para obter o usuário local -% USERNAME%. O msg.exe está na minha máquina XP Home, mas ouvi contas anedóticas que não estão em todas as versões do Vista. Acredito que o serviço por trás do NET SEND esteja desativado atualmente.
21909 McDowell
Certo, obrigado, esqueci o envvar (raramente uso algo além de% UserProfile% e os meus definidos em lotes :)). Engraçado, porém, você está certo sobre o serviço Messenger. Ele nem existe na minha VM XP, mas o envio líquido ainda existe. O msg.exe funciona lá, no entanto.
21909 Joey
18
Eu pensei que faltava uma opção viável nas respostas e a forneci. Nada de errado aqui. Você não precisa se sentir forçado a fazer algo, nem estou dizendo que o boflynn está errado. Eu estava apenas adicionando outra opção que deveria ser perfeitamente adequada para perguntas que não têm uma única resposta definitiva. Além disso, você provavelmente não é o único com essa pergunta e outras pessoas podem não querer usar o VBScript por qualquer motivo. Este é um site da comunidade, não apenas o seu :-)
Joey
8
Eu mesmo usei isso para gerar uma mensagem "Eu te amo" no PC da minha namorada a partir de um shell remoto.
Camilo Martin
1
No Windows 8 e 10, encontrei a versão do Windows. Para mim, funciona no profissional, mas não em casa. Outros relataram que ele funciona no Home Premium e Enterprise, Ultimate, etc.
shox
84

Pode exibir um pouco de flash, mas nenhum arquivo temporário é necessário. Deve funcionar de volta a algum lugar da era (IIRC) IE5.

mshta javascript:alert("Message\n\nMultiple\nLines\ntoo!");close();

Não se esqueça de escapar dos parênteses se estiver usando if:

if 1 == 1 (
   mshta javascript:alert^("1 is equal to 1, amazing."^);close^(^);
)
Galinha
fonte
Isso funciona perfeitamente a partir do prompt de comando, mas quando eu colocá-lo em um arquivo de lote, eu recebo este erro: close() was unexpected at this time.
eye_mew
@eye_mew talvez você precisará remover esses ^caracteres de escape em um arquivo bat
phuclv
1
Funcionou perfeitamente para mim a partir de um arquivo em lotes (estou no Windows 7). Podemos executar algum Javascript dessa maneira? Como retornaríamos valores ao arquivo em lotes?
Jerry Jeremiah
1
Aqui estão alguns exemplos surpreendentes de coisas que você pode fazer: dostips.com/forum/viewtopic.php?t=5311 O exemplo LocalDateTime retorna um valor. Obrigado pela ideia!
Jerry Jeremiah
Cool node.js da Microsoft antes do JavaScript do servidor ser legal - uma oportunidade perdida para eles.
precisa
76

Isso abrirá outra janela do prompt de comando:

START CMD /C "ECHO My Popup Message && PAUSE"
Dave Webb
fonte
1
ty impressionante! eu poderia usar isso em alguns outros scripts :)
billyy
3
Uma opção melhor seria:, start cmd /c "@echo off & mode con cols=18 lines=2 & echo My Popup Message & pause>nul"altere cols=18para a quantidade de caracteres na mensagem + 2. E o lines=2para qualquer que seja a quantidade de linhas é + 1.
Ender_scythe
1
livrar-se do uso de pausa ecmd /k
Artelius
34

Experimentar :

Msg * "insert your message here" 

Se você estiver usando o command.com do Windows XP, isso abrirá uma caixa de mensagem.

Abrir uma nova janela do cmd não é exatamente o que você estava pedindo, pelo que entendi. Você também pode usar o VBScript e usá-lo com o seu arquivo .bat. Você o abriria do arquivo bat com este comando:

cd C:\"location of vbscript"

O que isso faz é alterar o diretório command.com procurará por arquivos e, na próxima linha:

"insert name of your vbscript here".vbs

Em seguida, você cria um novo documento do bloco de notas , digite

<script type="text/vbscript">
    MsgBox "your text here"
</script>

Você então salvaria isso como um arquivo .vbs (colocando ".vbs" no final do nome do arquivo) e salve como "Todos os arquivos" na caixa suspensa abaixo do nome do arquivo (para que não seja salvo como .txt ) e clique em Salvar!

Unihedron
fonte
3
Você não precisa da <script/>tag.
Surfasb # 25/11
? como inserir nova linha (linhas em branco) no texto ao usar -> MSG * <text>
ZEE 29/16
@ZEE Se você usar apenas msg *, será solicitado a inserir uma mensagem seguida de ctrl-Z. Você pode inserir quebras de linha aqui que aparecerão na sua mensagem.
usar o seguinte comando
30

Mais algumas maneiras.

1) O mais geek e hackiest - ele usa o IEXPRESS para criar um exe pequeno que criará um pop-up com um único botão ( ele pode criar mais dois tipos de mensagens pop-up ). Funciona em TODAS as janelas do XP e acima:

;@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. Também funciona em todas as máquinas Windows a partir do XP e acima (apesar do OP não desejar idiomas "externos", o JavaScript aqui é minimizado). Deve ser salvo como .bat:

@if (true == false) @end /*!
@echo off
mshta "about:<script src='file://%~f0'></script><script>close()</script>" %*
goto :EOF */

alert("Hello, world!");

ou em uma linha:

mshta "about:<script>alert('Hello, world!');close()</script>"

ou

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

ou

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

3) Aqui está o .bat/jscripthíbrido parametrizado (deve ser salvo como bat). Ele novamente usa JavaScript, apesar da solicitação do OP, mas como é um bastão, pode ser chamado como um arquivo bat sem preocupações. Ele usa POPUP, que permite um pouco mais de controle do que o MSGBOX mais popular . Ele usa o WSH, mas não o MSHTA, como no exemplo acima.

 @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) e um jscript.net/.bathíbrido (deve ser salvo como .bat). Desta vez, ele usa .NETe compila um pequeno .exearquivo que pode ser excluído:

@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) e, no final, uma única chamada para o PowerShell que cria um pop-up (pode ser chamado na linha de comando ou em lote, se o PowerShell estiver instalado):

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

6) E a abordagem do dbenham vista aqui

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

7 ) Para as notificações da bandeja do sistema, você pode tentar o seguinte :

call SystemTrayNotification.bat  -tooltip warning -time 3000 -title "Woow" -text "Boom" -icon question
npocmaka
fonte
29

Dessa forma, seu arquivo em lotes criará um script VBS e exibirá um pop-up. Após a execução, o arquivo em lotes excluirá esse arquivo intermediário.

A vantagem de usar o MSGBOX é que ele é realmente habitável (altere o título, o ícone etc.), enquanto o MSG.exe não é o mesmo.

echo MSGBOX "YOUR MESSAGE" > %temp%\TEMPmessage.vbs
call %temp%\TEMPmessage.vbs
del %temp%\TEMPmessage.vbs /f /q
dc1
fonte
15

Aqui está uma variante do PowerShell que não exige o carregamento de assemblies antes da criação da janela; no entanto, é notavelmente mais lenta (~ + 50%) do que o comando PowerShell MessageBox postado aqui por @npocmaka:

powershell (New-Object -ComObject Wscript.Shell).Popup("""Operation Completed""",0,"""Done""",0x0)

Você pode alterar o último parâmetro de "0x0" para um valor abaixo para exibir ícones na caixa de diálogo (consulte Método pop-up para obter mais referências):

        Pare0x10 Parar
        Ponto de interrogação0x20 Ponto de interrogação
        Ponto de exclamação0x30 Ponto de exclamação
        Marca de informação0x40 Ponto de informações

Adaptado do artigo Microsoft TechNet PowerTip: Use o PowerShell para exibir a janela pop-up .

Usuário5910
fonte
10
echo X=MsgBox("Message Description",0+16,"Title") >msg.vbs

–Pode escrever qualquer número de 0,1,2,3,4 em vez de 0 (antes do símbolo '+') e aqui está o significado de cada número:

0 = Ok Button  
1 = Ok/Cancel Button  
2 = Abort/Retry/Ignore button  
3 = Yes/No/Cancel  
4 = Yes/No  

–Pode escrever qualquer número entre 16,32,48,64 em vez de 16 (após o símbolo '+') e aqui está o significado de cada número:

16 – Critical Icon  
32 – Warning Icon  
48 – Warning Message Icon   
64 – Information Icon  
p2013
fonte
2
Como você obtém uma resposta do script VB?
Suit Boy Apps
7

Msg * "insira sua mensagem aqui"

funciona bem, apenas salve como um arquivo .bat no bloco de notas ou verifique se o formato está definido como "todos os arquivos"

Max Runacres
fonte
Os documentos dizem que "*" irá "Enviar mensagem para todas as sessões no servidor especificado", ou seja. vai quebrar em serviços de terminal ou troca rápida de usuário
Fowl
2
você poderia usarmsg %SESSIONNAME% msg
Fowl
5
msg * /time:0 /w Hello everybody!

Essa mensagem aguarda uma eternidade até clicar em OK (dura apenas um minuto por padrão) e funciona bem no Windows 8.1

MoE bis
fonte
A mesma resposta está presente desde 2009
jeb
Opa> _ <Exclua-o :)
MoE até
? como inserir nova linha (linhas em branco) no texto
ZEE 29/10
3
msg * /time:0 /w <C:\Somewhere\Message.txtonde no arquivo há texto normal (contendo CrLf).
MoE
4

Para fazer isso, você precisa de um pequeno programa que exiba uma caixa de mensagens e execute-o no seu arquivo em lotes.

Você pode abrir uma janela do console que exibe um prompt, mas não é possível obter uma caixa de mensagem da GUI usando apenas cmd.exe e amigos, AFAIK.

Macke
fonte
um prompt pode fazer isso ... você tem mais sobre isso?
billyy
1
echo "xx", pausar ou set / p var = prompt são opções cmd.exe
Macke
@ nickl-: melhor assim?
Macke
3

Eu uso um utilitário chamado msgbox.exe a partir daqui: http://www.paulsadowski.com/WSH/cmdprogs.htm

zhongshu
fonte
De acordo com o antivírus da Symantec, este arquivo contém um cavalo de Troia.
David
3
@ David - Eu tive arquivos de lote e texto sinalizados como hostis por antivírus. Na verdade, o AVG antivírus capturou uma instrução na linha de comando e alegou que era um vírus.
James K
2
Vírus FWIW total diz 11/51 antivírus detectar vírus nesse arquivo: virustotal.com/en/file/...
Matthew Bloqueio
3

Você pode usar o Zenity . O Zenity permite a execução de caixas de diálogo em scripts de linha de comando e shell. Mais informações também podem ser encontradas na Wikipedia .

É multiplataforma: um instalador do Windows para Windows pode ser encontrado aqui .

parvus
fonte
3

Seguindo a resposta de @ Fowl, você pode melhorá-lo com um tempo limite para aparecer apenas por 10 segundos usando o seguinte:

mshta "javascript:var sh=new ActiveXObject( 'WScript.Shell' ); sh.Popup( 'Message!', 10, 'Title!', 64 );close()"

Veja aqui para mais detalhes.

Rafi
fonte
Detectado como vírus xD
Julien
2

Você pode invocar a função DLL do user32.dll eu acho que algo como

Rundll32.exe user32.dll, MessageBox (0, "texto", "titleText", {sinalizadores extras para as principais caixas de mensagens, etc})

Digitando no meu telefone, não me julgue ... caso contrário, eu vincularia as bandeiras extras.

Entropia
fonte
Posso rundll32.exe user32.dll,MessageBoxA Xexibir uma caixa de mensagens com X como título quando o faço na caixa Executar. Não importa o que eu faça X ser, não consigo interpretá-lo como vários parâmetros - tudo vai para o título. Portanto, rundll32.exe user32.dll,MessageBoxA (0, "MyTitle", "MyText", 0)exibe uma caixa de mensagens com o título (0, "MyTitle", "MyText", 0) Mas eu não consigo fazê-la funcionar A TUDO na linha de comando - apenas na caixa Executar. Na linha de comando, ele não faz nada. Funciona com certeza a partir de uma linha de comando ou de um arquivo em lotes ou apenas da caixa Executar?
Jerry Jeremiah
O rundll32.exe, conforme o documento, pode executar apenas os procedimentos projetados especificamente para esse fim, porque devem analisar a parte "argumentos opcionais". As funções MessageBox-ish não foram projetadas dessa maneira. Por que funciona através do Win + R (caixa de execução), ainda é uma grande questão!
Yuriy Pozniak
1

msg * /server:127.0.0.1 Digite sua mensagem aqui

Franco
fonte
O Windows cmd.exe diz: 'msg' não é reconhecido como um comando interno ou externo, programa operável ou arquivo em lote.
Anthony Hatzopoulos 11/11
@AnthonyHatzopoulos que é porque ele só é suportado no XP
pattyd
@pattyd XP e mais tarde, na verdade
Jesan Fafon
@JesanFafon não, foi interrompido após XP ... eu acho que você XP média e mais cedo
pattyd
@pattyd No Windows 8.1, where msgretorna C:\Windows\System32\msg.exe. Eu acho que você está pensando emnet send
Jesan Fafon 15/09/14
1

Esse aplicativo pode fazer isso se você converter (agrupar) seus arquivos em lotes em arquivos executáveis.


  1. Simple Messagebox

    %extd% /messagebox Title Text
    

  1. Mensagem de erro

    %extd% /messagebox  Error "Error message" 16
    
  2. Cancelar Tente novamente Messagebox

    %extd% /messagebox Title "Try again or Cancel" 5
    

4) "Nunca me pergunte novamente" Messagebox

%extd% /messageboxcheck Title Message 0 {73E8105A-7AD2-4335-B694-94F837A38E79}
someone23432
fonte
0

Uma opção melhor

set my_message=Hello world&& start cmd /c "@echo off & mode con cols=15 lines=2 & echo %my_message% & pause>nul"


Descrição:
lines= quantidade de linhas, mais 1
cols= quantidade de caracteres na mensagem e mais 3 (no entanto, o mínimo deve ser 15)

colsVersão calculada automaticamente:

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
fonte
O comentário @ender_scythe funciona ( start cmd /c "@echo off & mode con cols=18 lines=2 & echo My Popup Message & pause>nul"). O seu não. Ele ecoa a mensagem, mas não consegue definir o tamanho da janela de retornar The screen cannot be set to the number of lines and columns specified.pelo menos em meu Windows 7.
cdlvcdlv
@cdlvcdlv Atualizei a resposta. deve funcionar agora para todos, revise-o.
T.Todua
Funciona mesmo ... desde que não exista um arquivo nomeado xno diretório atual ou você não se importe de perdê-lo.
Cdlvcdlv
Você pegou um comentário que funcionava perfeitamente e o quebrou. Então você tentou agregar algum valor (eu concordo com isso), mas com o preço de perder qualquer arquivo com um nome não tão improvável. Se alguém (por curiosidade) tentar seu código com tanta má sorte, ele perderá o arquivo para sempre. Além disso, se houver uma pasta chamada x, seu comando falhará. Não me agradeça e apenas corrija seu código. Você nem precisa usar uma linha. E se você acha que seu código é tão bom, publique-o na Revisão de Código .
Cdlvcdlv
que ingratidão .... Eu não quebrei, mas atualizei, expliquei e até dei solução automática ... (mas existem pessoas como você, que eu não posso satisfazer). boa sorte
T.Todua
0

Aqui está o meu script em lote que eu montei com base nas boas respostas aqui e em outros posts

Você pode definir o tempo limite do título e até dormir para agendá-lo para o último & \ n para a nova linha

Nomeie-o como popup.bat e coloque-o na pasta do caminho do Windows para funcionar globalmente no seu PC

Por exemplo popup Line 1\nLine 2, produzirá uma caixa pop-up de 2 linhas (digite popup /?para uso)

Aqui está o código

<!-- : 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
fonte
-3

ele só precisa aparecer quando estiver dentro de uma vm; portanto, tecnicamente, deve haver algum código como:

if %machine_type% == virtual_machine then
   echo message box code
else
   continue normal installation code
Alienígena ilegal
fonte
voto negativo porque a instalação não será continuada se (% machine_type% == virtual_machine) == true
anion