it-swarm.com.ru

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

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

135
billyy

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

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

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

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

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

MsgBox reference если вы заинтересованы в этом.

111
boflynn

Прежде всего, 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.

120
Joey

Может показывать небольшую вспышку, но никаких временных файлов не требуется. Должен работать вплоть до эры 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^(^);
)
83
Fowl

Это вызовет другое окно командной строки:

START CMD /C "ECHO My Popup Message && PAUSE"
69
Dave Webb

Пытаться :

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

33
Justsomen00b

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

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) И подход дбенхэма виден здесь

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

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

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

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

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

echo MSGBOX "YOUR MESSAGE" > %temp%\TEMPmessage.vbs
call %temp%\TEMPmessage.vbs
del %temp%\TEMPmessage.vbs /f /q
26
dc1
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  
10
p2013

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

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

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

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

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

9
User5910

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

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

7
Max Runacres

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

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

4
Macke
msg * /time:0 /w Hello everybody!

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

3
MoE bis

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

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

3
parvus

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

3
zhongshu

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

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

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

2
Entropy

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

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

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

2
Rafi

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


  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}
1
someone23432

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

1
Franco

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

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"

0
T.Todua