Покажіть спливаюче вікно / вікно повідомлення з пакетного файлу Windows


153

Чи існує спосіб відображення вікна повідомлення з пакетного файлу (подібно до того, як xmessageможна використовувати bash-скрипти в Linux)?


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довідка, якщо вам цікаво пройти цей маршрут.


спасибі, що це зробить, недобре створити файл, записати в нього ці дані, і чим користуватися ним, ніж видаляти. повинен працювати нормально :)
— billyy

1
Чудова відповідь. Таким чином ви можете мати повний контроль над іконками, кнопками та заголовком поля. Також, коли ви зберігаєте файл десь уздовж PATH, ви викликаєте його з будь-якого місця. Я створив кілька файлів для сповіщень з різними значками.
— Deus777

Приємно. До речі, вам не потрібно використовувати CScript, принаймні, в Win10. За допомогою CScript я отримую деякий додатковий текст у командному рядку. Без CScript є лише попередження, що чудово
— Дитина Божа

У мене не було cscript. Я замість цього використовував старт.
— sureshvv

127

Перш за все, DOS не має до цього нічого спільного, ви, мабуть, хочете рішення командного рядка Windows (знову ж таки: немає DOS, чистий 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, але я чув анекдотичні записи, які є не у кожній версії Vista. Я вважаю, що послуга NET SEND відключена в наші дні.
— McDowell

Правильно, дякую, забув envvar (рідко використовую що-небудь, крім% UserProfile% та мої власні визначені партії :)). Хоча смішно, ви маєте рацію щодо послуги Messenger. Він навіть не існує в моєму XP VM, але чисте надсилання все ще існує. msg.exe працює, хоча.
— Джої

18
Я подумав, що відповіді відсутній у життєздатному варіанті і надав це. Тут нічого поганого. Ні тобі не потрібно відчувати себе змушеним щось робити, ні я якось кажу, що бофлін неправильно. Я просто додав ще один варіант, який повинен бути ідеально підходить для запитань, на які немає однозначної відповіді. Крім того, ви, мабуть, не єдиний, хто має це питання, а інші, можливо, не захочуть використовувати VBScript з будь-яких причин. Це веб-сайт спільноти, не лише ваш :-)
— Joey

8
Я для себе щойно використав це для нерестування повідомлення "Я люблю тебе" на ПК своєї подруги з віддаленої оболонки.
— Каміло Мартін

1
В Windows 8 і 10 я знайшов версію Windows. Для мене це працює на профі, але не вдома. Інші повідомили, що він працює на Home Premium і Enterprise, Ultimate тощо. Здається, звичайний старий дім не отримує його (він не існує в System32, але його можна додати).
— шокс

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, можливо, вам потрібно буде видалити ці ^знаки втечі у файлі 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
дивовижний ти! я можу використовувати це в кількох інших сценаріях :)
— billyy

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
— Artelius

34

Спробуйте:

Msg * "insert your message here" 

Якщо ви використовуєте command.com's 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 ), а потім натисніть кнопку Зберегти!


3
Вам не потрібен <script/>тег.
— surfasb

? як вставити новий рядок (порожні рядки) в текст при використанні -> MSG * <текст>
— ZEE

@ZEE Якщо ви користуєтесь лише msg *вам, вам буде запропоновано ввести повідомлення, а потім ctrl-Z. Ви можете ввести тут розриви рядків, які з’являться у вашому повідомленні.
— Користувач5910,

30

Трохи більше способів.

1) Geekiest та hackiest - він використовує 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 і вище (незважаючи на те, що ОП не хочуть "зовнішніх" мов, 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) і в кінці один єдиний виклик до shellhell, який створює спливаюче вікно (можна викликати з командного рядка або з пакетного пакету, якщо встановлено powerhell):

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

29

Таким чином ваш пакетний файл створить сценарій VBS і покаже спливаюче вікно. Після запуску пакетний файл видалить цей проміжний файл.

Перевага використання MSGBOX полягає в тому, що він дійсно зберігається (змінити заголовок, піктограму тощо), тоді як MSG.exe не так вже й багато.

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

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 для відображення спливаючого вікна .


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  

2
Як ви отримуєте відповідь зі сценарію VB?
— Suit Boy Apps

7

Msgstr "" вставити своє повідомлення сюди "

добре працює, просто збережіть як .bat файл у блокноті або переконайтесь, що для формату встановлено значення "всі файли"


Документи кажуть, що "*" буде "Надіслати повідомлення всім сеансам на вказаному сервері", тобто. порушить термінальні послуги або швидку комутацію користувачів
— Fowl

2
ви могли використовуватиmsg %SESSIONNAME% msg
— Fowl

5
msg * /time:0 /w Hello everybody!

Це повідомлення чекає вічно, поки не буде натиснути кнопку ОК (воно за замовчуванням триває лише одну хвилину) і справно працює в Windows 8.1


Таку ж відповідь присутній з 2009 року
— Джеб

На жаль> _ <Будь ласка, видаліть його :)
— МО біс

"як вставити новий текст (порожні рядки) в текст
— ZEE

3
msg * /time:0 /w <C:\Somewhere\Message.txtде у файлі є звичайний текст (містить тексти CrLf).
— МО біс

4

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

Ви можете відкрити вікно консолі, яке відображає підказку, але отримати вікно повідомлення GUI за допомогою cmd.exe та лише друзів неможливо, AFAIK.


підказка може зробити це ... у вас є більше про це?
— billyy

1
echo "xx", пауза або 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 відповідно до doc може запускати лише ті процедури, які були спеціально розроблені для цієї мети, оскільки вони повинні розбирати частину "необов'язкових аргументів". Функції MessageBox-ish були розроблені не таким чином. Чому це працює через Win + R (Run box), це все ще велике питання!
— Юрій Позняк

1

msg * /server:127.0.0.1 Введіть тут своє повідомлення


Windows cmd.exe говорить: "msg" не розпізнається як внутрішня чи зовнішня команда, функціонуюча програма чи пакетний файл.
— Ентоні Хацопулос

@AnthonyHatzopoulos тому, що він підтримується лише в XP
— pattyd

@pattyd XP та пізніші фактично
— Jesan Fafon

@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}

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"


@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.
— перегукується,

@cdlvcdlv Я оновив відповідь. воно має працювати зараз для всіх, переглянути його.
— Т.Тодуа

Це справді працює ... за умови, що xу поточному каталозі немає файлу, іменованого або ви не проти втратити його.
— cdlvcdlv

Ви взяли ідеально працюючий коментар і зламали його. Тоді ви спробували додати якусь цінність (я надаю вам це), але потім ціною втрати будь-якого файлу з не дуже ймовірним іменем. Якщо хтось (з цікавості) дасть ваш код спробувати з такою невдачею, він втратить файл назавжди. Крім того, якщо існує папка з назвою x, ваша команда просто не працює. Не дякуйте, і будь ласка, просто виправте свій код. Вам навіть не потрібно користуватися однолінійкою. І якщо ви вважаєте, що ваш код такий хороший, будь ласка, опублікуйте його в Code Review .
— cdlvcdlv

яка невдячність .... Я не ламав, але оновлював, пояснював і навіть давав автоматичне рішення ... (але є такі люди, як ти, яких я не можу задовольнити). удачі
— Т.Тодуа

0

Ось мій пакетний сценарій, який я зібрав на основі хороших відповідей тут та інших публікацій

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

Назвіть це popup.bat і покладіть його у папку шляху Windows для роботи у глобальному масштабі на вашому ПК

Наприклад, popup Line 1\nLine 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>

-3

йому потрібно ТОЛЬКО спливати, коли знаходиться всередині vm, тому технічно повинен бути код, наприклад:

if %machine_type% == virtual_machine then
   echo message box code
else
   continue normal installation code

downvote , тому що його встановлення не буде продовжена , якщо (% machine_type% == virtual_machine) == вірно
— аніон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.