Показать всплывающее окно / окно сообщения из пакетного файла Windows

153

Есть ли способ отобразить окно сообщения из командного файла (аналогично тому, как xmessageможно использовать bash-скрипты в Linux)?

billyy
источник
CMD.EXE, это 32-битный командный процессор, который поддерживает команды DOS.
Алан Б
7
Это называется командной строкой Windows.
Рикардо Поло Харамильо

Ответы:

121

Я хотел бы сделать очень простой файл VBScript и вызывать его, используя CScript для анализа параметров командной строки.

Что-то вроде следующего сохранено в MessageBox.vbs:

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

Который вы бы назвали, как:

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

MsgBoxСсылка, если вы заинтересованы в этом пути.

boflynn
источник
спасибо, что сделал бы это, плохо создаю файл, записываю эти данные в него, и чем использую его, чем удаляю. должно работать нормально :)
Билли
1
Отличный ответ. Таким образом, вы можете иметь полный контроль над значками, кнопками и заголовком окна. Кроме того, когда вы сохраняете файл где-то в PATH, вы вызываете его из любого места. Я создал несколько файлов для предупреждений с разными значками.
Deus777
Ницца. Кстати, вам не нужно использовать CScript, по крайней мере, в Win10. С CScript я получаю дополнительный текст в командной строке. Без CScript есть только предупреждение, что здорово
Дитя Божие
У меня не было cscript. Я использовал старт вместо этого.
sureshvv
127

Прежде всего, DOS не имеет к этому никакого отношения, вам, вероятно, нужно решение для командной строки Windows (опять-таки: нет DOS, чисто Windows, просто не Windows, а консоль).

Вы можете использовать метод VBScript, предоставленный boflynn, или вы можете использовать его неправильно net sendили msg. net sendработает только на старых версиях Windows:

net send localhost Some message to display

Это также зависит от службы Messenger для запуска, хотя.

Для более новых версий (XP и далее, по-видимому):

msg "%username%" Some message to display

Следует отметить, что сообщение, отправленное с использованием, msg.exeбудет длиться только 60 секунд. Это может однако быть отменено с /time:xxвыключателем.

детеныш
источник
2
Вы можете использовать переменные env для получения локального пользователя -% USERNAME%. msg.exe находится на моем компьютере с XP Home, но я слышал отдельные истории, что это не на каждой версии Vista. Я считаю, что служба NET SEND в настоящее время отключена.
Макдауэлл
Хорошо, спасибо, забыл envvar (редко использую что-либо кроме% UserProfile% и моих определенных в пакетах :)). Забавно, но вы правы насчет службы Messenger. Он даже не существует на моей виртуальной машине XP, но net send все еще существует. там работает msg.exe.
Джои
18
Я думал, что в ответах отсутствует жизнеспособный вариант, и предоставил его. Здесь все в порядке. Вам не нужно чувствовать себя вынужденным что-то делать, и я как-то не говорю, что Бофлинн не права. Я просто добавил еще один вариант, который вполне подойдет для вопросов, на которые нет однозначного ответа. Кроме того, вы, вероятно, не единственный, кто задал этот вопрос, а другие могут не захотеть использовать VBScript по тем или иным причинам. Это сайт сообщества, а не только ваш :-)
Joey
8
Я сам использовал это для создания сообщения «Я люблю тебя» на компьютере моей подруги из удаленной оболочки.
Камило Мартин
1
На Windows 8 и 10 я обнаружил, что версия Windows имеет значение. Для меня это работает на профи, но не дома. Другие сообщают, что он работает на Home Premium и Enterprise, Ultimate и т. Д. Кажется, что старый дом не получает его (он не существует в System32, но может быть добавлен).
Shox
84

Может показывать небольшую вспышку, но никаких временных файлов не требуется. Должен работать вплоть до эры IE5 (IIRC).

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

Не забывайте избегать скобок, если вы используете if:

if 1 == 1 (
   mshta javascript:alert^("1 is equal to 1, amazing."^);close^(^);
)
живность
источник
Это отлично работает из командной строки, но когда я вставить его в пакетный файл, я получаю эту ошибку: close() was unexpected at this time.
eye_mew
@eye_mew может быть, вам нужно удалить эти ^escape-символы в файле bat
phuclv
1
Он отлично работал для меня из командного файла (я на Windows 7) Можем ли мы запустить любой Javascript таким образом? Как бы мы возвращали значения в командный файл?
Джерри Иеремия
1
Вот несколько удивительных примеров того, что вы можете сделать: dostips.com/forum/viewtopic.php?t=5311 Пример LocalDateTime возвращает значение. Спасибо за идею!
Джерри Иеремия
Классный node.js от Microsoft до серверной части JavaScript был крутым - упущенная возможность для них.
Даниэль Соколовский
76

Откроется другое окно командной строки:

START CMD /C "ECHO My Popup Message && PAUSE"
Дэйв Уэбб
источник
1
офигенно ты! я мог бы использовать это в нескольких других сценариях :)
Билли
3
Лучшим вариантом будет:, start cmd /c "@echo off & mode con cols=18 lines=2 & echo My Popup Message & pause>nul"измените cols=18количество символов в сообщении + 2. И lines=2сколько бы строк не было + 1.
ender_scythe
1
избавиться от паузы и использоватьcmd /k
Артелиус
34

Пытаться :

Msg * "insert your message here" 

Если вы используете command.com в Windows XP, откроется окно сообщения.

Я понимаю, что открытие нового окна cmd не совсем то, о чем вы просили. Вы также можете использовать VBScript и использовать его со своим файлом .bat. Вы бы открыли его из файла bat с помощью этой команды:

cd C:\"location of vbscript"

Для этого нужно изменить каталог, в котором command.com будет искать файлы, затем в следующей строке:

"insert name of your vbscript here".vbs

Затем вы создаете новый документ Блокнот , введите

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

Затем вы должны сохранить его как файл .vbs (поместив «.vbs» в конце имени файла), сохранить как «Все файлы» в раскрывающемся списке под именем файла (чтобы он не сохранялся как .txt ), затем нажмите Сохранить!

Unihedron
источник
3
Вам не нужен <script/>тег.
Surfasb
? как вставить новую строку (пустые строки) в текст при использовании -> MSG * <text>
ZEE
@ZEE Если вы используете только, msg *вам будет предложено ввести сообщение, а затем Ctrl-Z. Здесь вы можете ввести разрывы строк, которые появятся в вашем сообщении.
Пользователь5910
30

Еще несколько способов.

1) Самый вызывающий и хакерский - он использует IEXPRESS для создания небольшого exe-файла, который создаст всплывающее окно с помощью одной кнопки ( он может создавать еще два типа всплывающих сообщений ). Работает на КАЖДЫХ окнах от XP и выше:

;@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) Использование MSHTA. Также работает на каждой машине с Windows от XP и выше (несмотря на то, что OP не хочет «внешних» языков, JavaScript здесь сведен к минимуму). Должен быть сохранен как .bat:

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

alert("Hello, world!");

или в одну строку:

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

или

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

или

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

3) Вот параметризованный .bat/jscriptгибрид (должен быть сохранен как bat). Он снова использует JavaScript, несмотря на запрос OP, но, поскольку это bat, его можно без проблем назвать файлом bat. Он использует POPUP, который позволяет немного больше контроля, чем более популярный MSGBOX . Он использует WSH, но не MSHTA, как в примере выше.

 @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) и один jscript.net/.batгибрид (должен быть сохранен как .bat). На этот раз он использует .NETи компилирует небольшой .exeфайл, который можно удалить:

@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) и в конце один единственный вызов powershell, который создает всплывающее окно (может вызываться из командной строки или из пакета, если установлен powershell):

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

6) И подход dbenham видел здесь

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

7 ) Для уведомлений в системном трее вы можете попробовать это :

call SystemTrayNotification.bat  -tooltip warning -time 3000 -title "Woow" -text "Boom" -icon question
npocmaka
источник
29

Таким образом, ваш пакетный файл создаст сценарий VBS и покажет всплывающее окно. После запуска пакетный файл удалит этот промежуточный файл.

Преимущество использования MSGBOX заключается в том, что он действительно настраиваемый (измените название, значок и т. Д.), Тогда как MSG.exe не так уж и много.

echo MSGBOX "YOUR MESSAGE" > %temp%\TEMPmessage.vbs
call %temp%\TEMPmessage.vbs
del %temp%\TEMPmessage.vbs /f /q
DC1
источник
15

Вот вариант PowerShell, который не требует загрузки сборок перед созданием окна, однако он работает заметно медленнее (~ + 50%), чем команда PowerShell MessageBox, размещенная здесь @npocmaka:

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

Вы можете изменить последний параметр с «0x0» на значение ниже для отображения значков в диалоговом окне (см. « Метод всплывающих окон» для дальнейшего использования):

        Стоп0x10 Стоп
        Вопросительный знак0x20 Вопросительный знак
        Восклицательный знак0x30 Восклицательный знак
        Информационная марка0x40 Информационный знак

Адаптировано из статьи Microsoft TechNet PowerTip: используйте PowerShell для отображения всплывающего окна .

User5910
источник
10
echo X=MsgBox("Message Description",0+16,"Title") >msg.vbs

–Вы можете написать любые числа от 0,1,2,3,4 вместо 0 (перед символом «+»), и вот значение каждого числа:

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

–Вы можете написать любые числа от 16,32,48,64 вместо 16 (после символа «+»), и вот значение каждого числа:

16 – Critical Icon  
32 – Warning Icon  
48 – Warning Message Icon   
64 – Information Icon  
P2013
источник
2
Как вы получаете ответ от сценария VB?
Suit Boy Apps
7

Msg * "вставьте ваше сообщение сюда"

работает нормально, просто сохраните как .bat файл в блокноте или убедитесь, что установлен формат «все файлы»

Макс Рунакрес
источник
В документах говорится, что «*» будет «Отправить сообщение всем сеансам на указанном сервере», т.е. сломается на терминальных службах или быстром переключении пользователей
Птица
2
Вы могли бы использоватьmsg %SESSIONNAME% msg
Птица
5
msg * /time:0 /w Hello everybody!

Это сообщение ждет до тех пор, пока не будет нажата кнопка ОК (по умолчанию оно длится всего одну минуту) и работает нормально в Windows 8.1

Миссури
источник
Тот же ответ присутствует с 2009 года
Джеб
К сожалению> _ <Пожалуйста, удалите его :)
МО Миссури
? как вставить новую строку (пустые строки) в текст
ZEE
3
msg * /time:0 /w <C:\Somewhere\Message.txtгде в файле обычный текст (содержащий CrLf).
МЧС бис
4

Для этого вам нужна небольшая программа, которая отображает окно сообщения и запускает его из вашего пакетного файла.

Вы можете открыть консольное окно, в котором отображается приглашение, но получить окно сообщения с графическим интерфейсом, используя cmd.exe и только друзей, невозможно, AFAIK.

Маке
источник
подсказка может сделать это ... у вас есть что-нибудь об этом?
Билли
1
echo "xx", pause или set / p var = prompt - это параметры cmd.exe
Macke
@ nickl-: лучше так?
Маке
3

Я использую утилиту с именем msgbox.exe отсюда: http://www.paulsadowski.com/WSH/cmdprogs.htm

Чжуншу
источник
По данным антивируса Symantec, этот архив содержит троян.
Дэвид
3
@David - у меня есть пакетные и текстовые файлы, помеченные антивирусами как враждебные. Фактически у меня был антивирус AVG, ловящий инструкцию командной строки и утверждающий, что это был вирус.
Джеймс К.
2
FWIW Virus Total сообщает, что 11/51 средство проверки на вирусы обнаруживают вирусы в этом файле: virustotal.com/en/file/…
Мэтью Лок
3

Вы можете использовать Zenity . Zenity позволяет выполнять диалоговые окна в командной строке и сценариях оболочки. Больше информации также можно найти в Википедии .

Это кроссплатформенный: установщик Windows для Windows можно найти здесь .

Парвус
источник
3

Следуя ответу @ Fowl, вы можете улучшить его, установив тайм-аут только на 10 секунд, используя следующее:

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

Смотрите здесь для более подробной информации.

Рафи
источник
Обнаружен как вирус xD
Жюльен
2

Вы можете вызвать функцию DLL из user32.dll я думаю, что-то вроде

Rundll32.exe user32.dll, MessageBox (0, «текст», «titleText», {дополнительные флаги для самого верхнего окна сообщений и т. Д.})

Печатая это с моего телефона, не судите меня ... в противном случае я бы связал дополнительные флаги.

Энтропия
источник
Я могу rundll32.exe user32.dll,MessageBoxA Xотобразить окно сообщения с X в качестве заголовка, когда я делаю это в поле «Выполнить». Независимо от того, что я делаю X быть, я не могу интерпретировать его как несколько параметров - все идет в заголовок. Таким образом, rundll32.exe user32.dll,MessageBoxA (0, "MyTitle", "MyText", 0)отображается окно сообщения с заголовком (0, "MyTitle", "MyText", 0) Но я не могу заставить его работать ВСЕ из командной строки - только из поля Выполнить. В командной строке это вообще ничего не делает. Работает ли он наверняка из командной строки или из пакетного файла или только из поля «Выполнить»?
Джерри Иеремия
rundll32.exe согласно документу может запускать только те процедуры, которые были специально разработаны для этой цели, поскольку они должны анализировать часть «необязательные аргументы». Функции MessageBox-ish не были разработаны таким образом. Почему это работает через Win + R (Run box), это все еще большой вопрос!
Юрий Позняк
1

msg * /server:127.0.0.1 Введите ваше сообщение здесь

Франко
источник
Windows cmd.exe говорит: «msg» не распознается как внутренняя или внешняя команда, работающая программа или командный файл.
Энтони Хатзопулос
@AnthonyHatzopoulos потому что он поддерживается только в XP
pattyd
@pattyd XP и более
поздние версии
@JesanFafon нет, это было прекращено после XP ... Я думаю, что вы имеете в виду XP и более ранние
pattyd
@pattyd В Windows 8.1 where msgвозвращается C:\Windows\System32\msg.exe. Я думаю, что вы думаете оnet send
Джезан Фафон
1

Это приложение может сделать это, если вы преобразуете (упаковываете) свои командные файлы в исполняемые файлы.


  1. Простое окно сообщений

    %extd% /messagebox Title Text
    

  1. Окно сообщения об ошибке

    %extd% /messagebox  Error "Error message" 16
    
  2. Отмена Попробовать еще раз

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

4) «Никогда не спрашивай меня снова»

%extd% /messageboxcheck Title Message 0 {73E8105A-7AD2-4335-B694-94F837A38E79}
someone23432
источник
0

Лучший вариант

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


Описание:
lines= количество строк, плюс 1
cols= количество символов в сообщении, плюс 3 (однако, минимум должен быть 15)

Автоматически рассчитанная colsверсия:

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
источник
@ender_scythe комментарий работает ( start cmd /c "@echo off & mode con cols=18 lines=2 & echo My Popup Message & pause>nul"). Твой нет. Это повторяет сообщение, но не в состоянии установить размер окна, возвращающегося The screen cannot be set to the number of lines and columns specified.по крайней мере в моей Windows 7.
cdlvcdlv
@cdlvcdlv Я обновил ответ. это должно работать сейчас для всех, пересмотреть его.
Т.Тодуа
Это действительно работает ... при условии, что xв текущем каталоге нет файла, или вы не против потерять его.
cdlvcdlv
Вы взяли отлично работающий комментарий и нарушили его. Затем вы попытались добавить некоторую ценность (я вам это предоставлю), но затем ценой потери любого файла с не таким уж маловероятным именем. Если кто-то (из любопытства) попробует ваш код с такой неудачей, он потеряет файл навсегда. Кроме того, если существует папка с именем x, ваша команда просто не выполняется. Не благодари меня и, пожалуйста, просто исправь свой код. Вам даже не нужно использовать однострочник. И если вы считаете, что ваш код настолько хорош, пожалуйста, опубликуйте его в Code Review .
cdlvcdlv
какая неблагодарность .... я не сломал, но обновил, объяснил и даже дал автоматическое решение ... (но есть такие люди, как вы, которых я не могу удовлетворить). удачи
Т.Тодуа
0

Вот мой пакетный скрипт, который я собрал, основываясь на хороших ответах здесь и в других постах

Вы можете установить тайм-аут заголовка и даже сон, чтобы запланировать его для последнего и \ n для новой строки

Назовите его popup.bat и поместите его в папку Windows Path для глобальной работы на вашем компьютере.

Например, popup Line 1\nLine 2появится 2-строчное всплывающее окно (введите popup /?для использования)

Вот код

<!-- : 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
источник
-3

он должен появиться ТОЛЬКО в vm, так что технически должен быть такой код:

if %machine_type% == virtual_machine then
   echo message box code
else
   continue normal installation code
Незаконный иностранец
источник
downvote, потому что установка не будет продолжена, если (% machine_type% == virtual_machine) == true
анион