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

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

23 ответа

Решение

Я хотел бы сделать очень простой файл 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, просто не 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 переключатель.

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

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

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

Пытаться:

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

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

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) И подход 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

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

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

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

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

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

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

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

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 * "вставьте ваше сообщение сюда"

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

msg * /time:0 /w Hello everybody!

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


  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}

Я бы создал пакетную подпрограммуMSGBOXкак показано ниже, который вы можете вызвать затем через

      call :MSGBOX "Test-Message 1" "Test-Title 1"

так часто, как вы хотите.

Например:

      @ECHO OFF

:: call message box sub-routine
call :MSGBOX "Test-Message 1" "Test-Title 1"
call :MSGBOX "Test-Message 2" "Test-Title 2"

:END
EXIT /B


::::::::::::::::
:: sub-routines

:MSGBOX
:: 1. parameter: message
:: 2. parameter: title

:: find temporary name for VBS file
:uniqueLoop
set "uniqueFileName=%tmp%\msgbox~%RANDOM%.vbs"
if exist "%uniqueFileName%" goto :uniqueLoop

:: write to temporary VBS file, execute, delete file
echo msgbox"%~1",vbInformation , "%~2"> %uniqueFileName% 
%uniqueFileName% 
erase %uniqueFileName%
EXIT /B

Bat файл:

      @echo off
echo wscript.Quit((msgbox("question?",4+32+256, "title")-6) Mod 255) > %temp%\msgbox.vbs
start /wait %temp%\msgbox.vbs
rem echo wscript returned %errorlevel%
if errorlevel 1 goto error
echo We have Yes
goto end
:error
echo We have No
:end
del %temp%\msgbox.vbs /f /q

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

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"

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

if %machine_type% == virtual_machine then
   echo message box code
else
   continue normal installation code
Другие вопросы по тегам