簡單的回答是使用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