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

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


person billyy    schedule 21.04.2009    source источник
comment
CMD.EXE, это 32-разрядный командный процессор, поддерживающий команды DOS.   -  person Alan B    schedule 15.11.2010
comment
Это называется командной строкой Windows.   -  person Ricardo Polo Jaramillo    schedule 11.10.2011


Ответы (21)


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

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

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

Что бы вы назвали так:

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

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

person boflynn    schedule 21.04.2009
comment
Спасибо, что сделал бы это, я создам файл, записываю в него эти данные, а затем использую его, чем удаляю. должно работать нормально :) - person billyy; 21.04.2009
comment
Отличный ответ. Таким образом, вы можете полностью контролировать значки, кнопки и заголовок окна. Также, когда вы сохраняете свой файл где-то по пути PATH, вы вызываете его из любого места. Я создал несколько файлов для предупреждений с разными значками. - person Deus777; 29.04.2016
comment
Хороший. Кстати, вам не нужно использовать CScript, по крайней мере, в Win10. С помощью CScript я получаю дополнительный текст в командной строке. Без CScript есть только предупреждение, и это здорово - person A Child of God; 30.09.2017
comment
У меня не было cscript. Вместо этого я использовал start. - person sureshvv; 14.11.2017

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

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

net send localhost Some message to display

Однако это также зависит от запуска службы обмена сообщениями.

Для более новых версий (очевидно, XP и новее):

msg "%username%" Some message to display

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

person Joey    schedule 21.04.2009
comment
Вы можете использовать переменные env, чтобы получить локального пользователя -% USERNAME%. msg.exe находится на моем компьютере с XP Home, но я слышал, что он есть не во всех версиях Vista. Я считаю, что служба NET SEND в наши дни отключена. - person McDowell; 21.04.2009
comment
Хорошо, спасибо, забыл envvar (редко используйте что-либо, кроме% UserProfile% и моих собственных определенных пакетов :)). Забавно, но насчет службы обмена сообщениями вы правы. Его даже нет на моей виртуальной машине XP, но net send все еще существует. Однако там работает msg.exe. - person Joey; 21.04.2009
comment
Я подумал, что в ответах не хватает жизнеспособного варианта, и предоставил его. Здесь нет ничего плохого. Вам также не нужно чувствовать себя вынужденным что-то делать, и я как-то не говорю, что Бофлинн неправ. Я просто добавлял еще один вариант, который идеально подходит для вопросов, на которые нет однозначного ответа. Более того, вы, вероятно, не единственный, кто задает этот вопрос, и другие могут не захотеть использовать VBScript по тем или иным причинам. Это не только ваш сайт сообщества :-) - person Joey; 22.04.2009
comment
Я для себя просто использовал это, чтобы создать сообщение "Я люблю тебя" на компьютере моей девушки из удаленной оболочки. - person Camilo Martin; 22.04.2010
comment
msg "%username%" Some message to display отлично справляется со своей задачей на XP - person dan richardson; 28.06.2012
comment
По какой-то причине это сработало для меня в командной строке; но это не сработало для меня в событии Post-build в Visual Studio. - person Andrej Adamenko; 25.09.2014
comment
msg "$USERNAME" Some message to display для Cygwin / MSYS - person qwertzguy; 09.05.2016
comment
Альтернативой указанию пользователя является указание Console в качестве имени sessionname, например, msg Console "Some message to display". - person Anthony Geoghegan; 05.09.2016
comment
msg действительно работает на моих Windows 10 (по крайней мере, после юбилейного обновления) - person Phe0nix; 02.11.2016
comment
В Windows 8 и 10 я обнаружил, что версия Windows имеет значение. Для меня это работает на Pro, но не дома. Другие сообщили, что он работает на Home Premium и Enterprise, Ultimate и т. Д. Кажется, что обычный старый дом этого не понимает (его нет в System32, но его можно добавить). - person shox; 02.05.2018
comment
@dubbreak, звучит разумно, поскольку в Home на самом деле не предполагается, что несколько пользователей вошли в систему (может быть, это даже невозможно). - person Joey; 02.05.2018
comment
@Joey Это может иметь смысл, но важно знать, вызываете ли вы его из приложения, скрипта и т. Д., Поскольку он может работать на вашем компьютере, но не работать на других. Домашняя страница Windows не допускает двух активных сеансов (насколько мне известно), но я думаю, что вы можете зарегистрировать пользователя, а затем переключать пользователей без выхода из системы (поэтому фоновые задачи, выполняемые под этим пользователем, по-прежнему выполняются). Могу ошибаться, большинство моих машин с Windows Pro. - person shox; 02.05.2018

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

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

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

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

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

START CMD /C "ECHO My Popup Message && PAUSE"
person Dave Webb    schedule 21.04.2009
comment
офигенная ты! я мог бы использовать это в нескольких других скриптах :) - person billyy; 21.04.2009
comment
Лучшим вариантом будет: start cmd /c "@echo off & mode con cols=18 lines=2 & echo My Popup Message & pause>nul", измените cols=18 на количество символов в сообщении + 2. И lines=2 к любому количеству строк +1. - person ender_scythe; 17.08.2016
comment
избавьтесь от ПАУЗЫ и используйте cmd /k - person Artelius; 02.10.2019

Пытаться :

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. ), затем нажмите Сохранить!

person Community    schedule 23.09.2009
comment
Тег <script/> вам не нужен. - person surfasb; 26.10.2011
comment
? как вставить новую строку (пустые строки) в текст при использовании - ›MSG * ‹text› - person ZEE; 29.10.2016
comment
@ZEE. Если вы используете только msg *, вам будет предложено ввести сообщение с последующим нажатием ctrl-Z. Вы можете ввести здесь разрывы строк, которые будут отображаться в вашем сообщении. - person User5910; 21.04.2017

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

1) Самый вызывающий и хакерский - он использует IEXPRESS для создания небольшого исполняемого файла, который будет создавать всплывающее окно с помощью одной кнопки (он может создавать еще два типа всплывающих сообщений). Работает на ВСЕХ окнах от 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>"

or

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

or

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

3) Вот параметризованный гибрид .bat/jscript (следует сохранить как bat). Он снова использует JavaScript, несмотря на запрос OP, но, поскольку это летучая мышь, его можно без проблем вызывать как файл 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
person npocmaka    schedule 19.09.2014

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

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

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

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

person User5910    schedule 22.02.2017

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  
person p2013    schedule 17.10.2013
comment
Как получить ответ от сценария VB? - person Suit Boy Apps; 20.08.2018

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

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

person Max Runacres    schedule 21.02.2011
comment
В документах говорится, что * будет отправлять сообщение всем сеансам на указанном сервере, т.е. нарушит работу терминальных служб или быстрое переключение пользователей - person Fowl; 21.06.2012
comment
вы могли бы использовать msg %SESSIONNAME% msg - person Fowl; 16.01.2014

msg * /time:0 /w Hello everybody!

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

person MoE bis    schedule 26.05.2016
comment
Такой же ответ присутствует с 2009 года. - person jeb; 26.05.2016
comment
Упс ›_‹ Удалите, пожалуйста :) - person MoE bis; 30.05.2016
comment
? как вставить новую строку (пустые строки) в текст - person ZEE; 29.10.2016
comment
msg * /time:0 /w <C:\Somewhere\Message.txt где в файле - обычный текст (содержащий CrLf). - person MoE bis; 04.12.2016

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

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

person Macke    schedule 21.04.2009
comment
подсказка может сделать это ... у вас есть еще об этом? - person billyy; 21.04.2009
comment
echo xx, pause или set / p var = prompt - это параметры cmd.exe - person Macke; 22.04.2009

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

person zhongshu    schedule 21.11.2009
comment
Согласно антивирусу Symantec, этот архив содержит троян. - person David; 22.11.2011
comment
@David - У меня были пакетные и текстовые файлы, отмеченные антивирусами как враждебные. Фактически, у меня был антивирус AVG, который ловил команду командной строки и утверждал, что это вирус. - person James K; 21.09.2012
comment
FWIW Virus Total сообщает, что 11 из 51 антивирусных программ обнаруживают вирусы в этом файле: - person Matthew Lock; 25.05.2014

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

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

person parvus    schedule 16.07.2012

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

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

Дополнительные сведения см. здесь.

person Rafi    schedule 18.04.2017
comment
Обнаружен как вирус xD - person Julien; 07.01.2020

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

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

Набирая его с моего телефона, не судите меня ... иначе я бы добавил лишние флаги.

person Entropy    schedule 19.10.2015
comment
Я могу заставить rundll32.exe user32.dll,MessageBoxA X отображать окно сообщения с X в качестве заголовка, когда я делаю это в поле «Выполнить». Независимо от того, что я делаю X, я не могу интерпретировать его как несколько параметров - все входит в заголовок. Итак, rundll32.exe user32.dll,MessageBoxA (0, "MyTitle", "MyText", 0) отображает окно сообщения с заголовком (0, "MyTitle", "MyText", 0) Но я не могу заставить его работать ВООБЩЕ из командной строки - только из окна «Выполнить». В командной строке он вообще ничего не делает. Это точно работает из командной строки или из командного файла или только из окна Выполнить? - person Jerry Jeremiah; 26.05.2016
comment
rundll32.exe согласно doc может запускать только те процедуры, которые были специально разработаны для этой цели, потому что они должны анализировать часть необязательных аргументов. Функции типа MessageBox не были разработаны таким образом. Почему работает через Win + R (Run box), пока большой вопрос! - person Yuriy Pozniak; 31.10.2018

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

person Franco    schedule 22.07.2012
comment
Windows cmd.exe сообщает: «msg» не распознается как внутренняя или внешняя команда, работающая программа или командный файл. - person Anthony Hatzopoulos; 11.10.2012
comment
@AnthonyHatzopoulos, потому что он поддерживается только в XP - person pattyd; 31.07.2013
comment
@pattyd XP и выше, собственно говоря - person Jesan Fafon; 11.09.2014
comment
@JesanFafon нет, он был прекращен после XP ... Я думаю, вы имеете в виду XP и ранее - person pattyd; 15.09.2014
comment
@pattyd В Windows 8.1 where msg возвращает C:\Windows\System32\msg.exe. Я думаю, вы думаете о net send - person Jesan Fafon; 15.09.2014

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


  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}
person someone23432    schedule 26.08.2015

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

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"

person T.Todua    schedule 25.11.2016
comment
@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. - person cdlvcdlv; 19.06.2018
comment
@cdlvcdlv Я обновил ответ. теперь он должен работать для всех, пересмотрите его. - person T.Todua; 20.06.2018
comment
Это действительно работает ... при условии, что в текущем каталоге нет файла с именем x или вы не против его потерять. - person cdlvcdlv; 20.06.2018
comment
Вы взяли отлично работающий комментарий и сломали его. Затем вы попытались добавить некоторую ценность (я согласен), но затем ценой потери любого файла с не таким уж маловероятным именем. Если кто-то (из любопытства) попробует ваш код с такой неудачей, он потеряет файл навсегда. Кроме того, если существует папка с именем x, ваша команда просто не работает. Не благодари меня, а просто исправь свой код. Вам даже не нужно использовать однострочник. И если вы думаете, что ваш код настолько хорош, опубликуйте его в Code Review. - person cdlvcdlv; 22.06.2018
comment
Какая неблагодарность .... Я не сломался, но обновил, объяснил и даже дал автоматическое решение ... (но есть такие люди, как вы, которых я не могу удовлетворить). удачи - person T.Todua; 23.06.2018
comment
(Извините за это составное сообщение, но мне кажется, что я должен объяснить очевидные вещи.) Хорошо, EMPTY_FILE123 - маловероятное имя для важного файла или папки. Между прочим, вы меня не знаете, поэтому, пожалуйста, не ставьте меня в категорию, перестаньте изображать жертву и менять тему (в отличие от вас, я здесь эмоционально не вовлечен - неблагодарность ??) . Возвращаясь к теме, ИМХО ваш код раньше был рискованным, а теперь это просто ленивый взлом (oms, у вас 25,4 тыс. Репутации). Хотите более разумной критики? ... - person cdlvcdlv; 25.06.2018
comment
... Вы знаете, что определение длины строки - нетривиальная задача без создания временного файла; но вы могли (и должны были) создать подпрограмму! Фактически, делать это однострочным не имеет смысла, потому что вам нужно жестко закодировать сообщение, так зачем вам, черт возьми, нужны автоматические сообщения? Вы также могли жестко указать ширину! Вы на самом деле жестко кодируете имя файла в однострочном коде с жестко запрограммированным сообщением, которое автоматически вычисляет столбцы ?! (Первоначальный комментарий был просто примером для демонстрации техники.) ... - person cdlvcdlv; 25.06.2018
comment
... А что, если многие параллельные экземпляры пакета используют это имя в одной и той же папке? Какой беспорядок ... Вы можете сделать лучше, и вы знаете (и я знаю, что знаете ...), но не ожидайте, что люди проголосуют за это как за полезный ответ. Так что не останавливайтесь на достигнутом, оправдывайте свою репутацию и как следует завершите работу. - person cdlvcdlv; 25.06.2018
comment
@cdlvcdlv хорошо, я понимаю, ответ не для вас. но есть и другие, кому это поможет. thnx. - person T.Todua; 25.06.2018

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

Вы можете установить тайм-аут заголовка и даже сон, чтобы запланировать его для последнего & \ 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>
person RDR    schedule 06.02.2020

ему нужно ТОЛЬКО всплывающее окно внутри виртуальной машины, поэтому технически должен быть какой-то код вроде:

if %machine_type% == virtual_machine then
   echo message box code
else
   continue normal installation code
person Illegal Alien    schedule 15.07.2015
comment
отрицательный, потому что установка не будет продолжена, если (% machine_type% == virtual_machine) == true - person anion; 26.03.2019