Existe-t-il un moyen d'afficher une boîte de message à partir d'un fichier batch (similaire à la façon dont xmessagepeut être utilisé à partir de scripts bash sous Linux)?
Existe-t-il un moyen d'afficher une boîte de message à partir d'un fichier batch (similaire à la façon dont xmessagepeut être utilisé à partir de scripts bash sous Linux)?
Réponses:
Je créerais un fichier VBScript très simple et l'appellerais en utilisant CScript pour analyser les paramètres de ligne de commande.
Quelque chose comme ce qui suit enregistré dans MessageBox.vbs:
Set objArgs = WScript.Arguments
messageText = objArgs(0)
MsgBox messageText
Ce que vous appelleriez comme:
cscript MessageBox.vbs "This will be shown in a popup."
MsgBoxréférence si vous êtes intéressé par cette voie.
Tout d'abord, DOS n'a rien à voir avec cela, vous voulez probablement une solution de ligne de commande Windows (encore une fois: pas de DOS, Windows pur, mais pas une fenêtre, mais une console).
Vous pouvez soit utiliser la méthode VBScript fournie par boflynn, soit mal utiliser net sendou msg.  net sendfonctionne uniquement sur les anciennes versions de Windows:
net send localhost Some message to display
Cela dépend également du service Messenger à exécuter.
Pour les versions plus récentes (XP et versions ultérieures, apparemment):
msg "%username%" Some message to display
Il est à noter qu'une boîte de message envoyée en utilisant msg.exene durera que 60 secondes. Cela peut cependant être annulé avec le /time:xxcommutateur.
Peut afficher un peu de flash, mais aucun fichier temporaire n'est requis. Devrait fonctionner jusqu'à quelque part dans l'ère (IIRC) IE5.
mshta javascript:alert("Message\n\nMultiple\nLines\ntoo!");close();
N'oubliez pas d' échapper vos parenthèses si vous utilisez if:
if 1 == 1 (
   mshta javascript:alert^("1 is equal to 1, amazing."^);close^(^);
)
close() was unexpected at this time.
                    ^caractères d'échappement dans un fichier chauve-souris
                    Cela fera apparaître une autre fenêtre d'invite de commandes:
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"remplacez le cols=18par le nombre de caractères dans le message + 2. Et le lines=2à quel que soit le nombre de lignes est + 1.
                    cmd /k
                    Essayez:
Msg * "insert your message here" 
Si vous utilisez command.com de Windows XP, cela ouvrira une boîte de message.
Ouvrir une nouvelle fenêtre cmd n'est pas tout à fait ce que vous demandiez, je suppose. Vous pouvez également utiliser VBScript et l'utiliser avec votre fichier .bat. Vous l'ouvririez à partir du fichier bat avec cette commande:
cd C:\"location of vbscript"
Cela change le répertoire command.com recherchera les fichiers à partir de, puis sur la ligne suivante:
"insert name of your vbscript here".vbs
Ensuite, vous créez un nouveau document Bloc-notes , tapez
<script type="text/vbscript">
    MsgBox "your text here"
</script>
Vous enregistrez ensuite ceci en tant que fichier .vbs (en mettant «.vbs» à la fin du nom de fichier), enregistrez-le sous «Tous les fichiers» dans la liste déroulante sous le nom du fichier (il ne sera donc pas enregistré sous .txt ), puis cliquez sur Enregistrer!
<script/>étiquette.
                    msg *vous serez invité à entrer un message suivi de ctrl-Z. Vous pouvez saisir ici des sauts de ligne qui apparaîtront dans votre message.
                    Quelques autres moyens.
1) Le plus geek et le plus piraté - il utilise IEXPRESS pour créer un petit exe qui créera un pop-up avec un seul bouton ( il peut créer deux autres types de messages pop-up ). Fonctionne sur TOUTES les fenêtres de XP et plus:
;@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) Utilisation MSHTA. Fonctionne également sur toutes les machines Windows à partir de XP et plus (malgré le fait que l'OP ne veut pas de langues "externes", le JavaScript est ici minimisé). Doit être enregistré sous .bat:
@if (true == false) @end /*!
@echo off
mshta "about:<script src='file://%~f0'></script><script>close()</script>" %*
goto :EOF */
alert("Hello, world!");
ou en une ligne:
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) Voici l' .bat/jscripthybride paramétré (doit être enregistré sous bat). Il utilise à nouveau JavaScript malgré la requête OP, mais comme il s'agit d'une batte, elle peut être appelée comme un fichier bat sans soucis. Il utilise POPUP qui permet un peu plus de contrôle que le MSGBOX plus populaire . Il utilise WSH, mais pas MSHTA comme dans l'exemple ci-dessus.
 @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) et un   jscript.net/.bathybride (doit être enregistré sous .bat) .Cette fois, il utilise .NETet compile un petit .exefichier qui pourrait être supprimé:
@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) et à la fin un seul appel à PowerShell qui crée un pop-up (peut être appelé à partir de la ligne de commande ou du batch si PowerShell est installé):
powershell [Reflection.Assembly]::LoadWithPartialName("""System.Windows.Forms""");[Windows.Forms.MessageBox]::show("""Hello World""", """My PopUp Message Box""")
6) Et l'approche de dbenham vue ici
start "" cmd /c "echo(&echo(&echo              Hello world!     &echo(&pause>nul"
7 ) Pour les notifications de la barre d'état système, vous pouvez essayer ceci :
call SystemTrayNotification.bat  -tooltip warning -time 3000 -title "Woow" -text "Boom" -icon question
De cette façon, votre fichier de commandes créera un script VBS et affichera une fenêtre contextuelle. Après son exécution, le fichier de commandes supprimera ce fichier intermédiaire.
L'avantage d'utiliser MSGBOX est qu'il est vraiment personnalisable (changer le titre, l'icône, etc.) alors que MSG.exe ne l'est pas autant.
echo MSGBOX "YOUR MESSAGE" > %temp%\TEMPmessage.vbs
call %temp%\TEMPmessage.vbs
del %temp%\TEMPmessage.vbs /f /q
Voici une variante de PowerShell qui ne nécessite pas le chargement d'assemblys avant de créer la fenêtre, mais elle s'exécute nettement plus lentement (~ + 50%) que la commande PowerShell MessageBox publiée ici par @npocmaka:
powershell (New-Object -ComObject Wscript.Shell).Popup("""Operation Completed""",0,"""Done""",0x0)
Vous pouvez changer le dernier paramètre de "0x0" à une valeur ci-dessous pour afficher les icônes dans la boîte de dialogue (voir Méthode Popup pour plus d'informations):
         0x10 Stop
0x10 Stop 
         0x20 Point d'interrogation
0x20 Point d'interrogation 
         0x30 Point d'exclamation
0x30 Point d'exclamation
         0x40 Marque d'information
 0x40 Marque d'information
Adapté de l'article Microsoft TechNet PowerTip: utiliser PowerShell pour afficher la fenêtre contextuelle .
echo X=MsgBox("Message Description",0+16,"Title") >msg.vbs
–Vous pouvez écrire n'importe quel nombre de 0,1,2,3,4 au lieu de 0 (avant le symbole '+') et voici la signification de chaque nombre:
0 = Ok Button  
1 = Ok/Cancel Button  
2 = Abort/Retry/Ignore button  
3 = Yes/No/Cancel  
4 = Yes/No  
–Vous pouvez écrire n'importe quel nombre de 16,32,48,64 au lieu de 16 (après le symbole «+») et voici la signification de chaque nombre:
16 – Critical Icon  
32 – Warning Icon  
48 – Warning Message Icon   
64 – Information Icon  
Msg * "insérez votre message ici"
fonctionne bien, enregistrez simplement en tant que fichier .bat dans le bloc-notes ou assurez-vous que le format est défini sur "tous les fichiers"
msg %SESSIONNAME% msg
                    msg * /time:0 /w Hello everybody!
Ce message attend indéfiniment jusqu'à ce que vous cliquiez sur OK (cela ne dure qu'une minute par défaut) et fonctionne correctement sous Windows 8.1
msg * /time:0 /w <C:\Somewhere\Message.txtoù dans le fichier se trouve du texte normal (contenant des CrLf).
                    Pour ce faire, vous devez avoir un petit programme qui affiche une boîte de message et l'exécute à partir de votre fichier de commandes.
Vous pouvez ouvrir une fenêtre de console qui affiche une invite, mais obtenir une boîte de message GUI en utilisant uniquement cmd.exe et amis n'est pas possible, AFAIK.
J'utilise un utilitaire nommé msgbox.exe à partir d'ici: http://www.paulsadowski.com/WSH/cmdprogs.htm
Suite à la réponse de @ Fowl, vous pouvez l'améliorer avec un délai d'attente pour n'apparaître que pendant 10 secondes en utilisant les éléments suivants:
mshta "javascript:var sh=new ActiveXObject( 'WScript.Shell' ); sh.Popup( 'Message!', 10, 'Title!', 64 );close()"
Voir ici pour plus de détails.
Vous pouvez appeler la fonction dll à partir de user32.dll je pense quelque chose comme
Rundll32.exe user32.dll, MessageBox (0, "text", "titleText", {indicateurs supplémentaires pour la boîte de message comme la plus haute, etc.})
En le tapant depuis mon téléphone, ne me jugez pas ... sinon je lierais les drapeaux supplémentaires.
rundll32.exe user32.dll,MessageBoxA Xafficher une boîte de message avec X comme titre lorsque je le fais dans la zone Exécuter. Peu importe ce que je fais de X, je ne peux pas le faire interpréter comme plusieurs paramètres - tout entre dans le titre. Donc, rundll32.exe user32.dll,MessageBoxA (0, "MyTitle", "MyText", 0)affiche une boîte de message avec un titre de (0, "MyTitle", "MyText", 0)   Mais je ne peux pas le faire fonctionner DU TOUT à partir de la ligne de commande - uniquement à partir de la zone Exécuter. Sur la ligne de commande, cela ne fait rien du tout. Cela fonctionne-t-il à coup sûr à partir d'une ligne de commande ou d'un fichier de commandes ou uniquement à partir de la zone Exécuter?
                    msg * /server:127.0.0.1 Tapez votre message ici
where msgretourne C:\Windows\System32\msg.exe. Je pense que vous pensez ànet send
                    Cette application peut le faire si vous convertissez (enveloppez) vos fichiers batch en fichiers exécutables.
Boîte de message simple
%extd% /messagebox Title Text
Message d'erreur
%extd% /messagebox  Error "Error message" 16
Annuler Réessayer Messagebox
%extd% /messagebox Title "Try again or Cancel" 5
4) Messagebox "Ne plus jamais me demander"
%extd% /messageboxcheck Title Message 0 {73E8105A-7AD2-4335-B694-94F837A38E79}
Une meilleure option
set my_message=Hello world&& start cmd /c "@echo off & mode con cols=15 lines=2 & echo %my_message% & pause>nul"
Description:
 lines=  nombre de lignes, plus 1
 cols=  nombre de caractères dans le message, plus 3 (Cependant, le minimum doit être15 )
colsVersion calculée automatiquement :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"). Le vôtre ne l'est pas. Il fait écho au message mais ne parvient pas à définir la taille de la fenêtre retournant The screen cannot be set to the number of lines and columns specified.au moins dans mon Windows 7.
                    xdans le répertoire courant ou que cela ne vous dérange pas de le perdre.
                    x, votre commande échoue tout simplement. Ne me remerciez pas et corrigez simplement votre code. Vous n'avez même pas besoin d'utiliser une doublure. Et si vous pensez que votre code est si bon, veuillez le publier dans Code Review .
                    Voici mon script batch que j'ai mis en place sur la base des bonnes réponses ici et dans d'autres articles
Vous pouvez définir le délai d'expiration du titre et même mettre en veille pour le programmer pour ce dernier et \ n pour une nouvelle ligne
Nommez-le popup.bat et placez-le dans votre dossier de chemin Windows pour qu'il fonctionne globalement sur votre PC
Par exemple popup Line 1\nLine 2produira une boîte contextuelle de 2 lignes (tapezpopup /? pour l'utilisation)
Voici le code
<!-- : 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>
il doit SEULEMENT apparaître à l'intérieur d'une vm, donc techniquement, il devrait y avoir du code comme:
if %machine_type% == virtual_machine then
   echo message box code
else
   continue normal installation code