Простой ответ, который не предъявляет никаких новых требований к вашему текущему трюку, заключается в использовании команды start
для отсоединения сценария от выполнения пакетного файла.
Это может выглядеть примерно так:
>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
, где единственная разница заключается в использовании start
для запуска wscript
. Это страдает от недостатка, заключающегося в том, что временный файл остается в текущем каталоге и в конечном итоге его необходимо удалить вручную.
Обе проблемы просты в решении:
@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% в среде приглашения.
Редактировать: Критика Йоханнесом Ресселем 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:>