Немодальное окно уведомлений из пакетного скрипта - PullRequest
1 голос
/ 16 апреля 2009

Я хотел бы иметь немодальное окно предупреждения, называемое формой командного файла. В настоящее время я использую vbscript для создания модального окна предупреждения:

>usermessage.vbs ECHO WScript.Echo^( "Generating report - this may take a moment." ^)
WSCRIPT.EXE usermessage.vbs

Но я бы хотел продолжить работу со сценарием (создание отчета), не дожидаясь взаимодействия с пользователем. Как я могу сделать это? Мне все равно, vbscript или нет - я просто хочу, чтобы он работал из моего пакетного скрипта (в Windows XP).

1 Ответ

2 голосов
/ 25 апреля 2009

Простой ответ, который не предъявляет никаких новых требований к вашему текущему трюку, заключается в использовании команды 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:>
...