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