Скрипты vbs: Vbscript — Википедия – Приколы системных администраторов. VBS-скрипты

Приколы системных администраторов. VBS-скрипты

Шутки с использованием vbs-скриптов. Можно подшутить над другом или коллегами на работе.

Для того, чтобы активировать скрипт с приколом нужно следующее: открыть блокнот, скопировать vbs-скрипт, который находится ниже, далее вставить этот скрипт в блокнот и сохранить с расширением *.vbs, а после запустить на компе жертвы.

Пугалка №1. 

На экране появляются сообщения о том, что система заражена, появляется много командных строк, калькуляторы, блокноты и другое.

on error resume next 
set t=createobject("Wscript.Shell") 
set kill = createobject("wscript.shell") 
kill.run"taskkill /f /im explorer.exe",0
msgbox"Неполадка системы",16,"Error" 
msgbox"Вы заражены вирусом",48,"Windows" 
msgbox"Необходим перезапуск системы",16,"Windows"
t.run"help" 
t.run"help" 
t.run"help" 
t.run"help" 
t.run"calc.exe" 
t.run"notepad.exe" 
t.run"telnet" 
t.run"help" 
t.run"explorer" 
t.run"help" 
t.run"help" 
t.run"help" 
t.run"help" 
t.run"help" 
t.run"help" 
t.run"calc.exe" 
t.run"notepad.exe" 
t.run"telnet" 
t.run"help" 
t.run"help" 
msgbox"Сбой системы",16,"Windows" 
t.run"help" 
t.run"help" 
t.run"help"
t.run"help" 
t.run"help" 
t.run"help" 
t.run"help" 
t.run"calc.exe" 
t.run"notepad.exe" 
t.run"telnet" 
t.run"help" 
t.run"explorer" 
t.run"help" 
t.run"help" 
t.run"help" 
t.run"help" 
t.run"help" 
t.run"help" 
t.run"calc.exe" 
t.run"notepad.exe" 
t.run"telnet" 
t.run"help" 
t.run"help" 
msgbox"Сбой системы",16,"Windows" 
t.run"help" 
t.run"help" 
t.run"help"
t.run"help" 
t.run"help" 
t.run"help" 
t.run"help" 
t.run"calc.exe" 
t.run"notepad.exe" 
t.run"telnet" 
t.run"help" 
t.run"explorer" 
t.run"help" 
t.run"help" 
t.run"help" 
t.run"help" 
t.run"help" 
t.run"help" 
t.run"calc.exe" 
t.run"notepad.exe" 
t.run"telnet" 
t.run"help" 
t.run"help" 
msgbox"Сбой системы",16,"Windows" 
t.run"help" 
t.run"help" 
t.run"help"

Пугалка №2. Мигающая клавиатура

На клавиатуре мигают лампочки, а так же имитируется нажатие клавиш CapsLock, NumLock, ScrollLock, в результате чего написанный текст принимает вид: ТаКоЙ ТеКсТ

Set s = CreateObject("Wscript.Shell") 
do 
wscript.sleep 80 
s.sendkeys"{numlock}" 
wscript.sleep 80 
s.sendkeys"{capslock}" 
wscript.sleep 80 
s.sendkeys"{scrolllock}" 
wscript.sleep 80
wscript.sleep 80 
s.sendkeys"{numlock}" 
wscript.sleep 80 
s.sendkeys"{capslock}" 
wscript.sleep 80 
s.sendkeys"{scrolllock}" 
wscript.sleep 80
s.sendkeys"{scrolllock}" 
wscript.sleep 80 
s.sendkeys"{capslock}" 
wscript.sleep 80 
s.sendkeys"{numlock}" 
wscript.sleep 80
wscript.sleep 80 
s.sendkeys"{scrolllock}" 
wscript.sleep 80 
s.sendkeys"{capslock}" 
wscript.sleep 80 
s.sendkeys"{numlock}" 
wscript.sleep 80 
s.sendkeys"{numlock}" 
wscript.sleep 80 
s.sendkeys"{capslock}" 
wscript.sleep 80 
s.sendkeys"{scrolllock}" 
wscript.sleep 80 
loop 

Пугалка №3.

Открывается блокнот и пишется текст

on error resume next 
set t=createobject("Wscript.Shell") 
Set s = CreateObject("Wscript.Shell") 
set kill = createobject("wscript.shell") 
kill.run"taskkill /f /im explorer.exe",0 
t.run"notepad" 
wscript.sleep 580 
s.sendkeys"+{х}" 
wscript.sleep 80 
s.sendkeys"{о}" 
wscript.sleep 80 
s.sendkeys"{ч}" 
wscript.sleep 80 
s.sendkeys"{е}" 
wscript.sleep 80 
s.sendkeys"{ш}" 
wscript.sleep 80 
s.sendkeys"{ь}" 
wscript.sleep 80 
s.sendkeys"{ }" 
wscript.sleep 80 
s.sendkeys"+{н}" 
wscript.sleep 80 
s.sendkeys"{а}" 
wscript.sleep 80 
s.sendkeys"{у}" 
wscript.sleep 80 
s.sendkeys"{ч}" 
wscript.sleep 80 
s.sendkeys"{у}" 
wscript.sleep 888 
s.sendkeys"%{f4}" 
wscript.sleep 80 
s.sendkeys"{RIGHT}" 
wscript.sleep 80 
s.sendkeys"{enter}" 
msgbox"Страшно было xD",16,"Шутка" 
t.run"explorer.exe"

VBScript (vbs скрипты) программирование. Готовые примеры, уроки, вирусы

Mail.Ru Group & Fotki.Yandex.Ru Parser — Это сборник из трёх программ позволяющих собирать (парсить) E-Mail адреса участников «Групп Мой Мир» и «Яндекс Фотки». Теперь создавать базы e-mail адресов стало намного легче!     (далее…)

Давненько не радовал просторы интернета своими постами. Надо это дело исправлять.
Сегодня мы поговорим о чудесной программе компилирующей сценарий vbs в exe (исполняемый файл). Звать это чудо – VBSedit.
Данная программа будет просто необходима, если нам потребуется скрыть от людских глаз содержимое нашего сценария VBScript, над которым мы потели несколько суток, либо он малость вредоносный. Да и солидней как то.

(далее…)

Приветствую всех читателей моего блога. В этой статье я размещу исходник своего парсера почты Mail.Ru Групп (Мой Мир) на VBScript и немного объясню его действие. Данный скрипт помогает вам собрать огромные базы существующих E-Mail’ов от Mail.Ru для брута, спама и любых других действий. Вам не придётся действовать наугад или искать паблик базы.

 Материал устарел. мэйл.ру поставили защиту.

 

(далее…)

Объект WScript является главным в Windows Script Host и позволяет подключать остальные его компоненты. Данный объект не нужно создавать или куда то прописывать, он создаётся автоматически, сервером сценариев (CScript.exe или WScript.exe). Благодаря этому объекту мы можем получать информацию о запущенном сценарии и о самом WSH. Так же мы можем устанавливать время работы нашего сценария. Будет интересно.

 

(далее…)

Настало время познакомить вас с объектом RegExp языка VBScript, или, по другому — регулярное выражение. Данный объект VBScript позволяет создавать шаблон из метасимволов, по которому впоследствии выполняются определённые действия: сравнивание текста; заменять или удалять текст, соответствующий шаблону; извлекать текст, соответствующий шаблону. Например, нам надо в строке найти номер телефона типа «+7(***)***-***-**», где * — любая цифра. Так же данный объект позволит нам

создать Proxy Parser на VBScript.

(далее…)

Что то я совсем убежал вперёд и не рассказал вам про две функции диалоговых окон: MsgBox и InputBox. В этом очень небольшом уроке я и расскажу про все приблуды к этим двум функциям. Так же существуют и другие способы создания диалоговых окон, но для этого потребуются объекты WSH, о которых будет разговор в следующих уроках.

 

(далее…)

Приветствую читателей своего блога по VBS программированию. Сегодня я расскажу про небольшой объект Dictionary. В использование встречается несправедливо редко. Он является объектом-коллекцией или словарём, как его называют иногда, по переводу названия. Данный объект напоминает

массив VBS, но с более расширенными возможностями: задействовать в качестве номера элемента строковое значение, удаление элемента данных в середине коллекции без образования пробела, отсутствие нужды в использование ReDim и так далее. Так же в конце статьи вас ждёт пример-игра от меня.

(далее…)

Наконец настало время заключительного урока по объекту FSO. В этой статье я расскажу про все свойства и методы позволяющие, так или иначе работать с дисками. Одно из свойств может позволить нам выполнять сценарий VBScript только на определённом компьютере (по типу лицензии). Если Вас это заинтересовало, то буду рад поделиться имеющимися у меня знаниями.

 

(далее…)

В данной статье я расскажу про работу с файлами средствами VBS при помощи объекта FSO и File. В принципе все методы и свойства показанные здесь очень схожи с теми, что были в предыдущем уроке про работу с папками. Я бы даже сказал, что объект File — брат близнец объекта Folder. Данный урок будет полезен при создании VBS cтиллера для кражи паролей. Ну что, приступим.

 

(далее…)

В этой статье я расскажу про работу с папками при помощи объекта FSO, а так же объекта Folder. Данные объекты Windows Script Host позволяют нам создавать, удалять, проверять наличие папки, копировать или перемещать папки по шаблону, не используя циклов. Всё это будет подкреплено примерами VBScript

.

 

(далее…)

Урок VBScript №1: Знакомство с языком VBScript

Приветствую тебя, читатель моего блога. Я начинаю свою серию уроков по программированию VBScript этой ознакомительной статьёй. Вам предстоит узнать основы основ данного языка программирования.

VBScript — Это скриптовый язык программирования. Как и любой другой скриптовый язык VBScript урезан в своих возможностях. Но то, что он урезан ещё не говорит что он не интересен.

Вступление

В этом уроке мы узнаем:

  • Основные особенности VBScript.
  • Что такое переменные и с чем их едят.
  • Простейшая функция MsgBox.

Язык VBScript на мой взгляд простой и понятный даже для ничего незнающего школьника. Сценарии VBScript можно создавать в простом блокноте, что облегчает нам с вами задачу, так как не надо скачивать каких либо дополнительных программ. Однако я рекомендую скачать бесплатную программу

Notepad++. Он очень удобен тем, что подсвечивает сам код и показывает номера строк, что очень пригодится при возникновении ошибки.

Так же надо знать ещё две вещи о VBScript:

  • Расширение файла *.vbs
  • В коде не учитывается регистр (большие или маленькие буквы)

Приступим…

Создаём текстовый документ и сохраняем его с расширением *.vbs (Тип файла: все файлы. К названию файла подставить .vbs). Дальше открываем получившийся файл при помощи блокнота или любой другой программы для работы с текстом, например Notepad++. Вставляем код ниже, сохраняем и запускаем двойным щелчком мыши:

'Урок VBScript №1
Rem Знакомство с языком VBScript
'file_1.vbs
 
Dim a, b, c, d
 
a = 10
b = 20
c = 40
d = "пробная строка"
 
MsgBox a
MsgBox b
MsgBox c
MsgBox d

Теперь разберём эту «головоломку» по частям.

Первые три строки — это комментарии. Они не как не влияют на работу сценария. Что бы оставлять комментарии используется ключевое слово «Rem» или единичная клавиша . Комментарии можно оставлять в любом месте кода, но надо учитывать, что после объявления комментария всё содержимое строки, которое идёт дальше, учитываться не будет.

На пятой строке перечислены все переменные, которые мы с вами будем использовать (a, b, c, d). Они бывают явными и не явными, но об это я расскажу попозже. Переменные объявляются ключевым словом «Dim».

С седьмой по десятую строку мы назначаем значение переменных. В данном случае это три числа и строка (10, 20, 40, «пробная срока»). Прошу обратить внимание, что все строки заключаются в ковычки.

На двенадцатой строке мы выводим значение всех переменных при помощи функции MsgBox. В данном примере у нас вылезет окошко с числом 10, а после нажатия кнопки «ОК» вылезет окошко с числом 20 и т.д. .

На мой взгляд, всё понятно, но мне не нравится чересчур большое количество строк. Давайте сократим код. Заодно  я расскажу Вам про не явные переменные.

'Урок VBScript №1
Rem Знакомство с языком VBScript
'file_2.vbs
 
Option Explicit
 
Dim a, b, c, d
 
a = 10
b = 20
c = 40
d = "пробная строка"
f = 25
 
MsgBox a:MsgBox b:MsgBox c:MsgBox d

Итак, что мы видим? Наши три строки с функцией MsgBox превратились в одну. В данном случае язык VBScript позволяет прописать несколько операторов в одну строку используя двоеточие.

Теперь что касается не явных переменных. Такими являются все переменные которые не были назначены после ключевого слова «Dim». В данном случае таковой является переменная «f» на тринадцатой строке. Такие переменные не нарушают работу сценария, но если его код очень большой, то Вы можете попросту запутаться в своих переменных.

Для того что бы ни допустить этого, нам на помощь приходит оператор «Option Explicit» с пятой строки. Если данный оператор поставлен в вашем сценарии, то из-за не объявленных переменных будет выдавать ошибку, пока эту переменную не объявят после ключевого слова «Dim».

Так же я рекомендую писать значение всех переменных по возможности в одном месте и как можно выше к ключевому слову «Dim». Впрочем, я сам любитель пренебречь этим правилом =).

Вроде всё хорошо, но хочется чего то большего. Давайте выведем значение переменных одним окошком!

'Урок VBScript №1
Rem Знакомство с языком VBScript
'file_3.vbs
 
Option Explicit
 
Dim a, b, c, d, f
 
a = 10
b = 20
c = 40
d = "пробная строка"
f = 25
 
MsgBox a & b & c & d & f
MsgBox a & vbTab & b & vbTab & c & vbTab & d & vbTab & f
MsgBox a & vbCrLf & b & vbCrLf & c & vbCrLf & d & vbCrLf & f

В данном примере у нас уже не выдаст ошибку, так как мы объявили переменную «f» после ключевого слова «Dim».

Теперь давайте рассмотрим три примера вывода значений переменных функцией MsgBox.

На пятнадцатой строке приведён пример где мы объединяем значение переменных при помощи знака «&». Значение переменных выведется одной строкой без пробелов. Думаю нам так не пойдёт, но это может пригодиться.

На шестнадцатой строке  показан пример где значения переменных будут выведены одной строкой и разделены Tab’ом при помощи константы «vbTab» и всё того же связующего знака «&».

На семнадцатой строке мы видим вывод значения каждой переменной с новой строки. В этом нам помогает константа «vbCrLf».

Эти три строки так же можно объединить в одну при помощи двоеточия. Подробнее о функции MsgBox и других видах диалоговых окон я расскажу в одном из следующих уроков.

Надеюсь эта статья помогла снять завесу тайны с языка VBScript и вы заинтересовались этим чудесным языком программирования. Ждите новых уроков в которых Вы узнаете ещё много нового и интересного. Удачи! =)

VBScript: синтаксис vbs сценариев | scriptcoding.ru

В этом начальном уроке, мы изучим синтаксис vbscript языка. Синтаксис языка vbscript является таким же как и в языке Visual Basic и фактически, является подмножеством данного языка программирования. Основной упор в использовании vbscript – это возможность написания сценариев (расширение vbs) с открытым кодом для платформы Windows. Пользователю не нужно прибегать к установке дополнительного программного обеспечения, так как все сценарии выполняются под управлением сервера сценариев Windows Script Host.

И так, давайте рассмотрим базовый синтаксис vbscipt и его возможности.

  • Комментарии – для комментирования строк кода можно использовать ключевое слово REM, или одинарную кавычку (‘).
  • Строки кода – что бы произвести перенос одной строки на несколько, используется символ подчёркивания.
  • Переменные – для объявления переменных используется ключевое слово Dim. Более детально, работу с ними я рассмотрел в статье «Урок 2 по VBScript: Переменные»

Можно прописать несколько операторов в одну строчку, для этого используется знак двоеточия (:). Сам язык нечувствителен к регистру символов.

Хорошо, давайте рассмотрим синтаксис языка vbscript на таком примере:

'****************************************
REM Общий синтаксис vbscript
REM primer_1.vbs
'****************************************

dim a, b, c
 
a = "строка"
b = 100
c = 22.5
 
MsgBox a:MsgBox b:MsgBox c

Видим, что тут, мы вначале прописали комментарии, далее объявили три переменные. Как видим, язык vbscript не требует назначения типа данных (более детально, работу с типами данных я рассмотрел в статье – «Урок 3 по VBScript: Типы данных»). В конце, для вывода данных мы использовали функцию MsgBox, в данном случае она прописана в упрощенном варианте. Давайте рассмотрим ее полный синтаксис:

MsgBox(prompt[, buttons] [, title ][, helpfile, context ] ) – видим, что тут, функции передаются пять параметров, последние два мы рассматривать не будет, так как они не являются актуальными и практически не применяются.

  • prompt – собственно, сообщение, которое надо вывести
  • buttons – позволяет задать дополнительные кнопки, их значения указываются через константы
  • title – заголовок окна

Работу с данной функцией я более детально рассмотрел в статье «Создание диалоговых окон».

Язык vbscript предоставляют также функции для работы со строками и датой, а также, ряд математических функций.

Конечно, синтаксис vbscript позволяет пользователю создавать собственные процедуры и функции. Для определения процедуры, т. е. подпрограммы, которая не возвращает никакого значения, в VBScript используется конструкция Sub … End Sub. После ключевого слова Sub идёт имя процедуры, а в круглых скобках указывается список её пара­метров, например:

Sub MyProcedure(Param1, Param2)
Строки кода
End Sub

Если процедура не имеет параметров, то в скобках после имени ничего ука­зывать не нужно:

Sub MyProcedure()

End Sub

Вызывать процедуру из сценария можно двумя способами. Во-первых, мож­но просто написать имя и указать через пробел список передаваемых параметров, например: MyProcedure 3,10. Во-вторых, можно использовать специальный оператор Call, при этом спи­сок параметров обязательно должен быть заключен в круглые скобки: Call MyProcedure(3,10).

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

Для определения функции, т. е. подпрограммы, которая возвращает опреде­ленное значение, применяется конструкция Function … End Function. Как и при описании процедур, после названия функции в круглых скобках указывается список её параметров, например:

Function MyFunction(Param1, Param2) … End Function

Для того чтобы возвратить из функции какое-либо значение, нужно внутри неё присвоить это значение переменной, название которой совпадает с именем функции:

Function MyFunction(Param1, Param2)
Dim Sum
Sum = Paraml+Param2
MyFunction = Sum
End Function

Если возвращаемое функцией значение не нужно присваивать никакой пе­ременной, то функция вызывается так же, как и процедура — пишется имя этой функции и через пробел указывается список ее аргументов: MyFunction 3,5

Если же необходимо записать значение в какую-либо переменную, то аргументы функции заключаются в круглые скобки.

Вот простой пример синтаксиса vbscript для использования собственных процедур и функций:

'****************************************
REM Общий синтаксис vbscript
REM primer_2.vbs
'****************************************

dim a, b, c
' пользовательская функция
Function my_fun(a, b)
     Dim Summ
     Summ = a+b
     my_fun = Summ
End Function
 
' пользовательская процедура
Sub my_sub(a, b)
     Dim Summ
     Summ = a+b
     MsgBox Summ
End Sub
 
MsgBox my_fun(5,10)
Call my_sub(100,200)

Помимо процедур и функций, можно создавать собственные массивы (Урок 9 по VBScript: Массивы) и классы (Урок 8 по VBScript: Объекты и классы)

Ну что же, вдобавок, хотелось бы упомянуть две очень полезные функции:

  • Hex(number ) – функция позволяет получить 16-ричное значение для числа number
  • Oct(number) — функция позволяет получить 8-ричное значение для числа number

Смотрим на третий пример:

'****************************************
REM Общий синтаксис vbscript
REM primer_3.vbs
'****************************************
dim my_var
 
my_var = 200
 
MsgBox Hex(my_var):MsgBox Oct(my_var)

«Многопоточность» WSH VBScript / Habr

Костыль

Доброго всем времени суток. Предлагаю костыль, реализующий механизм многопоточности (а точнее «многопроцессности») для WSH VBScript. Не рекомендуется лицам с аллергией на индокод.
Первая мысль о потенциальных удобствах многопоточности пришла однажды во время решения на добровольных началах относительно несложной задачи по обработке и визуализации информации. И, поскольку установка IDE навроде Visual Studio и наш Helpdesk — понятия несовместимые, из «легальных» оставались только VBA и WSH. В то время был выбран последний. А действующие административные ограничения и желание получить дружественные методы продиктовали требования к данной реализации многопроцессности:
  • Код расположен в одном файле, как обычный сценарий.
  • Использует минимум ActiveX, и только встроенных, работоспособен без WMI, под WSH x86/x64.
  • Достаточная функциональность и удобство важнее быстродействия и паттернов.

Особенности:
  • Запущенный скрипт выполняет служебную функцию. Основной код выполняется в последующих процессах.
  • В «полной версии» основной код размещается только в классах, экземпляр любого из которых можно создать в отдельном процессе. В каждом новом процессе скрипт создает экземпляр служебного класса, который создает экземпляр указанного целевого класса, вызывает целевой метод, контролирует его ход, создает в глобальном контексте скриптов переменные, ссылающиеся на созданные экземпляры классов. В предшествующий скрипт возвращается объект инициализированного целевого класса, и «обрабатываются» события инициализации и завершения целевого класса запущенного скрипта.
  • В «легкой версии» логика аналогична, только основной код размещается внутри sub’ов, предшествующему скрипту возвращается не объект, а индекс запущенного, и нет обработки событий.
  • Для создания нового процесса скрипт рекурсивно запускает самого себя, передав данные о вызываемом методе и идентифицирующую информацию в именованном аргументе.
  • Единого пространства исполнения нет, каждый скрипт хранит свои данные и объекты в своем контексте. Для обмена данными объект Me первого скрипта передается в последующие с применением GlobalContainer, описанным в теме «обмен данными и объектами между скриптами — 2» на Сером форуме. Каждый скрипт после завершения целевого метода ожидает разрешения на завершение, такая задержка позволяет забрать из него полученную информацию.
  • Функционирует одинаково в WSH WScript и CScript, и в виде скомпилированного в ScriptCryptor exe-файла (правда, в exe не работают методы class_terminate).

Минусы:
  • Сложность в отладке из-за использования во многих методах on error resume next и execute. Все ж таки это костыль.
  • Громоздкость.
  • Порядок завершения скриптов полностью в ответственности разработчика. Естественно, при обращении к объектам завершенного скрипта возникнет ошибка.

Актуально:
  • Не реализованы мьютексы и механизмы залочивания метода от использования более чем одним процессом.
  • Возможны сбои при одновременном доступе к переменным скрипта из контекстов других.
  • Окно проводника остается в памяти при закрытии окна консоли CScript.exe.
Легкая версия mproclite.vbs:
option explicit
launch "base"

' main programm section

sub base()
	startproc "msg"
	startproc "msg"
	startproc "msg"
	msgbox "base, id = " & id, 64
	free id
end sub

sub msg()
	msgbox "msg, id = " & id, 64
	free id
end sub

' do not modify service section

sub launch(byval destination)
	dim job
	executeglobal "dim scene, container, signature, subname, jobs, id, state, release"
	release = false
	if not wscript.arguments.named.exists("task") then
		dim elt
		executeglobal "dim found, lost"
		id = 0
		found = 0
		lost = 0
		signature = ""
		randomize
		do
			signature = signature & hex(rnd * 16)
		loop while len(signature) < 16
		set scene = me
		set jobs = createobject("Scripting.Dictionary")
		set jobs(0) = scene
		set container = getobject("new:{C08AFD90-F2A1-11D1-8455-00A0C91F3880}")
		container.putproperty signature, scene
		startproc destination
		on error resume next
		do until (lost >= found) or release
			for elt = found to 1 step -1
				if typename(jobs(elt)) = "Object" then
					lost = lost + 1
					jobs(elt) = empty
				end if
				err.clear
				wscript.sleep 1
			next
		loop
		release = true
		executeglobal "scene_beforeterminate"
		for elt = found to 1 step -1
			if typename(jobs(elt)) = "VBScriptTypeInfo" then
				jobs(elt).wscript.timeout = 1
				jobs(elt).wscript.quit
				err.clear
				nojobs = false
			end if
			wscript.sleep 1
		next
		container.quit
	else
		job = split(wscript.arguments.named("task"), ";")
		signature = cstr(job(0))
		id = clng(job(1))
		subname = cstr(job(2))
		do
			for each container in createobject("Shell.Application").windows
				if isobject(container.getproperty(signature)) then
					exit do
				end if
			next
			wscript.sleep 1
		loop
		set scene = container.getproperty(signature)
		set jobs = scene.jobs
		state = 4
		set jobs(id) = me
		executeglobal subname
		state = 24
		do until release
			wscript.sleep 10
		loop
		state = 28
	end if
end sub

function startproc(subname)
	startproc = createproc(subname)
	joint startproc, 4, 0
	REM do while getstate(startproc) < 4
		REM wscript.sleep 10
	REM loop
end function

function createproc(subname)
	if me is scene then
		if not release then
			found = found + 1
			createproc = found
			set jobs(createproc) = nothing
			createobject("WScript.Shell").exec("""" & wscript.fullname & """ """ & wscript.scriptfullname & """ ""/task:" & join(array(signature, createproc, subname), ";") & """")
		end if
	else
		createproc = scene.createproc(subname)
	end if
end function

function getjob(target)
	on error resume next
	if jobs.exists(target) then
		set getjob = jobs(target)
		if err.number = 0 then exit function
		err.clear
	end if
	set getjob = nothing
end function

sub share(varname, value)
	scene.newvar varname
	if isobject(value) then
		execute "set scene." & varname & " = value"
	else
		execute "scene." & varname & " = value"
	end if
end sub

sub newvar(varname)
	executecommand "dim " & varname
end sub

sub executecommand(command)
	executeglobal command
end sub

function getstate(target)
	dim elt
	if jobs.exists(target) then
		on error resume next
		set elt = jobs(target)
		getstate = elt.state
		if err.number <> 0 then
			if not(elt is nothing) then
				getstate = 64
			else
				getstate = 1
			end if
		end if
		set elt = nothing
	else
		getstate = 64
	end if
end function

function isresponsive(target)
	isresponsive = cbool(getstate(target) and 28)
end function

sub free(target)
	if jobs.exists(target) then
		on error resume next
		jobs(target).release = true
	else
		dim elt, subname
		for elt = scene.found to 1 step -1
			on error resume next
			subname = jobs(elt).subname
			if subname = target then
				free jobs(elt).id
			end if
			err.clear
		next
	end if
end sub

function joint(target, state, timeout)
	dim reftime
	reftime = timer
	on error resume next
	if jobs.exists(target) then
		if isnumeric(target) then
			do while getstate(target) < state
				if timeisout(timeout, reftime) then
					joint = false
					exit function
				end if
				wscript.sleep 10
			loop
		else
			dim elt, subname
			for elt = scene.found to 1 step -1
				subname = jobs(elt).subname
				err.clear
				if subname = target then
					do while getstate(target) < state
						if timeisout(timeout, reftime) then
							joint = false
							exit function
						end if
						wscript.sleep 10
					loop
				end if
				err.clear
			next
		end if
	end if
	joint = true
end function

function timeisout(timeout, reftime)
	if timeout > 0 then
		dim delta
		delta = timer - reftime
		if delta < 0 then delta = delta + 86400
		if delta > timeout then
			timeisout = true
		end if
	else
		timeisout = false
	end if
end function

sub interrupt(target, timeout)
	if jobs.exists(target) then
		on error resume next
		jobs(target).wscript.timeout = timeout
		jobs(target).wscript.quit
	else
		dim elt, subname
		for elt = scene.found to 1 step -1
			on error resume next
			subname = jobs(elt).subname
			if subname = target then
				interrupt jobs(elt).id
			end if
			err.clear
		next
	end if
end sub

sub push(name, value)
	container.putproperty name, value
end sub

function pop(name)
	on error resume next
	if isobject(container.getproperty(name)) then
		set pop = container.getproperty(name)
	else
		pop = container.getproperty(name)
	end if
end function
Описание:

Функции механизма многопроцессности легкой версии:

launch subname
Запускает служебный алгоритм, выполнение скрипта всегда начинается с его вызова.
subname – строка, указывает целевой sub, который будет выполнен в новом процессе.
Аргументы этого метода используются только в первично запущенном скрипте для начала выполнения основного кода.
В каждом новом скрипте:

  • Объявляются переменные в глобальном пространстве запущенного скрипта:
    scene – ссылка на объект Me первого скрипта,
    container – ссылка на окно проводника GlobalContainer,
    signature – строка, сгенерирована для идентификации GlobalContainer,
    found, lost – только для scene – счетчики созданных и завершенных процессов скриптов,
    subname – строка, содержит цель скрипта,
    jobs – ссылка на словарь с объектами Me запущенных скриптов, созданный в scene,
    id – порядковый номер данного скрипта — ключ в словаре,
    release = Ложь — после завершения целевого sub’а скрипт будет завершен после присвоения Истина,
    state = 4 – состояние, в котором находится данный скрипт.
  • Добавляется элемент в словарь jobs.

startproc(subname)
subname – см. launch().
Создает новый процесс скрипта, ожидает его готовности до состояния 4 (см. getstate()), когда можно обращаться к объекту Me скрипта. Возвращает число — id запущенного скрипта.

createproc(subname)
subname – см. launch().
Создает новый процесс скрипта, не ожидая, возвращает число — id запущенного скрипта. Используется для асинхронного создания нескольких процессов в цикле, без ожидания готовности каждого. Заметно быстрее по сравнению с использованием startproc() для такого применения.

getjob(target)
target – число, id скрипта или строка, имя subname группы созданных скриптов.
Обеспечивает доступ к объекту Me скрипта. Возвращает ссылку на объект Me скрипта, если id не найден или скрипт завершен – Nothing.

getstate(target)
target – число, id скрипта.
Определяет состояние скрипта. Возвращает число, этап выполнения:
1 процесс создан (new process exec),
4 скрипт запущен (initialized),
24 целевой sub выполнен (sub completed),
28 скрипт освобожден (released),
64 не найден (host not found), скрипт завершен (terminated).

isresponsive(target)
target — см. getstate().
Определяет доступность объекта Me скрипта (состояния с 4 по 28). Возвращает булево значение.

executecommand command
command — строка, содержащая инструкции.
Вызов интерпретатора для выполнения операторов в глобальном пространстве скрипта.

share varname, value
varname — строка, содержащая имя переменной, value – любое значение.
Объявляет в глобальном пространстве первого скрипта переменную с именем varname, которая становится доступна всем скриптам в виде свойства scene, присваивает переменной содержимое value.

newvar varname
varname — строка, содержащая имя переменной.
Объявляет новую переменную в глобальном пространстве скрипта.

free target
target – число, id скрипта или строка, имя subname группы созданных скриптов. Разрешает завершение скрипта после выполнения целевого sub’а. Работает с одним скриптом или с группой.

joint(target, state, timeout)
target — см. free(), state — см. getstate(), timeout – число, в секундах, с миллисекундами.
Ожидает наступления состояния скрипта state, для группы скриптов ожидание длится, пока каждый не достигнет state. Ожидание ограничено таймаутом, timeout = 0 означает неограниченное ожидание. Возвращает булево значение, Истина – ожидание закончено, Ложь – таймаут. Предназначен для синхронизации работы скриптов. Например, если необходимо дождаться запуска скрипта — 4, полного завершения скрипта — 64;

interrupt target, timeout
target — см. free(), timeout – значение для wscript.timeout, в секундах.
Переводит скрипт к штатному завершению, с выполнением методов class_terminate. Если в скрипте были открыты диалоговые окна, он перейдет к завершению только после паузы timeout. Повторное появление диалогового окна в методах class_terminate остановит завершение.

push name, value
name – строка, имя свойства, value – любое значение.
Помещает в свойство GlobalContainer с именем name содержимое value.

pop(name)
name – строка, имя свойства.
Возвращает из GlobalContainer содержимое свойства с именем name.

Полная версия mproc.vbs:
option explicit
dim mproc
set mproc = new multiprocess
mproc.launch "base", "run", ""

' main programm section

class base
	
	public sub run()
		host.startproc "msg", "run", "first"
		host.startproc "msg", "run", "second"
		host.startproc "msg", "run", "third"
		msgbox "base, id = " & host.id, 64
		host.free host.id
	end sub
	
end class

class msg
	
	public sub run()
		msgbox host.aliasname & ", id = " & host.id, 64
		host.free host.id
	end sub
	
end class

' do not modify service class section

class multiprocess
	
	public primary, ancestor, parent, process, err
	public names, execs, hosts
	public id, aid, isprimary
	public classname, methodname, aliasname
	public found, lost, active
	public state, permit, release
	private container, signature, wshshell
	
	public sub launch(startclassname, startmethodname, startaliasname)
		permit = false
		release = false
		executeglobal "dim scene, host, ancestor, process"
		if not isempty(host) then exit sub
		set host = me
		executeglobal "set host.err = err"
		executeglobal "function getroot: set getroot = me: end function"
		set parent = getroot
		isprimary = not wscript.arguments.named.exists("task")
		if isprimary then
			dim sample
			state = 24
			randomize
			signature = ""
			do
				signature = signature & hex(rnd * 16)
			loop while len(signature) < 16
			aid = empty
			id = 0
			found = 0
			lost = 0
			set wshshell = createobject("WScript.Shell")
			set primary = host
			set ancestor = nothing
			set process = nothing
			set scene = parent
			set parent.ancestor = nothing
			set parent.process = nothing
			set hosts = createobject("Scripting.Dictionary")
			set execs = createobject("Scripting.Dictionary")
			set names = createobject("Scripting.Dictionary")
			classname = empty
			methodname = empty
			aliasname = empty
			set hosts(0) = host
			set container = getobject("new:{C08AFD90-F2A1-11D1-8455-00A0C91F3880}")
			container.putproperty signature, parent
			startproc startclassname, startmethodname, startaliasname
			on error resume next
			do
				for each sample in execs.keys
					if release or active = 0 then exit do
					if not (execs(sample) is nothing) then
						if execs(sample).status > 0 then
							abolish sample
						end if
					end if
					wscript.sleep 1
				next
			loop
			release = true
			state = 28
			scenequit
		else
			dim job
			job = split(wscript.arguments.named("task"), ";")
			signature = cstr(job(0))
			do
				for each container in createobject("Shell.Application").windows
					if isobject(container.getproperty(signature)) then
						exit do
					end if
				next
				wscript.sleep 1
			loop
			aid = clng(job(1))
			id = clng(job(2))
			found = null
			lost = null
			set scene = container.getproperty(signature)
			set primary = scene.host
			set hosts = primary.hosts
			set ancestor = hosts(aid)
			if isresponsive(aid) then
				set parent.ancestor = ancestor.parent.process
			else
				set parent.ancestor = nothing
			end if
			classname = cstr(job(3))
			methodname = cstr(job(4))
			aliasname = cstr(job(5))
			state = 4
			primary.implicate id, aliasname, host
			executeglobal "set process = new " & classname
			executeglobal "set host.process = process"
			executeglobal "set scene." & aliasname & " = process"
			if isresponsive(aid) then
				executeglobal "set host.ancestor.parent." & aliasname & " = process"
			end if
			state = 8
			primary.staff host
			ancestorevent "oninitialized"
			state = 12
			if methodname <> "" then
				do until permit
					wscript.sleep 10
				loop
				state = 16
				executeglobal "process." & methodname
			end if
			state = 20
			ancestorevent "oncompleted"
			state = 24
			do until release
				wscript.sleep 10
			loop
			state = 28
		end if
	end sub
	
	public default function startproc(classname, methodname, aliasname)
		set startproc = start(createproc(classname, methodname, aliasname))
	end function
	
	public function createproc(classname, methodname, aliasname)
		if aliasname = "" then aliasname = classname
		newvar aliasname
		scene.host.newvar aliasname
		createproc = primary.spawn(id, classname, methodname, aliasname)
	end function
	
	public function spawn(issuer, classname, methodname, aliasname)
		if not release then
			found = found + 1
			spawn = found
			active = found - lost
			names(spawn) = aliasname
			set hosts(spawn) = nothing
			if not hosts.exists(aliasname) then
				hosts.add aliasname, createobject("Scripting.Dictionary")
			end if
			set hosts(aliasname)(spawn) = nothing
			execs.add spawn, wshshell.exec("""" & wscript.fullname & """ """ & wscript.scriptfullname & """ ""/task:" & join(array(signature, issuer, spawn, classname, methodname, aliasname), ";") & """")
		end if
	end function
	
	public function start(target)
		select case outline(target)
		case "Nothing", "multiprocess"
			do while getstate(target) < 12
				wscript.sleep 10
			loop
			if isresponsive(target) then
				set start = hosts(target).process
				hosts(target).permit = true
			else
				set start = nothing
			end if
		case "Dictionary"
			dim elt
			set start = hosts(target)
			for each elt in start.keys
				do while getstate(elt) < 12
					wscript.sleep 10
				loop
			next
			for each elt in start.keys
				if isresponsive(elt) then
					hosts(elt).permit = true
				end if
			next
		case else
			set start = nothing
		end select
	end function
	
	public sub implicate(id, aliasname, host)
		set hosts(aliasname)(id) = host
		set hosts(id) = host
	end sub
	
	public sub staff(host)
		set hosts(host.process) = host
	end sub
	
	public sub abolish(id)
		if hosts.exists(names(id)) then
			hosts(names(id))(id) = empty
		end if
		names(id) = empty
		if isresponsive(id) then
			hosts(hosts(id).process) = empty
		end if
		hosts(id) = empty
		set execs(id) = nothing
		lost = lost + 1
		active = found - lost
	end sub
	
	private sub ancestorevent(eventname)
		if aid > 0 then
			on error resume next
			executeglobal "ancestor." & aliasname & "_" & eventname & " host.hosts(" & id & ")"
			if err.number = 424 or err.number = 438 then err.clear
		end if
	end sub
	
	public sub assignhandler(handlername, byval varsqty)
		dim vars
		vars = ""
		if varsqty > 0 then
			do
				vars = vars & "param" & varsqty
				varsqty = varsqty - 1
				if varsqty = 0 then exit do
				vars = vars & ", "
			loop
		end if
		executeglobal "sub " & handlername & "(" & vars & "): process." & handlername & " " & vars & ": end sub"
	end sub
	
	public sub newvar(varname)
		executecommand "dim " & varname
	end sub
	
	public sub executecommand(command)
		executeglobal command
	end sub
	
	public function getstate(target)
		select case outline(target)
		case "multiprocess"
			on error resume next
			getstate = hosts(target).state
			if err.number <> 0 then
				err.clear
				getstate = 64
			end if
		case "Nothing"
			getstate = 1
		case "Dictionary"
			getstate = null
		case empty
			getstate = 0
		case else
			getstate = 64
		end select
	end function
	
	private function outline(target)
		on error resume next
		if hosts.exists(target) then
			outline = typename(hosts(target))
			if err.number <> 0 then
				err.clear
				outline = "Object"
			end if
		else
			outline = empty
		end if
	end function
	
	public function isresponsive(target)
		isresponsive = cbool(getstate(target) and 28)
	end function
	
	public function getid(target)
		on error resume next
		if isobject(target) then
			if isresponsive(target) then
				getid = hosts(target).id
				if err.number = 0 then exit function
				err.clear
			end if
		elseif primary.execs.exists(target) then
			getid = target
			exit function
		end if
		getid = null
	end function
	
	public function gethost(target)
		on error resume next
		if hosts.exists(target) then
			set gethost = hosts(target)
			if err.number = 0 then exit function
			err.clear
		end if
		set gethost = nothing
	end function
	
	public sub free(target)
		select case outline(target)
		case "multiprocess"
			on error resume next
			gethost(target).release = true
			err.clear
		case "Dictionary"
			dim elt
			for each elt in gethost(target)
				free(elt)
			next
		end select
	end sub
	
	public function joint(target, state, timeout)
		dim reftime
		reftime = timer
		select case outline(target)
		case "multiprocess", "Nothing"
			do while getstate(target) < state
				if timeisout(timeout, reftime) then
					joint = false
					exit function
				end if
				wscript.sleep 10
			loop
		case "Dictionary"
			dim elt
			for each elt in gethost(target)
				do while getstate(elt) < state
					if timeisout(timeout, reftime) then
						joint = false
						exit function
					end if
					wscript.sleep 10
				loop
			next
		end select
		joint = true
	end function
	
	private function timeisout(timeout, reftime)
		if timeout > 0 then
			dim delta
			delta = timer - reftime
			if delta < 0 then delta = delta + 86400
			if delta > timeout then
				timeisout = true
			end if
		else
			timeisout = false
		end if
	end function
	
	public sub interrupt(target, timeout)
		select case outline(target)
		case "multiprocess"
			on error resume next
			with gethost(target).parent
				.wscript.timeout = timeout
				.wscript.quit
			end with
			err.clear
		case "Dictionary"
			dim elt
			for each elt in gethost(target)
				interrupt elt, timeout
			next
		end select
	end sub
	
	public sub kickout(target)
		if primary.execs.exists(target) then
			if getstate(target) < 64 then
				on error resume next
				primary.execs(target).terminate
				err.clear
			end if
		else
			select case outline(target)
			case "multiprocess"
				kickout getid(target)
			case "Dictionary"
				dim elt
				for each elt in gethost(target)
					kickout(elt)
				next
			end select
		end if
	end sub
	
	public sub terminate(target)
		interrupt target, 1
		if not joint(target, 64, 2) then kickout target
	end sub
	
	public sub push(name, value)
		container.putproperty name, value
	end sub
	
	public function pop(name)
		on error resume next
		if isobject(container.getproperty(name)) then
			set pop = container.getproperty(name)
		else
			pop = container.getproperty(name)
		end if
	end function
	
	private sub scenequit
		if isprimary then
			dim col, i, status
			col = execs.keys
			for i = ubound(col) to 0 step -1
				interrupt col(i), 1
			next
			wscript.sleep 2000
			on error resume next
			for i = ubound(col) to 0 step -1
				status = execs(col(i)).status
				if err.number = 0 and status = 0 then execs(col(i)).terminate
				err.clear
			next
			container.quit
		end if
	end sub
	
	private sub class_terminate()
		if state < 28 and isprimary then scenequit
	end sub
	
end class
Описание:

Методы класса multiprocess:

launch classname, methodname, aliasname
Запускает служебный алгоритм, выполнение скрипта всегда начинается с его вызова.
classname, methodname, aliasname – строки. Указывают целевой класс classname и метод этого класса methodname, который будет выполнен в новом процессе, экземпляр класса classname будет помещен в переменную с именем aliasname (или classname, если aliasname – пустая строка).
Аргументы этого метода используются только в первично запущенном скрипте для начала выполнения основного кода.
В каждом новом скрипте:

  • Объявляются переменные в глобальном пространстве запущенного скрипта:
    scene – ссылка на объект Me первого скрипта,
    host – экземпляр класса multiprocess данного скрипта,
    process – экземпляр целевого класса с именем classname, которое было указано предшествующим скриптом при создании процесса данного скрипта,
    ancestor – экземпляр целевого класса предшествующего скрипта.
  • Объявляются переменные в глобальном пространстве scene и предшествующего скрипта, с именем aliasname – ссылки на экземпляр целевого класса данного скрипта.
  • Задаются свойства host:
    primary – ссылка на экземпляр класса multiprocess первого скрипта,
    ancestor – ссылка на экземпляр класса multiprocess предшествующего скрипта,
    parent – объект Me данного скрипта,
    process – ссылка на process в глобальном пространстве,
    err – ссылка на объект err данного скрипта,
    names – ссылка на словарь с aliasname, созданный в primary,
    execs – ссылка на словарь с объектами wshexec запущенных процессов, созданный в primary,
    hosts – ссылка на словарь с объектами host запущенных процессов, созданный primary,
    id – порядковый номер данного скрипта — ключ в словарях,
    aid – то же, предшествующего скрипта,
    isprimary – булево, является ли данный скрипт первично запущенным,
    found, lost, active – только для primary – счетчики созданных, завершенных и активных процессов скриптов,
    classname, methodname, aliasname – содержат цель скрипта,
    permit = Ложь — целевой метод будет запущен после присвоения Истина,
    release = Ложь — после завершения целевого метода скрипт будет завершен после присвоения Истина,
    state = 4 – состояние, в котором находится данный скрипт.
  • Добавляются элементы в словари names, execs, hosts.

startproc(classname, methodname, aliasname)
classname, methodname, aliasname – см. launch().
Создает новый процесс скрипта, ожидает его готовности до состояния 12 (см. getstate()), запускает целевой метод. Возвращает ссылку на инициализированный в новом процессе экземпляр целевого класса.

createproc(classname, methodname, aliasname)
classname, methodname, aliasname – см. launch().
Создает новый процесс скрипта, не ожидая, возвращает его id. Используется для асинхронного создания нескольких процессов в цикле, без ожидания готовности каждого. Заметно быстрее по сравнению с использованием startproc() для такого применения.

start(target)
target – число, id скрипта, или строка, имя aliasname группы созданных скриптов.
Ожидает готовности скрипта, созданного с использованием createproc(), до состояния 12, разрешает выполнение целевого метода. Возможно использование для группы скриптов, имеющих одинаковый aliasname. Для одного скрипта возвращает ссылку на его инициализированный в новом процессе экземпляр целевого класса, для группы скриптов возвращает ссылку на субсловарь, содержащий все host с данными aliasname.

gethost(target)
target – число, id скрипта или строка, имя aliasname группы созданных скриптов, или объект process скрипта.
Обеспечивает доступ к экземпляру host класса multiprocess требуемого скрипта. Для одного скрипта возвращает ссылку на его host, для группы скриптов возвращает ссылку на субсловарь, содержащий все host с данными aliasname, если id не найден или скрипт завершен – Nothing.

getid(target)
target – число, id скрипта, или объект process скрипта.
Возвращает id срипта, определенное по объекту process. Только для действующих скриптов.

getstate(target)
target — см. getid().
Определяет состояние скрипта. Возвращает число, этап выполнения:
0 не найден (host not found),
1 процесс создан (new process exec),
4 host инициализирован (host initialized),
8 целевой класс инициализирован (process initialized),
12 целевой класс инициализирован, событие обработано (process initialized handled),
16 целевой метод запущен (process method launched),
20 целевой метод выполнен (process completed),
24 целевой метод выполнен, событие обработано (process completed handled),
28 скрипт освобожден (released),
64 скрипт завершен (terminated).

isresponsive(target)
target — см. getid().
Определяет доступность объекта host скрипта (состояния с 4 по 28). Возвращает булево значение.

assignhandler handlername, varsqty
handlername — строка, имя события, varsqty — число, количество передаваемых аргументов.
Создает в глобальном пространстве хэндлер события sub с именем события handlername, связывет его с одноименным методом в созданном объекте process. При наступлении события, хэндлер перенаправит вызов в process. handlername().

executecommand command
command — строка, содержащая инструкции.
Вызов интерпретатора для выполнения операторов в глобальном пространстве скрипта.

newvar varname
varname — строка, содержащая имя переменной.
Объявляет новую переменную в глобальном пространстве скрипта.

free target
target — см. gethost().
Разрешает завершение скрипта после выполнения целевого метода. Работает с одним скриптом или с группой.

joint(target, state, timeout)
target — см. gethost(), state — см. getstate(), timeout – число, в секундах, с миллисекундами.
Ожидает наступления состояния скрипта state, для группы скриптов ожидание длится, пока каждый не достигнет state. Ожидание ограничено таймаутом, timeout = 0 означает неограниченное ожидание. Возвращает булево значение, Истина – ожидание закончено, Ложь – таймаут. Предназначен для синхронизации работы скриптов. Например, если необходимо дождаться создания объекта process — 8, полного завершения скрипта — 64;

interrupt target, timeout
target — см. gethost(), timeout – значение для wscript.timeout, в секундах.
Переводит скрипт к штатному завершению, с выполнением методов class_terminate. Если в скрипте были открыты диалоговые окна, он перейдет к завершению только после паузы timeout. Повторное появление диалогового окна в методах class_terminate остановит завершение.

kickout target
target — см. gethost().
Завершает процесс скрипта на уровне ОС, используя wshexec.terminate. Возможно длительное выполнение, до 2 сек для каждого скрипта. Работает с одним скриптом или с группой.

terminate target
target — см. gethost().
Завершает скрипт, использует сначала interrupt, затем при необходимости kickout.

push name, value
name – строка, имя свойства, value – любое значение.
Помещает в свойство GlobalContainer с именем name содержимое value.

pop(name)
name – строка, имя свойства.
Возвращает из GlobalContainer содержимое свойства с именем name.

Методы, которые можно разместить в целевом классе данного скрипта в качестве хэндлеров событий инициализации целевого класса и выполнения целевого метода запущенного скрипта:

<aliasname>_ oninitialized(source)
source – передаваемый в метод объект host скрипта, вызвавшего метод, его aliasname содержится в имени метода. Метод вызывается после инициализации целевого класса запущенного скрипта (state = 8).

<aliasname>_ oncompleted(source)
source — передаваемый в метод объект host скрипта, вызвавшего метод, его aliasname содержится в имени метода. Метод вызывается после выполнения целевого метода запущенного скрипта (state = 20).

Пример:

Для mproclite и mproc демонстрируется работа на примере абстрактной задачи: для каждого символа из строки letters создаются отдельные процессы, каждый в цикле помещает свой символ в буфер, по мере заполнения которого другой процесс выводит по 3 «слова» в консоль. Для WScript консоль сымитирована окном IE. Попутно выводятся запущенные и остановленные процессы ОС (в примере используется WMI, но для функционирования механизма он не обязателен).
В ходе дебага у меня накопились некоторые наблюдения и комменты, коими я поделюсь, если будет спрос — дело в том, что потребуется время, чтобы привести их в читабельный вид. Конструктивная критика приветствуется.

Урок VBScript №18: Объект WScript

Объект WScript является главным в Windows Script Host и позволяет подключать остальные его компоненты. Данный объект не нужно создавать или куда то прописывать, он создаётся автоматически, сервером сценариев (CScript.exe или WScript.exe). Благодаря этому объекту мы можем получать информацию о запущенном сценарии и о самом WSH. Так же мы можем устанавливать время работы нашего сценария. Будет интересно.

 

[1] Свойства объекта WScript

[1.1] Timeout — устанавливает время в секундах, по истечению которых, скрипт будет остановлен.

'********************************************************
'Урок VBScript №18:
'Объект WScript
'file_1.vbs
'********************************************************
WScript.Timeout = 10
Do
Loop

В данном примере мы запускаем бесконечный цикл Do … Loop на 10 секунд.

[1.2] Name — Вернёт наименование сервера сценариев.

[1.3] FullName — Вернёт полный путь к исполняемому файлу сервера сценариев.

[1.4] Path — Вернёт полный путь к каталогу исполняемого файла сервера сценариев.

[1.5] Version — Вернёт версию сервера сценариев.

[1.6] BuildVersion — Номер сборки сервера сценариев.

[1.7] ScriptName — Имя запущенного файла сценария.

[1.8] ScriptFullName — Полный путь к запущенному файлу.

'********************************************************
'Урок VBScript №18:
'Объект WScript
'file_2.vbs
'********************************************************
MsgBox WScript.Name & vbCrlf & WScript.FullName & vbCrlf & WScript.Path & vbCrlf & _
WScript.Version & vbCrlf & WScript.BuildVersion & vbCrlf & WScript.ScriptName & vbCrlf & WScript.ScriptFullName

[1.9] StdIn — Вернёт объект «TextStream», соответствующий стандартному входному потоку. Доступен, если скрипт запущен в командной строке (CScript.exe).

[1.10] StdOut — Вернёт объект «TextStream», соответствующий стандартному выходному потоку. Доступен, если скрипт запущен в командной строке (CScript.exe).

[1.11] StdErr — Вернёт объект «TextStream», соответствующий стандартному потоку ошибок. Доступен, если скрипт запущен в командной строке (CScript.exe).

'********************************************************
'Урок VBScript №18:
'Объект WScript
'file_3.vbs
'********************************************************
WScript.StdErr.Write "StdErr!" & vbCrlf

WScript.StdOut.Write "Ввдеите строку: "
Res = WScript.StdIn.ReadLine
MsgBox Res

WScript.StdOut.Write "Ввдеите строку: "
Res = WScript.StdIn.ReadLine
MsgBox Res

Что бы запустить данный пример, вам надо нажать на файл скрипта правой кнопкой мыши и выбрать — «Открыть в командной строке».

[1.12] Interactive — Возвращает или устанавливает режим запуска скрипта. Разрешён (True) диалог с пользователем или нет (False).

'********************************************************
'Урок VBScript №18:
'Объект WScript
'file_4.vbs
'********************************************************
MsgBox WScript.Interactive
WScript.Interactive = False
MsgBox WScript.Interactive

[1.13] Arguments — Вернёт объект «WshArguments» — коллекция параметров, с которыми был запущен скрипт.

Для запуска демонстрации данного примера нам понадобятся два файла сценария. Первый файл будет запускать второй скрипт с примером и установит параметры.

'********************************************************
'Урок VBScript №18:
'Объект WScript
'file_5_1.vbs
'********************************************************
Set WshShell = CreateObject("WScript.Shell")
WshShell.Run "wscript.exe file_5_2.vbs /param1 /param2"

Здесь мы использовали объект «WshShell» или просто «Shell». О нём мы поговорим в других уроках.

'********************************************************
'Урок VBScript №18:
'Объект WScript
'file_5_2.vbs
'********************************************************
For Each Argument In WScript.Arguments
	MsgBox Argument
Next

Стоит отметить, что если вы перетащите какой либо файл или папку на скрипт с примером, то он вернёт полный путь к этому объекту. Что, несомненно здорово.

Подробней об объекте «WshArguments» я расскажу ниже, после методов объекта «WScript».

[2] Методы объекта WScript

[2.1] Sleep — Приостанавливает выполнение скрипта на указанное количество миллисекунд.

'********************************************************
'Урок VBScript №18:
'Объект WScript
'file_6.vbs
'********************************************************
MsgBox "Sleep"
WScript.Sleep 10000
MsgBox "Sleep"

[2.2] Quit -Завершение скрипта с указанным кодом возврата. Код возврата указывать не обязательно.

'********************************************************
'Урок VBScript №18:
'Объект WScript
'file_7.vbs
'********************************************************
MsgBox "Quit"
WScript.Quit 2
MsgBox "Quit"

[2.3] Echo — Аналог функции MsgBox, но с меньшими возможностями. Данный метод так же доступен в JSCRIPT в отличие от функции MsgBox.

Синтаксис: Echo(<Arg1>,<Arg2>,…,<ArgN>)

Указанные параметры будут разделены пробелом.

[2.4] CreateObject — создаёт программный объект автоматизации.

Синтаксис: CreateObject(ProgID[, Prefix)

  • ProgID — Программный идентификатор объекта (ProgID).
  • Prefix — Префикс функций-обработчиков событий. Нужен, если указанный объект позволяет производить обработку событий. Если префикс «Pref», а событие называется «Sob», то будет вызвана функция «Pref_Sob».
'********************************************************
'Урок VBScript №18:
'Объект WScript
'file_8.vbs
'********************************************************
Set Network = WScript.CreateObject("WScript.Network")
MsgBox Network.ComputerName

[2.5] ConnectObject — Устанавливает соединение с объектом автоматизации для обработки его событий.

Синтаксис: ConnectObject(Obj, Prefix)

  • Obj — Объект.
  • Prefix — смотрим выше.
'********************************************************
'Урок VBScript №18:
'Объект WScript
'file_10.vbs
'********************************************************
Set Word = CreateObject("Word.Application")
Set Document = Word.Documents.Add
Word.Visible = True
WScript.ConnectObject Document, "Word_"

boolDone = False
Do
    WScript.Sleep 100
Loop Until boolDone

Sub Word_Close
    boolDone = True
    WScript.Echo "Сейчас произодёт закрытие Word"
    WScript.DisconnectObject Document
    Set Document = Nothing
End Sub

Данный пример открывает Word. Когда вы его закрываете, вылезает наше сообщение.

[2.6] DisconnectObject — закрывает соединение с объектом автоматизации. Пример показан в предыдущем методе.

[2.7] GetObject — создаёт программный объект автоматизации. Очень похож на CreateObject, но здесь можно напрямую задавать имя файла и путь по которому находится библиотека запуска файла.

Синтаксис: GetObject(Pathname [,ProgID][, Prefix])

  • Pathname — Полный путь к файлу, содержащему объект.
  • ProgID и Prefix смотрите выше.

[3] Объект-коллекция WshArguments

Создание объекта WshArguments:

Set WshArg = WScript.Arguments

Прежде чем описывать свойства и методы, я напомню, что для запуска примера нам понадобится ещё один скрипт.

'********************************************************
'Урок VBScript №18:
'Объект WScript
'file_11.vbs
'********************************************************
Set WshShell = CreateObject("WScript.Shell")
WshShell.Run "wscript.exe test.vbs /Город:""Нижний новгород"" параметр1 параметр2"

Не забудьте менять название файла в последней строке.

[4] Свойства объекта-коллекции WshArguments

[4.1] Item — Возвращает значение указанного элемента коллекции. Отчёт начинается с нуля.

[4.2] Length — Количество переданных аргументов скрипту (число элементов коллекции)

[4.3] Named — Вернёт коллекцию только из именных параметров.

[4.4] Unnamed — Вернёт коллекцию только из не именных параметров.

 

'********************************************************
'Урок VBScript №18:
'Объект WScript
'file_12.vbs
'********************************************************
Dim WshArg, i, List
Set WshArg = WScript.Arguments
Set Named = WScript.Arguments.Named
Set Unnamed = WScript.Arguments.Unnamed
i=0
Do Until i=WshArg.Length
    List = List & vbCrlf & WshArg.Item(i)
	i=i+1
Loop
MsgBox "Переданные параметры:" & vbCrlf & List

If Named.Exists("Город") then MsgBox "Именной параметр: " & Named.Item("Город") & vbCrlf & "Всего их: " & Named.Count

i=0
List = ""
Do Until i=Unnamed.Count
    List = List & vbCrlf & Unnamed.Item(i) & " или " & Unnamed(i)
	i=i+1
Loop
MsgBox "Переданные безымянные параметры:" & vbCrlf & List

На мой взгляд всё понятно.

[5] Методы объекта-коллекции WshArguments

[5.1] Count — Тоже что и свойство Length.

[5.2] ShowUsage — Возвращает информацию о запущенном сценарии (описание аргументов, пример запуска). Имеет смысл только при использовании WSH-сценариев с разметкой XML.

На этом данная тема заканчивается. До встречи!

Уроки VBScript | VBHack

Объект WScript является главным в Windows Script Host и позволяет подключать остальные его компоненты. Данный объект не нужно создавать или куда то прописывать, он создаётся автоматически, сервером сценариев (CScript.exe или WScript.exe). Благодаря этому объекту мы можем получать информацию о запущенном сценарии и о самом WSH. Так же мы можем устанавливать время работы нашего сценария. Будет интересно.

 

(далее…)

Настало время познакомить вас с объектом RegExp языка VBScript, или, по другому — регулярное выражение. Данный объект VBScript позволяет создавать шаблон из метасимволов, по которому впоследствии выполняются определённые действия: сравнивание текста; заменять или удалять текст, соответствующий шаблону; извлекать текст, соответствующий шаблону. Например, нам надо в строке найти номер телефона типа «+7(***)***-***-**», где * — любая цифра. Так же данный объект позволит нам создать Proxy Parser на VBScript.

(далее…)

Что то я совсем убежал вперёд и не рассказал вам про две функции диалоговых окон: MsgBox и InputBox. В этом очень небольшом уроке я и расскажу про все приблуды к этим двум функциям. Так же существуют и другие способы создания диалоговых окон, но для этого потребуются объекты WSH, о которых будет разговор в следующих уроках.

 

(далее…)

Приветствую читателей своего блога по VBS программированию. Сегодня я расскажу про небольшой объект Dictionary. В использование встречается несправедливо редко. Он является объектом-коллекцией или словарём, как его называют иногда, по переводу названия. Данный объект напоминает массив VBS, но с более расширенными возможностями: задействовать в качестве номера элемента строковое значение, удаление элемента данных в середине коллекции без образования пробела, отсутствие нужды в использование ReDim и так далее. Так же в конце статьи вас ждёт пример-игра от меня.

(далее…)

Наконец настало время заключительного урока по объекту FSO. В этой статье я расскажу про все свойства и методы позволяющие, так или иначе работать с дисками. Одно из свойств может позволить нам выполнять сценарий VBScript только на определённом компьютере (по типу лицензии). Если Вас это заинтересовало, то буду рад поделиться имеющимися у меня знаниями.

 

(далее…)

В данной статье я расскажу про работу с файлами средствами VBS при помощи объекта FSO и File. В принципе все методы и свойства показанные здесь очень схожи с теми, что были в предыдущем уроке про работу с папками. Я бы даже сказал, что объект File — брат близнец объекта Folder. Данный урок будет полезен при создании VBS cтиллера для кражи паролей. Ну что, приступим.

 

(далее…)

В этой статье я расскажу про работу с папками при помощи объекта FSO, а так же объекта Folder. Данные объекты Windows Script Host позволяют нам создавать, удалять, проверять наличие папки, копировать или перемещать папки по шаблону, не используя циклов. Всё это будет подкреплено примерами VBScript.

 

(далее…)

В данной статье я расскажу и покажу, как обрабатывать ошибки в языке VBScript. Расскажу про два оператора объекта Err: On Error Resume Next (Включает обработку ошибок) и On Error GoTo 0 (отключает обработку ошибок). Данные операторы позволяют выполнять определённые выражения после определённых ошибок, а не наблюдать окошко с ошибкой и прерывание выполнения сценария.

 

(далее…)

Вот наконец мы и добрались до урока по работе с текстовыми файлами при помощи VBScript. С этим нам поможет объект TextStream. Мы научимся создавать, открывать текстовые файлы, а так же записывать в ниж данные и считывать информацию. Вполне полезная тема, давайте приступим.

Прежде всего надо упомянуть то, что для работы с файловой системой требуется объект FileSystemObject, в простонародье FSO. В примерах показано его создание.

(далее…)

Сегодня я хотел бы познакомить вас с интересной статьёй про строковые функции VBScript. Этот материал будет очень интересен и полезен, так как мы можем любую используемую информацию превратить в текст и произвести с ним нужные нам действия при помощи данных функций. Благодаря им мы можем создавать свой парсер (грабер) html кода веб страницы, текстовый редактор и многое другое. Ну что же, приступим.

(далее…)

Leave a comment