Скрипт запуска программы средствами 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
' ***********************************************************
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.

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