В этой статье мы рассмотрим, как получить список процессов из командной строки с помощью утилиты tasklist, и вывести их в текстовое поле на форме, созданной с помощью сервера Windows Script Host.
В предыдущей статье “Утилиты tasklist и taskkill” была затронут такая неприятность – некоторые утилиты командной строки при выводе данных в файл не реагируют на смену кдиовки, и поэтому приходится создавать bat файл. Тут ситуация такая же: с помощью компонентаWindowSystemObject мы создадим форму, на которой будет находится текстовое поле (в него будет выводиться список процессов через утилиту командной строки) и две кнопки (для обновления данных и открытия временного файла).
VBScript: Получение списка процессов через командную строки
' *********************************************************** ' Получение списка процессов средствами командной строки ' process-list-cmd.vbs ' *********************************************************** Option Explicit dim WSO, WshShell, FSO dim f, t, edit, button_analize, button_cleare, button_open dim data_file, temp_file, bat_data, cur_dir '************************************************************************* ' создаем ссылки на объекты set WSO = Wscript.CreateObject("Scripting.WindowSystemObject") set WshShell = Wscript.CreateObject("Wscript.Shell") set FSO = Wscript.CreateObject("Scripting.FileSystemObject") '************************************************************************* '************************************************************************* ' параметры формы set f = WSO.CreateForm(0,0,0,0) f.ClientWidth = 560 f.ClientHeight = 300 f.CenterControl() f.Text = "Список процессов из командной строки" f.SizeGrip = false f.MaximizeBox = false '************************************************************************* ' путь к временному файлу temp_file = WshShell.ExpandEnvironmentStrings("%TEMP%") & "\" & FSO.GetTempName ' текущий каталог cur_dir = WshShell.CurrentDirectory '************************************************************************* ' содержимое батника bat_data = "@echo off" & vbCrLf bat_data = bat_data & "chcp 866 >nul" & vbCrLf bat_data = bat_data & "tasklist >test.txt" & vbCrLf bat_data = bat_data & "for /f " & chr(34) & "tokens=*" & chr(34) & " %%a in (test.txt) do call :convert %%a" & vbCrLf bat_data = bat_data & "goto :eof" & vbCrLf bat_data = bat_data & ":convert" & vbCrLf bat_data = bat_data & "chcp 1251 >nul" & vbCrLf bat_data = bat_data & "echo %*>>" & chr(34) & temp_file & chr(34) & vbCrLf bat_data = bat_data & "chcp 866 >nul" '************************************************************************* 'Поле для вывода данных set edit = f.CreateEdit(0,0,400,300,WSO.Translate("ES_MULTILINE")) edit.ScrollBars = WSO.Translate("SS_BOTH") edit.ReadOnly = true edit.WordWrap = true ' кнопка получения данных set button_analize = f.CreateButton(430,10,100,25,"Анализировать") button_analize.OnClick = getref("Analize") ' кнопка очистки данных set button_cleare = f.CreateButton(430,40,100,25,"Очистить") button_cleare.OnClick = getref("Cleare") 'кнопка открытия файла с данными set button_open = f.CreateButton(430,70,100,25,"Открыть") button_open.OnClick = getref("Open") set t = f.CreateHyperLink(420,100,250,25,"scriptcoding.ru") f.Show() WSO.Run() '************************************************************************* ' функции управления function Cleare() edit.Text="" data_file="" end function 'Отправка запроса function Analize() dim get_file_data create_bat(bat_data) set get_file_data=FSO.OpenTextFile(temp_file, 1, false) data_file = get_file_data.ReadAll get_file_data.Close edit.Text = data_file end function function Open() WshShell.Run "wordpad.exe " & temp_file end function function create_bat(data) dim t_file set t_file=FSO.CreateTextFile("info.bat", true) t_file.WriteLine(data) t_file.Close () WshShell.Run "cmd.exe /c " & chr(34) & cur_dir & "\info.bat" & chr(34),1,true end function '************************************************************************* |
Давайте сразу определимся с функциями, которые используются как в данном сценарии, так и в следующем:
Cleare() – отвечает за очистку переменной с данными и текстового поля, вызывается нажатием на кнопку “Очистить”
Analize() – отвечает за формирование списка, для вызова функции нужно нажать на кнопку “Анализировать”. В теле функции сначала происходит вызов функции create_bat(), далее идет процесс открытия временного файла (читай, “Объект FileSystemObject метод OpenTextFile”), считывание из него данных и заполнение ими текстового поля
Open() – тут всего одна строчка, которая отвечает за открытие временного файла с помощью программы wordpad.exe
create_bat(data) – данной функции передается один параметр, который содержит строки будущего bat файла. В теле функции происходит процесс создания файла в текущем каталоге (смотри “Объект FileSystemObject метод CreateTextFile”) и его запуск.
JScript: Получение списка процессов через командную строки
// *********************************************************** // Получение списка процессов средствами командной строки // process-list-cmd.js // *********************************************************** var f, t, edit, button_analize, button_cleare, button_open; var data_file, temp_file, bat_data, cur_dir; //************************************************************************* // создаем ссылки на объекты var WSO = WScript.CreateObject("Scripting.WindowSystemObject"); var WshShell = WScript.CreateObject("Wscript.Shell"); var FSO = WScript.CreateObject("Scripting.FileSystemObject"); //************************************************************************* //************************************************************************* // параметры формы f = WSO.CreateForm(0,0,0,0); f.ClientWidth = 560; f.ClientHeight = 300; f.CenterControl(); f.Text = "Список процессов из командной строки"; f.SizeGrip = false; f.MaximizeBox = false; //************************************************************************* // путь к временному файлу temp_file = WshShell.ExpandEnvironmentStrings("%TEMP%") + "\\" + FSO.GetTempName(); // текущий каталог cur_dir = WshShell.CurrentDirectory; //************************************************************************* // содержимое батника bat_data = "@echo off\n"; bat_data += "chcp 866 >nul\n"; bat_data += "tasklist >test.txt\n"; bat_data += "for /f " + "\"" + "tokens=*" + "\"" + " %%a in (test.txt) do call :convert %%a\n"; bat_data += "goto :eof\n"; bat_data += ":convert\n"; bat_data += "chcp 1251 >nul\n"; bat_data += "echo %*>>" + "\"" + temp_file + "\"" + "\n"; bat_data += "chcp 866 >nul"; //************************************************************************* //Поле для вывода данных edit = f.CreateEdit(0,0,400,300,WSO.Translate("ES_MULTILINE")); edit.ScrollBars = WSO.Translate("SS_BOTH"); edit.ReadOnly = true; edit.WordWrap = true; // кнопка получения данных button_analize = f.CreateButton(430,10,100,25,"Анализировать"); button_analize.OnClick = Analize; // кнопка очистки данных button_cleare = f.CreateButton(430,40,100,25,"Очистить"); button_cleare.OnClick = Cleare; //кнопка открытия файла с данными button_open = f.CreateButton(430,70,100,25,"Открыть"); button_open.OnClick = Open; t = f.CreateHyperLink(420,100,250,25,"scriptcoding.ru"); f.Show(); WSO.Run(); //************************************************************************* // функции управления function Cleare(){ edit.Text=""; data_file=""; } //Отправка запроса function Analize(){ var get_file_data; create_bat(bat_data); get_file_data=FSO.OpenTextFile(temp_file, 1, false); data_file = get_file_data.ReadAll(); get_file_data.Close(); edit.Text = data_file; } function Open(){ WshShell.Run ("wordpad.exe " + temp_file); } function create_bat(data){ var t_file t_file=FSO.CreateTextFile("info.bat", true); t_file.WriteLine(data); t_file.Close (); WshShell.Run ("cmd.exe /c " + "\"" + cur_dir + "\\info.bat" + "\"",1,true); } //************************************************************************* |
Стоит обратить внимание на один не маловажный момент, для вставки двойных кавычек, в vbscript мы использовали функцию chr со значением 34, а в jscript – esc последовательность “ «”.
Данные примеры получения списка процессов через командную строку содержат один изъян: при запуске bat файла происходит конвертация кодировки, что требует затрат времени, поэтому, после нажатия на кнопку Анализировать, придется немного подождать.