显示Windowsbatch file中的popup框/消息框

有没有办法显示batch file中的消息框(类似于如何在Linux中使用bash脚本中的xmessage )?

我会做一个非常简单的VBScript文件,并使用CScript来parsing命令行参数。

像下面的内容保存在MessageBox.vbs

 Set objArgs = WScript.Arguments messageText = objArgs(0) MsgBox messageText 

你会这样称呼:

 cscript MessageBox.vbs "This will be shown in a popup." 

MsgBox参考,如果你有兴趣去这条路线。

首先,DOS与它无关,你可能需要一个Windows命令行解决scheme(再次:没有DOS,纯Windows,只是不是一个窗口,而是一个控制台)。

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

 net send localhost Some message to display 

尽pipe这也取决于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^(^); ) 

这将popup另一个命令提示符窗口:

 START CMD /C "ECHO My Popup Message && PAUSE" 

试试:

 Msg * "insert your message here" 

如果您使用的是Windows XP的command.com,则会打开一个消息框。

打开一个新的cmd窗口不是你所要求的,我收集。 您也可以使用VBScript ,并将其与.bat文件一起使用。 你可以用这个命令从bat文件中打开它:

 cd C:\"location of vbscript" 

这样做是改变目录command.com将search文件,然后在下一行:

 "insert name of your vbscript here".vbs 

然后,您创build一个新的记事本文档,键入

 <script type="text/vbscript"> MsgBox "your text here" </script> 

然后将其保存为.vbs文件(在文件名末尾加上“.vbs”),在文件名下方的下拉框中保存为“所有文件”(所以它不保存为.txt ),然后点击保存!

这样你的batch file将创build一个VBS脚本并显示一个popup窗口。 运行后,batch file将删除该中间文件。

使用MSGBOX的好处是,它实际上是可以习惯的(改变标题,图标等),而MSG.exe不是那么多。

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

还有更多的方法。

1)极客最疯狂 – 它使用IEXPRESS来创build一个小的EXE,它将创build一个button( 它可以创build另外两种types的popup消息 ) 的popup式窗口 。 适用于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计算机(尽pipeOP不希望“外部”的语言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,尽pipe有OP请求,但是因为它是一个bat,所以它可以被称为bat文件而不用担心。 它使用了POPUP ,比起更stream行的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创build一个popup窗口(可以从命令行调用,或者如果安装了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" 

消息*“在这里插入您的消息”

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

 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 

为了做到这一点,你需要有一个小程序,显示一个消息框,并从batch file中运行。

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

这是一个PowerShell变体,在创build窗口之前不需要加载程序集,但是运行速度明显比由@npocmaka在这里发布的PowerShell MessageBox命令慢(〜+ 50%):

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

你可以改变最后的“0x0”参数来在对话框中显示不同的图标,例如。 0x40显示“信息标记”。 请参阅Popup方法以供参考。

摘自Microsoft TechNet文章PowerTip:使用PowerShell显示popup窗口 。

我从这里使用一个名为msgbox.exe的工具: http : //www.paulsadowski.com/WSH/cmdprogs.htm

 msg * /time:0 /w Hello everybody! 

这个消息一直等到OK被点击(默认只有一分钟),并且在Windows 8.1中工作正常

你可以使用Zenity 。 Zenity允许在命令行和shell脚本中执行对话框。 更多信息也可以在Wikipedia上find。

它是跨平台的:Windows的Windows安装程序可以在这里find。

msg * /server:127.0.0.1在这里input你的信息

这个应用程序可以做到这一点,如果你转换(包装)你的batch file为可执行文件。


  1. 简单的消息框

     %extd% /messagebox Title Text 

  1. 错误消息框

     %extd% /messagebox Error "Error message" 16 
  2. 取消再试一次Messagebox

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

4)“永远不要再问我”Messagebox

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

你可以从user32.dll中调用dll函数,我觉得是这样的

Rundll32.exe user32.dll,MessageBox(0,“文本”,“titleText”,{额外的标志像最顶级的消息框等})

从我的电话打字,不要评判我,否则我会链接额外的标志。

在@ Fowl的回答之后,你可以使用下面的超时改进它,只出现10秒:

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

在这里看到更多的细节。

一个更好的select
start cmd /c "@echo off & mode con cols=12 lines=2 & echo My Message & pause>nul"

用法
cols=消息中的字符数量,加上2
lines=数量,再加上1

(感谢@ender_scythe

它只需要在vm内popup,所以在技术上应该有一些代码:

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