2009-04-16 163 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