批处理脚本中的非模态通知框

时间:2009-04-16 15:47:10

标签: batch-file notifications alerts

我想要一个非模态警报框,称为表单批处理文件。目前我正在使用vbscript创建一个模态警报框:

>usermessage.vbs ECHO WScript.Echo^( "Generating report - this may take a moment." ^)
WSCRIPT.EXE usermessage.vbs

但我想继续编写脚本(生成报告)而不等待用户交互。我怎么能做到这一点?我不在乎它是否是vbscript - 我只是希望它可以从我的批处理脚本(在Windows XP中)工作。

2 个答案:

答案 0 :(得分:2)

对当前技巧没有新要求的简单答案是使用start命令从批处理文件执行中分离脚本。

这看起来像是:

>usermessage.vbs ECHO WScript.Echo^( "Generating report - this may take a moment." ^)
start WSCRIPT.EXE usermessage.vbs
echo This text is a proxy for the hard work of writing the report

唯一的区别是使用start来运行wscript。这确实遭受了它在当前目录中留下临时文件的缺陷,并且该框确实需要最终手动关闭。

这两个问题都很容易处理:

@echo off
setlocal 
set msg="%TMP%\tempmsg.vbs"
ECHO WScript.Echo^( "Generating report - this may take a moment." ^) >%msg% 
start WSCRIPT.EXE /I /T:15 %msg%
echo This text is a proxy for the hard work of writing the report
ping -n 5 127.0.0.1 >NULL
del %msg% >NUL 2>&1

在这里,我将临时脚本移到%TMP%文件夹,并记得在完成后将其删除。我使用echoping命令浪费了一些时间来演示一个长时间的进程。并且,我使用/I/T选项来wscript确保脚本以“交互方式”运行,并设置允许脚本运行的最长时间。

@echo offsetlocal使其在命令提示符下运行时看起来更干净,并防止它在提示符的环境中保留名称`%msg%。

编辑:JohannesRössel在评论中对setlocal的批评是不正确的。如果在命令提示符下调用此方法,则在没有setlocal的情况下,变量msg将对提示以及从该提示启动的其他批处理文件和程序可见。优良作法是使用setlocal隔离批处理文件中的局部变量(如果实际上编写的东西不仅仅是一个抛弃脚本)。

这很容易证明:

C:> type seta.bat 
@set A=SomeValue

C:> set A
ALLUSERSPROFILE=C:\Documents and Settings\All Users
APPDATA=C:\Documents and Settings\Ross\Application Data

C:> seta.bat

C:> set A
A=SomeValue
ALLUSERSPROFILE=C:\Documents and Settings\All Users
APPDATA=C:\Documents and Settings\Ross\Application Data

C:>

答案 1 :(得分:0)

我为同样的问题而苦苦挣扎,我有一个VBScript,它需要弹出一个消息框,但不能停止并继续。我想在一段时间后关闭。这对我有用。本质上,一个vbscript创建另一个vbscript文件,然后使用shellexecute执行该消息框文件,超时时间为15秒。

Set wshShell = CreateObject( "WScript.Shell" )
tmpPath = wshShell.ExpandEnvironmentStrings( "%TMP%" )
set wshShell = Nothing

msgFile = tmpPath & "\tempmsg.vbs"
Set fs = CreateObject("Scripting.FileSystemObject")
Set objFile = fs.CreateTextFile(msgFile,True)
objFile.Write "MsgBox " & chr(34) & "It worked!" & chr(34) & vbCrLf
objFile.Close
Set fs = Nothing

dim objShell
set objShell = CreateObject("shell.application")
objShell.ShellExecute "cscript.exe", "/I /T:15 " & (char34) & msgFile & chr(34), "", "open", 0
set objShell = Nothing