2009-04-16 166 views
1

非模态通知框,我想有一个名为form的批处理文件,一个非模态警告框。目前我使用VBScript来创建一个模态对话框:从批处理脚本

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

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

具有超过当前的伎俩没有新的要求

回答

2

简单的回答是使用start命令从批处理文件执行分离的脚本。

这可能看起来像:其中,唯一的区别是使用start运行wscript

 
>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 

。这确实受到它留下临时文件放置在当前目录中的缺陷的影响,并且该框确实需要最终手动解除。

这两个问题都好办:

 
@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

很抱歉,但你假设的cmd.exe是太像* nix的外壳。在命令提示符处调用的每个批处理文件都由该cmd.exe的副本进行解释,并且确实可以更改其他命令的环境。这就是为什么添加setlocal的原因。但是,如果从资源管理器调用批处理文件,则无误。从DOS 1.0和COMMAND.COM开始就是这样,至少在XP中保持真实。 – RBerteig 2009-04-25 06:03:51