Есть ли способ отобразить окно сообщения из командного файла (аналогично тому, как xmessage можно использовать из bash-скриптов в Linux)?
Показать всплывающее окно / окно сообщения из командного файла Windows
Ответы (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 ссылка, если вас интересует иду по этому маршруту.
Прежде всего, 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.
msg "%username%" Some message to display отлично справляется со своей задачей на XP
- person dan richardson; 28.06.2012
msg "$USERNAME" Some message to display для Cygwin / MSYS
- person qwertzguy; 09.05.2016
Console в качестве имени sessionname, например, msg Console "Some message to display".
- person Anthony Geoghegan; 05.09.2016
Может отображаться небольшая вспышка, но временные файлы не требуются. Должен работать вплоть до эры (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^(^);
)
close() was unexpected at this time.
- person eye_mew; 24.04.2014
^ escape-символы в файле bat
- person phuclv; 29.06.2015
Появится другое окно командной строки:
START CMD /C "ECHO My Popup Message && PAUSE"
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
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. ), затем нажмите Сохранить!
<script/> вам не нужен.
- person surfasb; 26.10.2011
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
Таким образом, ваш командный файл создаст сценарий 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» на значение ниже, чтобы отображать значки в диалоговом окне (см. Метод всплывающих окон для получения дополнительной информации):
0x10 Стоп
Вопросительный знак 0x20
0x30 восклицательный знак
информационная метка a> 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 %SESSIONNAME% msg
- person Fowl; 16.01.2014
msg * /time:0 /w Hello everybody!
Это сообщение ожидает бесконечно, пока не будет нажата кнопка ОК (по умолчанию оно длится всего одну минуту) и отлично работает в Windows 8.1.
msg * /time:0 /w <C:\Somewhere\Message.txt где в файле - обычный текст (содержащий CrLf).
- person MoE bis; 04.12.2016
Для этого вам понадобится небольшая программа, которая отображает окно сообщения и запускает его из вашего командного файла.
Вы можете открыть окно консоли, которое отображает приглашение, но получить окно сообщения GUI с помощью cmd.exe и друзей невозможно, AFAIK.
Я использую утилиту под названием msgbox.exe отсюда: http://www.paulsadowski.com/WSH/cmdprogs.htm
Следуя ответу @Fowl, вы можете улучшить его с помощью тайм-аута, который будет отображаться только в течение 10 секунд, используя следующее:
mshta "javascript:var sh=new ActiveXObject( 'WScript.Shell' ); sh.Popup( 'Message!', 10, 'Title!', 64 );close()"
Дополнительные сведения см. здесь.
Вы можете вызвать функцию dll из user32.dll, я думаю, что-то вроде
Rundll32.exe user32.dll, MessageBox (0, "текст", "titleText", {дополнительные флаги для подобного самого верхнего сообщения e.t.c})
Набирая его с моего телефона, не судите меня ... иначе я бы добавил лишние флаги.
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
msg * /server:127.0.0.1 Введите здесь свое сообщение
where msg возвращает C:\Windows\System32\msg.exe. Я думаю, вы думаете о net send
- person Jesan Fafon; 15.09.2014
Это приложение может сделать это, если вы конвертируете (переносите) свои командные файлы в исполняемые файлы.
Простое окно сообщения
%extd% /messagebox Title Text
Окно сообщения об ошибке
%extd% /messagebox Error "Error message" 16Окно сообщения "Отменить попытку снова"
%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"
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
x или вы не против его потерять.
- person cdlvcdlv; 20.06.2018
x, ваша команда просто не работает. Не благодари меня, а просто исправь свой код. Вам даже не нужно использовать однострочник. И если вы думаете, что ваш код настолько хорош, опубликуйте его в Code Review.
- person cdlvcdlv; 22.06.2018
EMPTY_FILE123 - маловероятное имя для важного файла или папки. Между прочим, вы меня не знаете, поэтому, пожалуйста, не ставьте меня в категорию, перестаньте изображать жертву и менять тему (в отличие от вас, я здесь эмоционально не вовлечен - неблагодарность ??) . Возвращаясь к теме, ИМХО ваш код раньше был рискованным, а теперь это просто ленивый взлом (oms, у вас 25,4 тыс. Репутации). Хотите более разумной критики? ...
- person cdlvcdlv; 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>
ему нужно ТОЛЬКО всплывающее окно внутри виртуальной машины, поэтому технически должен быть какой-то код вроде:
if %machine_type% == virtual_machine then
echo message box code
else
continue normal installation code