1

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

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

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

4

2 回答 2

2

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

这可能看起来像:

>usermessage.vbs ECHO WScript.Echo^("生成报告 - 这可能需要一点时间。" ^)
启动 WSCRIPT.EXE usermessage.vbs
echo 这段文字代表了写报告的辛勤工作

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

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

@echo 关闭
设置本地
设置 msg="%TMP%\tempmsg.vbs"
ECHO WScript.Echo^("正在生成报告 - 这可能需要一点时间。" ^) >%msg%
启动 WSCRIPT.EXE /I /T:15 %msg%
echo 这段文字代表了写报告的辛勤工作
ping -n 5 127.0.0.1 >NULL
删除 %msg% >NUL 2>&1

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

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

编辑: Johannes Rösselsetlocal在评论中的批评是不正确的。如果在命令提示符下调用它,则没有setlocal变量 msg 将对提示符以及从该提示符启动的其他批处理文件和程序可见。setlocal如果一个人实际上编写的不仅仅是一次性脚本,那么使用隔离批处理文件中的局部变量是一种很好的做法。

这很容易证明:

C:> 输入 seta.bat
@set A=SomeValue

C:>设置A
ALLUSERSPROFILE=C:\Documents and Settings\所有用户
APPDATA=C:\Documents and Settings\Ross\Application Data

C:> seta.bat

C:>设置A
A=某个值
ALLUSERSPROFILE=C:\Documents and Settings\所有用户
APPDATA=C:\Documents and Settings\Ross\Application Data

C:>
于 2009-04-25T01:43:24.190 回答
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
于 2019-11-11T19:54:18.867 回答