В данной публикации мы рассмотрим такой тривиальный момент, как запуск приложения средствами 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 ' *********************************************************** Option Explicit dim Button_Run_CMD, Button_Run_WMI dim label1, label2, label3 dim WshShell, WSO, objProcess dim f, t, r '****************************************************************** ' создаем ссылки на объекты set WshShell = WScript.CreateObject("Wscript.Shell") set WSO = WScript.CreateObject("Scripting.WindowSystemObject") set objProcess = GetObject("winmgmts:\\.\root\cimv2:Win32_Process") '******************************************************************* '******************************************************************* ' создаем форму set f = WSO.CreateForm(0, 0, 0, 0, WSO.Translate("WS_CONTROLBOX | WS_MINIMIZEBOX")) f.Text = "Запуск диспетчера задач через командную строку или WMI" f.ClientWidth = 340 f.ClientHeight = 300 f.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,"scriptcoding.ru") '******************************************************************* f.Show() WSO.Run() '******************************************************************* ' Управляющие функции function Run_CMD() On Error Resume Next dim T_Edit, msg T_Edit = r.Text if T_Edit = "" then T_Edit = "taskmgr.exe" end if WshShell.Run(T_Edit) If Err.Number <> 0 Then msg="Ошибка!!!" & vbCrLf & "Путь не найден для " & T_Edit WScript.Echo (msg) end if end function function Run_WMI() dim T_Edit, objInParams, objOutParams, PID, msg T_Edit = r.Text if T_Edit = "" then T_Edit = "taskmgr.exe" end if objInParams = objProcess.Create(T_Edit, null, null, PID) if objInParams <> 0 then msg="Ошибка!!!" & vbCrLf & "Путь не найден для " & T_Edit WScript.Echo (msg) end if end function |
Я поясню только ключевые моменты. Строки 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,"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.