Есть ли способ отобразить окно сообщения из командного файла (аналогично тому, как xmessage
можно использовать bash-скрипты в Linux)?
Есть ли способ отобразить окно сообщения из командного файла (аналогично тому, как 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 (опять-таки: нет 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
выключателем.
Может показывать небольшую вспышку, но никаких временных файлов не требуется. Должен работать вплоть до эры 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^(^);
)
close() was unexpected at this time
.
^
escape-символы в файле bat
Откроется другое окно командной строки:
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.
cmd /k
Пытаться :
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/>
тег.
msg *
вам будет предложено ввести сообщение, а затем Ctrl-Z. Здесь вы можете ввести разрывы строк, которые появятся в вашем сообщении.
Еще несколько способов.
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» на значение ниже для отображения значков в диалоговом окне (см. « Метод всплывающих окон» для дальнейшего использования):
0x10 Стоп
0x20 Вопросительный знак
0x30 Восклицательный знак
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
msg * /time:0 /w Hello everybody!
Это сообщение ждет до тех пор, пока не будет нажата кнопка ОК (по умолчанию оно длится всего одну минуту) и работает нормально в Windows 8.1
msg * /time:0 /w <C:\Somewhere\Message.txt
где в файле обычный текст (содержащий CrLf).
Для этого вам нужна небольшая программа, которая отображает окно сообщения и запускает его из вашего пакетного файла.
Вы можете открыть консольное окно, в котором отображается приглашение, но получить окно сообщения с графическим интерфейсом, используя cmd.exe и только друзей, невозможно, AFAIK.
Я использую утилиту с именем msgbox.exe отсюда: http://www.paulsadowski.com/WSH/cmdprogs.htm
Вы можете вызвать функцию DLL из user32.dll я думаю, что-то вроде
Rundll32.exe user32.dll, MessageBox (0, «текст», «titleText», {дополнительные флаги для самого верхнего окна сообщений и т. Д.})
Печатая это с моего телефона, не судите меня ... в противном случае я бы связал дополнительные флаги.
rundll32.exe user32.dll,MessageBoxA X
отобразить окно сообщения с X в качестве заголовка, когда я делаю это в поле «Выполнить». Независимо от того, что я делаю X быть, я не могу интерпретировать его как несколько параметров - все идет в заголовок. Таким образом, rundll32.exe user32.dll,MessageBoxA (0, "MyTitle", "MyText", 0)
отображается окно сообщения с заголовком (0, "MyTitle", "MyText", 0)
Но я не могу заставить его работать ВСЕ из командной строки - только из поля Выполнить. В командной строке это вообще ничего не делает. Работает ли он наверняка из командной строки или из пакетного файла или только из поля «Выполнить»?
msg * /server:127.0.0.1 Введите ваше сообщение здесь
where msg
возвращается C:\Windows\System32\msg.exe
. Я думаю, что вы думаете оnet send
Это приложение может сделать это, если вы преобразуете (упаковываете) свои командные файлы в исполняемые файлы.
Простое окно сообщений
%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.
x
в текущем каталоге нет файла, или вы не против потерять его.
x
, ваша команда просто не выполняется. Не благодари меня и, пожалуйста, просто исправь свой код. Вам даже не нужно использовать однострочник. И если вы считаете, что ваш код настолько хорош, пожалуйста, опубликуйте его в Code Review .
Вот мой пакетный скрипт, который я собрал, основываясь на хороших ответах здесь и в других постах
Вы можете установить тайм-аут заголовка и даже сон, чтобы запланировать его для последнего и \ n для новой строки
Назовите его popup.bat и поместите его в папку Windows Path для глобальной работы на вашем компьютере.
Например, popup Line 1\nLine 2
появится 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>
он должен появиться ТОЛЬКО в vm, так что технически должен быть такой код:
if %machine_type% == virtual_machine then
echo message box code
else
continue normal installation code