我想要一个非模态警报框,称为表单批处理文件。目前我正在使用vbscript创建一个模态警报框:
>usermessage.vbs ECHO WScript.Echo^( "Generating report - this may take a moment." ^)
WSCRIPT.EXE usermessage.vbs
但我想继续编写脚本(生成报告)而不等待用户交互。我怎么能做到这一点?我不在乎它是否是vbscript - 我只是希望它可以从我的批处理脚本(在Windows XP中)工作。
答案 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%
文件夹,并记得在完成后将其删除。我使用echo
和ping
命令浪费了一些时间来演示一个长时间的进程。并且,我使用/I
和/T
选项来wscript
确保脚本以“交互方式”运行,并设置允许脚本运行的最长时间。
@echo off
和setlocal
使其在命令提示符下运行时看起来更干净,并防止它在提示符的环境中保留名称`%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