vbs скрипт запуска программы
7. Работа с окнами и приложениями
Запуск внешних приложений из скрипта VBScript, применение объекта WshShell, методы Run(), AppActivate(), SendKeys()
7.1 Возможности объекта Wscript.Shell
set WshShell = WScript.CreateObject(«WScript.Shell»)
Сам запуск производится при помощи метода Run :
WshShell . Run «Имя_приложения»
Обычно существует две ситуации, когда нам нужно запустить приложения из скрипта:
1) запускаем утилиты командной строки (например, из Resource Kit ) и нам нужно получить то, что они возвращают
2) запускаем графическое приложение и передаем туда нажатия клавиш
При запуске утилиты командной строки обратить внимание на следующие моменты:
o если нам нужно возвращать код ошибки, делаем это следующим образом:
sReturn = WshShell.Run(«ping » & «192.168.1.2», 1, TRUE)
WshShell.Run(«%COMSPEC% /K dir»)
o для того, чтобы не зависеть от наличия утилит на компьютере пользователя, есть смысл выложить используемые утилиты на сервер в сети и обращаться к ним по сетевому имени;
При запуске графического приложения обычно есть необходимость передать в него нажатия клавиш. Для этой цели используются методы AppActivate (передача фокуса окну приложения) и SendKeys (передать нажатия клавиш)
Метод AppActivate позволяет передать фокус приложению. Ему передается заголовок окна приложения:
Далее используем метод SendKeys :
Vbs скрипт запуска программы
Выпуск #01
«Vbs, whs, js скрипты для администратора»
22 июля 2008
Как можно запустить скрипт?
Расмотрим процесс запуска самого простого скрипта (сценария). Для этого нужно на рабочем диске выделить место для хранения скриптов, пусть это будет диск c: и папка Script. Выполняются скрипты с помощью серверов сценариев, которые переводят команды текста в исполняемый код.
Интерпретаторы в Windows представлены двумя файлами: wscript.exe и cscript.exe. Оба позволяют работать с VBScript и JScript и применять все возможности административных скриптов. Отличия:
Отличия можно увидеть наглядно на примерах выполнения команды. Создадим самый простой скрипт.
Создаем файл vbs.
Вызовите проводник (чтобы открыть проводник, нажмите кнопку Пуск и выберите команды Программы, Стандартные и Проводник ), зайдите в пункт меню «Сервис\Свойства папки» и убедитесь, что у вас отключена галочка.
Выбираем диск c:, каталог Script и вставляем текстовый файл и переименувываем его в hello.vbs.
В сам файл внесем текст:
Данный скрипт выводит сообщение Hello!.
Рассмотрим варианты запуска этого скрипта.
1. Запуск скрипта с командной строки с помощью утилиты CScript.exe
Для запуска нашего скрипта с командной строки нужно вызвать консоль командной строки. В операционной системе выполните «Пуск\Выполнить. » и наберите cmd.exe. У вас вызовется консоль командной строки.
В консоле командной строки выполните команду CScript.exe c:\script\hello.vbs
Как видно из рисунка, наше сообщение вывелось в консоле.
В приложении 1 дан список ключей, для выполнения csript.exe. Допустим нам не хочется, чтобы выводился в командную строку логотип сервера сценариев, для этого надо запустить сценарий с командной CScript.exe c:\script\hello.vbs //Nologo.
2. Запуск скрипта с командной строки с помощью утилиты WScript.exe
Воспользуемся консолью, которую мы запустили для вызова скрипта с помощью утилиты CScript.exe. Вызовем скрипт с помощью утилиты WScript.exe набрав в окне консоли команду WScript.exe c:\Script\hello.vbs. Сообщение скрипта вывелось в виде всплывающего окошка.
3. Запуск скрипта используя команду»Пуск\Выполнить. «
при помощи утилиты WScript.exe
В операционной системе нажав «Пуск» и затем «Выполнить» выполним скрипт набрав ту же команду, что и в предыдущем примере: WScript.exe c:\Script\hello.vbs. Появится такое же окошко, что и в предыдущем примере.
4. Запуск скрипта с помощью файлового менеджера.
Выполнить скрипт можно с помощью любого файлового менеджера. Запустим Explover, выбирем диск c:, зайдем в папку Script и выполним файл hello.vbs нажав на нем двойной щелчок.
Приложения
Приложение 1
Запуск скриптов с помощью сервера скриптов для командной строки csript.exe
Для выполнения сценариев с помощью сервера сценариев для командной строки предусмотрен следующий синтаксис:
cscript [имя_сценария] [параметры_сервера] [аргументы_сценария]
Все параметры являются необязательными, однако нельзя задать аргументы сценария, не задав сценарий. При отсутствии аргументов сценария или самого сценария программа Cscript.exe выведет описание синтаксиса команды и предусмотренные ключи.
Ключи сервера сценариев для командной строки (см. таблицу).
Copyright 2008 Новопашин Владимир. Все права защищены.
Доброго времени суток всем читателям блога scriptcoding.ru. В этой статье мы подробно рассмотрим метод Run Wscript.Shell объекта. Данный метод служит для запуска внешних приложений из тела сценариев Windows Script Host.
Для начала мы рассмотрим теоретическую часть, а потом приступим к программированию.
Run (strCommand, [intWindowStyle], [bWaitOnReturn]) – данный метод служит для запуска другого приложения как в консольном режиме (командная строка), так и в оконном. При открытии исполняемого файла создается новый процесс. Ему передаются следующие параметры:
strCommand – данный параметр является обязательным, поскольку задает путь для файла или команды. Стоит учитывать, что если путь содержит пробелы, то его обязательно стоит заключать в двойные кавычки, иначе, возникнет ошибка » The system cannot find the file specified » – система не может найти указанный файл. Также полезно, использовать переменные окружения в пути к приложению, это экономит время.
intWindowStyle – является необязательным, и задает стиль окна. Параметр может принимать целые значения от 0 до 10. Согласно документации, в языке vbscript можно использовать именованные константы, но, они не всегда дают ожидаемый результат, и так как эти значения между собой повторяются, я упомянул лишь три:
bWaitOnReturn – может принимать true – сценарий будет ожидать завершения работы запущенного приложения, и только потом перейдет к выполнению следующей строчки кода, false – будет продолжатся выполнение сценария независимо от того, завершилась работа запущенного приложения или нет. Также следует учесть, что если установлено true, то метод вернет код выхода вызванного приложения, если установлено false – всегда будет возвращаться ноль.
Хорошо, теперь настало время заняться программирование. Для начала напишем программный код на языке VBScript:
Давайте проанализируем логику работы данного сценария. Переменная path хранит путь к папке System32, так как в ней у нас лежат исполняемые файлы notepad и calc. Переменная окружения » %WINDIR% » позволяет сократить строки кода и не писать » C:\\Windows «. WshShell содержит ссылку на экземпляр объекта Wscript.Shell, видим, чтобы создать саму ссылку, мы перед переменной прописали ключевое слово set, после чего идет вызов метода CreateObject класса WScript, подробней о работе с объектами читайте «Урок 8 по VBScript: Объекты и классы» и «Урок 4 по JScript: Создание собственных объектов». Далее мы запускаем блокнот с помощью метода Run Wscript Shell класса, через переменную WshShell. Для программы notepad мы третий параметр команды Run поставили в true, поэтому, исполняемый файл calc запустится только после закрытия приложения блокнот, плюс, перед этим появится информационное сообщение.
Хорошо, теперь давайте посмотрим на аналогичный пример, но написанный уже на языке jscript.
В данном примере, мы видим, что для команды Run мы прописали второй параметр (1 – нормальный режим), если этого не сделать, то произойдет ошибка, язык jscript не дает нам возможности пропустить параметр. Также видим, что тут не нужно использовать дополнительное ключевое слово типа set.
WScript Shell Run
Хорошо, теперь давайте посмотрим на еще один пример на языке vbscript.
Ну и напоследок, аналогичный пример, но уже на языке jscript:
И так, давайте все подытожим… В этой статье мы разобрали метод Run класса Wscript Shell, который позволяет запускать заданное приложение, и передавать ему нужные параметры, так, мы можем открыть текстовый редактор и вставить в него нужный текст. Аналогично, можно использовать и метод Exec, который тоже позволяет запускать исполняемый файл, но в отличии от метода Run, он позволяет контролировать работу исполняемого файла.
Спасибо за внимание. Автор блога Владимир Баталий
Запуск Wscript.Shell и Shell.Application. Заметки
Общих обзоров и материалов на эту тему уже достаточно, данная заметка не претендует на полноценную публикацию или исследование нюансов. Рассматривается только ОС Windows и только с точки зрения разработчика 1С, без подробностей системного администрирования и погружения в API винды. Переход по навигационным ссылкам (открытие страниц, запуск программ по протоколам) и открытие/запуск приложений по ассоциированным файлам не рассматриваем.
В общем случае разработчику доступны два командных процессора, cmd или powershell. Это именно исполнители команд, передающие далее ядру ОС более низкоуровневые команды; они доступны из консолей, пункта меню «Выполнить», они лежат в основе многих действий графических оболочек и системных менеджеров.
При этом, cmd не имеет «надстройки», и обращение к ней это всегда консольная команда. А вот powershell предоставляет оболочку над утилитой, что упрощает некоторые действия, но создаёт путаницу между собственно процессором и его «управляющим» объектом в памяти некоего процесса. Причём, эта оболочка позволяет вызвать выполнение cmd. Сложно сказать, в каких терминологических отношениях, например, находятся API-функции и процессоры, поэтому фиксируем лишь практически важные, прикладные моменты.
Важно не путать, что мы запускаем (какой процессор) и чем запускаем (какая оболочка). Под оболочкой рассматриваем СОМ-объект, созданный динамически в ходе исполнения кода на языке 1С, безотносительно, на сервере 1С это или на клиенте.
WScript.Shell
Каждый экземпляр объекта WScript автоматически создаётся сервером сценариев (CScript.exe или WScript.exe) в момент вызова конструктора. Регистрация в СОМ+ и DCOM не требуется.
Создание:
Оболочка = Новый COMОбъект(«WScript.Shell»); // во времена 8.2 это не всегда работало, требовалось «подружить» 1С и WSH
Из свойств объекта Оболочка можно выяснить путь, имя, версию сервера сценариев, что полезно при расследовании нетипичного поведения.
В некоторых случаях в передаваемой командной строке надёжнее писать путь вызова в формате 8х3, т.е. «C:\Progra
По завершении работы с Оболочка её надо принудительно приравнять Неопределено. Если объект был создан на управляемой форме, то, за исключением общеизвестного «удержания», контекст и занимаемая память по закрытии формы будут сброшены, а вот если создан из общего модуля, и сложился ещё ряд факторов, то может остаться в памяти, в т.ч. по завершении создавшего сеанса.
Оболочка, в свою очередь, позволяет создавать процессы ОС, как объекты типа WshScriptExec (некоторые источники утверждают, что может потребоваться доступ ко всем зарегистрированным классам, на практике не сталкивался).
Опять же, можно запускать консольно: cscript.exe ПутьВКавычкахКФайлуСценария (запуск сценариев пакетно). Такой подход позволяет указать, какой сервер сценариев применять (CScript.exe или используемый по умолчанию WScript.exe), можно подавить вывод диалогов и сообщений сценария.
С возможностью управления
Запуск с порождением отдельного дочернего управляемого процесса, без ожидания завершения.
Некоторые свойства:
* ProcessID – идентификатор процесса, позволяет манипулировать им в различных методах Оболочки. В диспетчере задач виден на серверных ОС.
* Status – число: если процесс выполняется, то 0, если прекратил свою работу то 1 (неважно, по какой причине прекратил).
* Arguments содержит коллекцию, позволяющую обращаться к именным и безымянным параметрам скрипта по отдельности, и многое другое. Например:
* ExitCode возвращает результат (именно и только для уже завершённого), обычно это некое число.
Во многих примерах фигурирует свойство, которое крайне нестабильно работает в 1С: Оболочка.Timeout, якобы позволяющее до запуска указать, через какое заданное в секундах время остановить процесс. Не рекомендую с ним связываться, т.к. по аналогии с обработчиком ожидания, таймер, похоже, тикает лишь при некоторых условиях, и тупит при большой нагрузке. По умолчанию время исполнения сценария не ограничено.
Процесс, запущенный Exec, разумно мониторить в цикле с задержкой, и при необходимости насильственно прерывать. Для этого используют:
* Процесс.Terminate(); // показал себя как наиболее надёжный, но, если процесс уже завершился (например, рухнул по ошибке), вызов этого метода тоже вызовет ошибку; метод позволяет завершить дочерний процесс. Процессу будет послана команда WM_CLOSE, если это не сработает, то процесс будет завершен принудительно;
Метод позволяет контролировать ход работы запущенного процесса, и запущенный сценарий является дочерним для запускающего, ему присущи те же переменные среды Windows, что и у процесса-родителя, и те же ограничения доступа. Использование метода разумно для консольных приложений, которые выполняются в консольном окне, особенно с диалогами запросов пользователю. Видимость диалога определяется запуском на клиенте 1С и совокупностью свойств сервера сценариев. Метод работает более адекватно и прозрачно при возможных ограничениях UAC.
Концепция: запустили и управляем сами: можем подождать (Sleep), можем сразу опросить, можем прервать из 1С.
Без возможности управления
Запуск внешних приложений с ожиданием завершения.
КодВозврата = Оболочка.Run(СтрокаЗапуска, СостояниеОкна, ЖдатьЗавершения);
Никаких свойств или объектов не предусмотрено.
Метод работает строго аналогично команде ОС Windows «Пуск/Выполнить», и при запуске приложения сперва идет его поиск в переменных среды, поэтому имена наиболее употребительных приложений можно указывать без пути. Метод не позволяет контролировать ход работы запущенного процесса, и дочерним для запускающего запущенный сценарий не является, а идёт как независимый. При наличии неочевидных UAC работа метода превращается в чёрный ящик.
Диалоги могут быть видны, но «живут своей жизнью», а разумнее всего применять метод к приложениям, не выводящим никакие диалоги. Замечено, что в некоторых скриптах своеобразно игнорирует «@echo off», выводя пустое окно консоли на пару секунд.
Концепция: запустили и ждём, пока сама ОС не разберётся и не вернёт управление 1С.
Shell.Application
Оболочка = Новый COMОбъект(«Shell.Application»); // если проблема с совместимостью, разрядностью или правами, то уже это действие завершится ошибкой
ShellExecute
КодВозврата = Оболочка.ShellExecute(КомандныйПроцессор, АргументыДляДействия, КаталогВыполнения, ДействиеГлагол, СостояниеОкна); // все параметры, кроме первого, необязательны
* Состояние окна интересно только на клиенте, это рекомендуемое состояние окна при выполнении, многие приложения это игнорируют, нотация аналогична вышеприведённой по vbs);
Надеюсь, очевидно, что PowerShell RunAs небезопасна, т.к. SaveCred добавляет удостоверение администратора и пароль в кэш учетных данных, и этот кэш, в принципе, можно перехватить. При этом, в ряде случаев поведение Windows Credential Manager может не удовлетворять требованиям безопасности, и тогда никакое повышение не сработает, и далеко не всегда это ловится кодом возврата, возможно, придётся смотреть журнал событий винды. За возможность запуска программ от имени другого пользователя в Windows отвечает служба вторичного входа в систему (Secondary Log-on). Если эта служба остановлена, все описанные методы с RunAs работать не будут (проверить, запущена ли служба, можно командой PowerShell вида «Get-Service seclogon»).
Общие моменты
* Всегда учитывать, что VBScript разрешает пропускать необязательные параметры методов, а JScript нет! Особенно при заимствовании кода и копи-пасте с примеров в сети)))
* Следует быть аккуратнее с расшаренными ресурсами, и с теми, запись в которые виртуализируется. У виртуальных дисков в консольных запусках порой запаздывает отклик ОС по доступу, в т.ч.отказ.
* Если прав по UAC недостаточно, то при запуске на клиенте может вылезти consent.exe с диалогом запроса подтверждения, а на сервере просто втихую не запустится. До потоков вывода и ошибок. До каких-то объектных действий. В таких случаях команду лучше обёртывать запускаемым файлом-скриптом (как делает БСП), а на сервере только смотреть журнал ОС насчёт ошибок, смотреть настройки безопасности IE (при нужде добавлять server-ivc в доверенную зону, с которой разрешён запуск исполняемых).
* Создание сом-объекта, естественно, оборачиваем в попытку-исключение и, естественно, нам доступно только позднее связывание, т.к. такие вещи как Active-Х и тем более OLE статично в объекты 1С не впихнуть. И не забываем про деструктор и уборку мусора за собой.
* Если надо содержимое консольного окна успеть посмотреть, а оно закрывается, используем (например, последней командой в скрипте) команду PAUSE, но тогда помним про особенности чтения потока вывода.
По мнению «1С»
На ИТС сравнительно мало конкретики, посвящённой особенностям работы СОМ-объектов с оболочками ОС, и она разрозненна.
Процитирую наиболее полезное: «При запуске внешней программы из кода требуется составлять строку запуска таким образом, чтобы она собиралась только из проверенных частей. если одна из частей, из которых собирается строка запуска, содержит данные, полученные из базы данных, из поля ввода на форме или прочитаны из хранилища настроек, то перед запуском программы требуется проверить, являются ли запуск безопасным. Безопасными считаются такие строковые данные, которые не содержат в себе следующие символы: «$», «`», «|», «||» «;», «&», «&&». Данное требование распространяется на все способы запуска программ.»
Разработчику доступны методы:
ФайловаяСистемаКлиент.ЗапуститьПрограмму (в клиентском коде);
ФайловаяСистема.ЗапуститьПрограмму (в серверном коде)
Как работают оба метода:
Если нужно получение потока вывода и/или потока ошибок, то объявляются временные файлы stdout.tmp и stderr.tmp, и к самой строке команды дописывается перенаправление потока в них (перезаписью). Создаётся отдельный текстовый документ с именем run.bat, и в него пишется следующее:
Файл run.bat и на сервере, и на клиенте сохраняется просто как временный файл.
Если указана необходимость дождаться завершения, то файл удаляется принудительно после запуска, не дожидаясь конца сеанса. Если ждать завершения не надо, тут может возникнуть потенциальная утечка памяти, т.к. сеанс 1С, натыкаясь на невозможность удалить порождённый им временный файл, просто игнорирует его и закрывается без лишних жалоб.
При необходимости (если дождались завершения), читаются файлы потоков (с помощью ЧтениеТекста, сразу целиком и в той же кодировке, что скрипт), и также принудительно удаляются. Опять-таки, если завершения не ждать, то и работать с файлами потоков разработчику придётся самостоятельно.
На практике подобный подход, обёртывание в bat, показал меньшую стабильность при работе в фоновых заданиях, чем прямое указание команды. Ну и, если дело на клиенте, и фокус «уплыл», и пользователь случайно нажал Ctrl+Break, то ведь оно и остановиться может.
Запуск одного скрипта из другого
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Создание одного VBS-скрипта с помощью другого
Вопрос такой может ли Vbs скрипт создать другой Vbs скрипт
Копирование текста из одного скрипта в другой и разделение одного скрипта на два
Каким способом можно копировать текст из одного скрипта в другой и как создать новый из части.
Запуск одного скрипта из другого
Понимаю, что из названия темы мало, что понятно. Постараюсь объяснить на примере. Ситуация такая.
Запуск одного скрипта из другого
Всем привет! Возникла интересная проблема. Мой скрипт содержит цикл, в котором должен вызываться.
Решение
Вложения
ru_test_script.zip (1.6 Кб, 21 просмотров) |
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Запуск из одного PHP скрипта другого, не дожидаясь его завершения
Добрый день. Имеется php скрипт registratot.php и calculate.php. Как мне вызывать выполнение.
Запуск скрипта для анализа папки и запуска другого скрипта
Мне нужно написать скрипт, который каждую секунду (или 5 сек) сканировал определенную папку на.
Как из одного скрипта изменить переменную (int) другого скрипта?
У меня есть два скрипта (money который отвечает за общее количество денег и CarBuy который отвечает.