显示 Windows 批处理文件中的弹出/消息框

有没有一种方法可以显示批处理文件中的消息框(类似于如何从 Linux 中的 bash 脚本使用 xmessage) ?

669420 次浏览

为此,您需要一个小程序来显示一个消息框,并从批处理文件中运行该消息框。

您可以打开一个显示提示符的控制台窗口,但是仅使用 cmd.exe 和好友获得 GUI 消息框是不可能的,AFAIK。

我将创建一个非常简单的 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,只是不是一个窗口,而是一个控制台)。

您可以使用 boflynn 提供的 VBScript 方法,也可以错误地使用 net sendmsgnet send仅适用于旧版本的窗口:

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"

试试:

Msg * "insert your message here"

如果您正在使用 WindowsXP 的 command.com,这将打开一个消息框。

打开一个新的 cmd 窗口并不是你想要的,我想。 您还可以使用 VBScript,并将它与您的。蝙蝠档案。您可以使用以下命令从 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”) ,在文件名下面的下拉框中保存为“ All Files”(这样它就不会另存为。Txt) ,然后单击 Save!

我从这里使用一个名为 msgbox.exe 的实用程序: Http://www.paulsadowski.com/wsh/cmdprogs.htm

Msg * “插入你的信息”

可以正常工作,只需在记事本中保存为.bat 文件或确保格式设置为“所有文件”即可

这样,您的批处理文件将创建一个 VBS 脚本并显示一个弹出窗口。运行后,批处理文件将删除该中间文件。

使用 MSGBOX 的好处是它真的是可定制的(更改标题、图标等) ,而 MSG.exe 没有那么多。

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

可能会显示一个小闪光灯,但不需要临时文件。应该可以追溯到(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^(^);
)

您可以使用 Zenity,它在 Download.gnome.org上发布常规版本。Zenity 允许在命令行脚本和 shell 脚本中执行对话框。更多的信息也可以在 维基百科上找到。

它是跨平台的,但我找不到最近的 win32构建。不幸的是,Placella.com 网站下线了.从2016年3月开始,可以找到 v3.20的 Windows Installer。

Msg */server: 127.0.0.1在这里输入您的消息

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

还有别的办法。

1) The geekest and hackest-it using The IEXPRESS to create small exe that will create a pop-up with a single Button (它可以创建另外两种类型的弹出消息).适用于 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。也可以在 XP 及以上版本的 Windows 机器上运行(尽管 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)。尽管有 OP 请求,它仍然使用了 JavaScript,但由于它是一个 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杂种(应保存为 .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""")

德贝纳姆氏切口见 给你

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

它只需要在虚拟机中弹出,所以从技术上讲,应该有一些代码,比如:

if %machine_type% == virtual_machine then
echo message box code
else
continue normal installation code

这个 申请可以做到这一点,如果你转换(包装)您的批处理文件成可执行文件。


  1. 简单信箱

    %extd% /messagebox Title Text
    

  1. Error Messagebox

    %extd% /messagebox  Error "Error message" 16
    
  2. Cancel Try Again Messagebox

    %extd% /messagebox Title "Try again or Cancel" 5
    

4) "Never ask me again" Messagebox

%extd% /messageboxcheck Title Message 0 {73E8105A-7AD2-4335-B694-94F837A38E79}

我认为你可以从 user32.dll 调用 dll 函数 差不多

Rundll32.exe user32.dll,MessageBox (0,“ text”,“ titleText”,{其他标志表示最顶端的 MessageBox e.t.c })

用我的手机打出来,不要评判我... 否则我会连接额外的标志。

msg * /time:0 /w Hello everybody!

此消息将永远等待,直到单击 OK (默认情况下只持续一分钟) ,并且在 Windows 8.1中运行良好

更好的选择

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"

下面是 PowerShell 的一个变体,它不需要在创建窗口之前加载程序集,但是它的运行速度明显比 PowerShell MessageBox 命令慢(~ + 50%):

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

您可以将最后一个参数从“0x0”更改为下面的一个值,以便在对话框中显示图标(请参阅 弹出式方法以获得进一步的参考) :

< img src = “ https://i.stack.imgur.com/nWMdU.png”alt = “ Stop”> < img src = “ https://i.stack.imgur.com/nWMdU.png”alt = “ Stop”>第十季,第10集
问号 < br > < img src = “ https://i.stack.imgur.com/vnNZ5.png”alt = “惊叹号”> 0x30叹号 < br > 信息标记

改编自 TechNet 文章。

按照@Fowl 的回答,你可以使用下面的方法改进它,设置超时时间为10秒:

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

有关详细信息,请参阅 给你

这里是我的批处理脚本,我放在一起的基础上好的答案在这里和在其他职位

您可以设置标题超时,甚至休眠,以安排它为后来 & n 为新的一行

将其命名为 popup.bat 并将其放入您的 Windows 路径文件夹中,以便在您的电脑上全局运行

例如,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>

蝙蝠档案:

@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

我将创建一个批处理子程序 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