显示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 send
或msg
。 net 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为可执行文件。
-
简单的消息框
%extd% /messagebox Title Text
-
错误消息框
%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}
你可以从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