Показать всплывающее окно/окно сообщения из пакетного файла Windows
-
13-09-2019 - |
Вопрос
Есть ли способ отобразить окно сообщения из пакетного файла (аналогично тому, как xmessage
можно использовать из bash-скриптов в Linux)?
Решение
Я бы создал очень простой файл 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 (опять же:никакого ДОСа, чистая винда, только не винда, а консоль).
Вы можете либо использовать метод 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
выключатель.
Может отображаться небольшая вспышка, но временные файлы не требуются.Должно работать вплоть до эпохи (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"
Если вы используете команду 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). ), затем нажмите «Сохранить!»
Таким образом, ваш командный файл создаст сценарий VBS и отобразит всплывающее окно.После запуска командный файл удалит этот промежуточный файл.
Преимущество использования MSGBOX заключается в том, что его действительно можно настраивать (изменять заголовок, значок и т. д.), тогда как MSG.exe не так уж и много.
echo MSGBOX "YOUR MESSAGE" > %temp%\TEMPmessage.vbs
call %temp%\TEMPmessage.vbs
del %temp%\TEMPmessage.vbs /f /q
Еще несколько способов.
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-файл.Оно использует НЕОЖИДАННО ВОЗНИКНУТЬ что позволяет немного больше контроля, чем более популярный 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) Для уведомлений на панели задач вы можете попробовать этот:
call SystemTrayNotification.bat -tooltip warning -time 3000 -title "Woow" -text "Boom" -icon question
Вот вариант PowerShell, который не требует загрузки сборок перед созданием окна, однако он работает заметно медленнее (~ +50%), чем команда PowerShell MessageBox, опубликованная здесь @npocmaka:
powershell (New-Object -ComObject Wscript.Shell).Popup("""Operation Completed""",0,"""Done""",0x0)
Вы можете изменить последний параметр с «0x0» на значение ниже, чтобы в диалоговом окне отображались значки (см. Метод всплывающего окна для дальнейшего использования):
0x10 Стоп
0x20 Вопросительный знак
0x30 Восклицательный знак
0x40 Информационный знак
Адаптировано из статьи Microsoft TechNet. Совет по мощности:Используйте 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 (после символа «+») можно написать любые числа от 16,32,48,64 и вот значение каждого числа:
16 – Critical Icon
32 – Warning Icon
48 – Warning Message Icon
64 – Information Icon
Msg * "вставьте сюда свое сообщение"
работает нормально, просто сохраните файл .bat в блокноте или убедитесь, что для формата установлено значение «все файлы».
Для этого вам понадобится небольшая программа, которая отображает окно сообщений и запускает ее из командного файла.
Однако вы можете открыть окно консоли, в котором отображается приглашение, но получить окно сообщения графического интерфейса с помощью cmd.exe и друзей невозможно, AFAIK.
Я использую утилиту msgbox.exe отсюда:http://www.paulsadowski.com/WSH/cmdprogs.htm
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()"
Видеть здесь Больше подробностей.
Вы можете вызвать функцию dll из user32.dll я думаю Что-то вроде
Rundll32.exe user32.dll, MessageBox (0, «text», «titleText», {дополнительные флаги для верхнего окна сообщений и т. д.})
Пишу с телефона, не судите меня...в противном случае я бы связал дополнительные флаги.
msg * /server:127.0.0.1 Введите здесь свое сообщение
Этот приложение можно сделать это, если вы конвертируете (обертываете) свои пакетные файлы в исполняемые файлы.
Простое окно сообщений
%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=
количество строк плюс 1cols=
количество символов в сообщении плюс 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