2008-09-08 7 views
6

Я использую WScript для автоматизации некоторых задач, используя WScript.Shell для вызова внешних программ.WScript.Shell и блокирование выполнения?

Однако, сейчас он не ждет завершения внешней программы и вместо этого переходит. Это вызывает проблемы, потому что у меня есть некоторые задачи, зависящие от других, заканчивающих работу в первую очередь.

Я использую такой код:

ZipCommand = "7za.exe a -r -y " & ZipDest & BuildLabel & ".zip " & buildSourceDir 

Set wshShell = WScript.CreateObject("Wscript.Shell") 
wshShell.run ZipCommand 

Есть ли способ, чтобы сделать это так, он блокирует до оболочки выполняется возвратов программы?

ответ

5

Если вы используете метод «Exec», он возвращает ссылку, поэтому вы можете опросить свойство «Статус», чтобы определить, когда оно будет завершено. Вот пример из msdn:

Dim WshShell, oExec 
Set WshShell = CreateObject("WScript.Shell") 

Set oExec = WshShell.Exec(ZipCommand) 

Do While oExec.Status = 0 
    WScript.Sleep 100 
Loop 
+3

Преимущество использования Exec() вместо Run() заключается в том, что вы также можете получить доступ к StdOut & StdErr. Если вам все равно, Run() проще. –

13

Оказывается, что в то время как петля серьезна CPU боров: P

Я нашел лучший способ:

ZipCommand = "7za.exe a -r -y " & ZipDest & BuildLabel & ".zip " & buildSourceDir 

Set wshShell = WScript.CreateObject("Wscript.Shell") 

wshShell.Run ZipCommand,1,1 

Последние два аргумента Показать окно и Block Execution :)