Показать всплывающее окно / сообщение из пакетного файла 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^(^);
)
попробуй :
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
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()"
посмотреть здесь для получения более подробной информации.
этой приложение может это сделать, если вы конвертируете (переносите) свои пакетные файлы в исполняемые файлы.
-
Простой Messagebox
%extd% /messagebox Title Text
-
Ошибка Messagebox
%extd% /messagebox Error "Error message" 16
-
Отмена Повторите Попытку 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