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



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

1541   20  

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, чистые окна, просто не окно, а консоль).

вы можете либо использовать метод 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.ехе не так много.

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

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

1) самый выродок и 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 без проблем. Он использует 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 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) и подход дбенхэма виден здесь

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 показывает "информационную метку". Смотрите Popup Метод для справки.

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

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

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

Я использую утилиту с именем 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.exe user32.проблемы, функции MessageBox (0, "текст", "titleText", {дополнительные флаги для как высшей функции MessageBox е.Т.с})

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

следуя ответу @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) "Никогда не спрашивать " Сообщение

%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

Comments

    Ничего не найдено.