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

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

20 ответов


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

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

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

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

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

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


прежде всего, 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 переключатель.


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

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

START CMD /C "ECHO My Popup Message && PAUSE"

попробуй :

Msg * "insert your message here" 

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

открытие нового окна 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>

затем вы сохраните это как a .файл vbs (путем ввода ".vbs "в конце имени файла), сохранить как "все файлы" в раскрывающемся списке под именем файла (поэтому он не сохраняет как .txt), затем нажмите Сохранить!


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

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

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

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

1) самый geekiest и hackiest-он использует IEXPRESS для создания небольшого exe, который создаст всплывающее окно с одной кнопкой (он может создавать еще два типа всплывающих сообщений). Работает на каждой windows от 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 hybrid (должен быть сохранен как bat). Он снова использует JavaScript, несмотря на запрос OP, но, поскольку это bat, его можно назвать файлом bat без беспокойства. Он использует всплывающие что позволяет немного больше контроля, чем более популярные функции 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 hybrid (должен быть сохранен как .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, который создает всплывающее окно (может быть вызван из командной строки или из bat если установки 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

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  

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

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


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

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

вы можете изменить последний параметр " 0x0 " для отображения различных значков в диалоговом окне, например. 0x40 показывает "информационную метку". См.Метод Всплывающих Окон для справки.

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


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

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


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


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

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


msg * /time:0 /w Hello everybody!

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


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

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

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


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

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

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


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


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


  1. Простой Messagebox

    %extd% /messagebox Title Text
    

  1. Ошибка Messagebox

    %extd% /messagebox  Error "Error message" 16
    
  2. Отмена Повторите Попытку Messagebox

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

4) "Никогда не спрашивать " Messagebox

%extd% /messageboxcheck Title Message 0 {73E8105A-7AD2-4335-B694-94F837A38E79}

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

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"


ему нужно только всплывать, когда внутри виртуальной машины, поэтому технически должен быть какой-то код, например:

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