Скрипт запуска программы средствами CMD и WMI

Скрипт запуска программы средствами CMD и WMI Примеры скриптов и макросов для Word и WSH

В данной публикации мы рассмотрим такой тривиальный момент, как запуск приложения средствами WMI (инструментарий Windows) и CMD (командная строка). Как и прежде, ссылку на архив с примерами я разместил  в конце статьи. И так, немного лирики…

Что запустить приложение, например диспетчер задач из командной строки, нужно просто в консольном окне CMD прописать путь к нужной программе, но, если данная программа является частью системы (находится в системных каталогах, например, Windows, System, System32 и так далее), то достаточно прописать название приложения. Так, что бы запустить диспетчер задач через командную строку, надо просто написать taskmgr.exe и нажать клавишу Enter, или… прописать аналогичную строку в меню Пуск/Выполнить.

Так как данный блог посвящен тематике Windows Script Host, то я решил написать два примера, один на языке vbscript, а другой на языке jscript, их задача – создать форму, на которой будет строка для ввода данных и две кнопки, форму создаем с помощью компонента WindowSystemObject. В строке мы будем прописывать название программы, которую хотим выполнить. Одна кнопка будет запускать приложение с помощью функции Run (смотрите статью “WScript.Shell метод Run”), а другая кнопка будет производить запуск с использование инструментария Windows, а точнее класса Win32_Process (его описание вы найдете в статье “Класс Win32_Process – работа с процессами”).

И так, начнем…

' ***********************************************************' Пример запуска программы через' Командную строку или WMI' run-taskmgr.vbs' ***********************************************************OptionExplicit dim Button_Run_CMD, Button_Run_WMIdim label1, label2, label3dim WshShell, WSO, objProcessdim f, t, r '******************************************************************'            создаем ссылки на объектыset WshShell = WScript.CreateObject("Wscript.Shell")set WSO = WScript.CreateObject("Scripting.WindowSystemObject")set objProcess = GetObject("winmgmts:\.rootcimv2:Win32_Process")'******************************************************************* '*******************************************************************'            создаем формуset f = WSO.CreateForm(0, 0, 0, 0, WSO.Translate("WS_CONTROLBOX | WS_MINIMIZEBOX"))f.Text = "Запуск диспетчера задач через командную строку или WMI"f.ClientWidth = 340f.ClientHeight = 300f.CenterControl() '*******************************************************************'                                  Метки, поля и кнопкиset label1 = f.TextOut(10,10,"Введите название программы," & vbCrLf & "например: notepad.exe, calc.exe..."set r = f.CreateEdit(10,50,150,10)r.Text = "taskmgr.exe" set label2 = f.TextOut(10,80,"Запуск (программы) диспетчера задач из командной строки "set Button_Run_CMD = f.CreateButton(10,100,100,25,"Запустить")Button_Run_CMD.OnClick = GetRef("Run_CMD"set label3 = f.TextOut(10,150,"Запуск (программы) диспетчера задач через WMI "set Button_Run_WMI = f.CreateButton(10,170,100,25,"Запустить")Button_Run_WMI.OnClick = GetRef("Run_WMI"set t = f.CreateHyperLink(10,250,250,25,"www.scriptcoding.ru")'******************************************************************* f.Show()WSO.Run() '*******************************************************************'                     Управляющие функцииfunction Run_CMD()OnErrorResumeNextdim T_Edit, msg     T_Edit = r.Text     if T_Edit = ""then                 T_Edit = "taskmgr.exe"     endif     WshShell.Run(T_Edit)     If Err.Number <> 0 Then                 msg="Ошибка!!!" & vbCrLf & "Путь не найден для " & T_Edit                 WScript.Echo (msg)     endifendfunction function Run_WMI()dim T_Edit, objInParams, objOutParams, PID, msg     T_Edit = r.Text     if T_Edit = ""then                 T_Edit = "taskmgr.exe"     endif     objInParams = objProcess.Create(T_Edit, null, null, PID)     if objInParams <> 0 then                 msg="Ошибка!!!" & vbCrLf & "Путь не найден для " & T_Edit                 WScript.Echo (msg)     endifendfunction

Я поясню только ключевые моменты. Строки set r = f.CreateEdit(10,50,150,10) и r.Text = "taskmgr.exe" отвечают за создание на форме текстового поля для ввода данных, которое создается с помощью функции CreateEdit, сама функция возвращает объект, поэтому перед переменной стоит ключевое слово set. Для свойства Text мы назначили строковое значение по умолчанию “taskmgr.exe”, то есть, сразу после запуска скрипты, можно будет запустить диспетчер задач через командную строку или через класс Win32_Process.

Run_CMD() – в теле данной функции происходит проверка свойства Text, если оно пустое, то автоматически подставляется значение «taskmgr.exe». Далее происходит вызов метода Run для запуска приложения. Обратите внимание, что тут мы включили обработку ошибок (On Error Resume Next), если возникнет ошибка, например, имя или путь введены некорректно, то будет выведено предупреждающее сообщение.

Run_WMI() – тут происходит вызов метода Create класса Win32_Process. После выполнения метода идет проверка кода выхода, если его значение не ровно 0 – произошла ошибка, то выводится предупреждающее сообщение.

// ***********************************************************// Пример запуска программы через// Командную строку или WMI// run-taskmgr.js// *********************************************************** var Button_Run_CMD, Button_Run_WMI;var label1, label2, label3; //******************************************************************//            создаем ссылки на объектыvar WshShell = WScript.CreateObject("Wscript.Shell");var WSO = WScript.CreateObject("Scripting.WindowSystemObject");var objProcess = GetObject("winmgmts:\\.\root\cimv2:Win32_Process");//******************************************************************* //*******************************************************************//            создаем формуvar f = WSO.CreateForm(0,0,0,0, WSO.Translate("WS_CONTROLBOX | WS_MINIMIZEBOX"));with(f){     Text ="Запуск диспетчера задач через командную строку или WMI";     ClientWidth =340;     ClientHeight =300;     CenterControl();} //*******************************************************************//                                  Метки, поля и кнопкиlabel1 = f.TextOut(10,10,"Введите название программы, nнапример: notepad.exe, calc.exe..."); var r = f.CreateEdit(10,50,150,10);r.Text="taskmgr.exe"; label2 = f.TextOut(10,80,"Запуск (программы) диспетчера задач из командной строки "); Button_Run_CMD = f.CreateButton(10,100,100,25,"Запустить");Button_Run_CMD.OnClick= Run_CMD; label3 = f.TextOut(10,150,"Запуск (программы) диспетчера задач через WMI "); Button_Run_WMI = f.CreateButton(10,170,100,25,"Запустить");Button_Run_WMI.OnClick= Run_WMI; var t = f.CreateHyperLink(10,250,250,25,"www.scriptcoding.ru");//******************************************************************* f.Show();WSO.Run(); //*******************************************************************//                     Управляющие функцииfunction Run_CMD(){var T_Edit = r.Text, msg;     if(T_Edit ==""){T_Edit ="taskmgr.exe";}     try{                 WshShell.Run(T_Edit);     }catch(e){                 if(e!=0){                            msg="Ошибка!!!n"+"Путь не найден для "+ T_Edit;                            WScript.echo(msg);                 }     }} function Run_WMI(){var T_Edit = r.Text;var objInParams, objOutParams, msg;     if(T_Edit ==""){T_Edit ="taskmgr.exe";}     objInParams = objProcess.Methods_("Create").InParameters.SpawnInstance_();     objInParams.CommandLine= T_Edit;     objOutParams = objProcess.ExecMethod_("Create", objInParams);     // objOutParams.ProcessId - значение идентификатора процесса                 if(objOutParams.ReturnValue!=0){                            msg="Ошибка!!!n"+"Путь не найден для "+ T_Edit;                            WScript.echo(msg);                 }}

Тут стоит обратить внимание на процесс вызова метода Create, дело в том, что если мы пропишем в сценарии jscript код:

objInParams = objProcess.Create(T_Edit, null, null, PID)

Скачать архив с примерами

как и в vbscript, то ошибки не произойдет, но мы не сможем при необходимости получить значение переменной PID (идентификатор процесса), да, такая особенность языка jscript. Обратите внимание, что если мы запустим, например, диспетчер задач из командной строки (метод Run), то никакое значение PID получить не сможем по определению, для этого надо использовать метод Exec объекта WScript.Shell.

Оцените статью
Технологии программирования и ведение блога
Добавить комментарий