Приколы системных администраторов. 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
Данная программа будет просто необходима, если нам потребуется скрыть от людских глаз содержимое нашего сценария VBScript, над которым мы потели несколько суток, либо он малость вредоносный. Да и солидней как то.
(далее…)
Приветствую всех читателей моего блога. В этой статье я размещу исходник своего парсера почты Mail.Ru Групп (Мой Мир) на VBScript и немного объясню его действие. Данный скрипт помогает вам собрать огромные базы существующих E-Mail’ов от Mail.Ru для брута, спама и любых других действий. Вам не придётся действовать наугад или искать паблик базы.
Материал устарел. мэйл.ру поставили защиту.
(далее…)
Объект WScript является главным в Windows Script Host и позволяет подключать остальные его компоненты. Данный объект не нужно создавать или куда то прописывать, он создаётся автоматически, сервером сценариев (CScript.exe или WScript.exe). Благодаря этому объекту мы можем получать информацию о запущенном сценарии и о самом WSH. Так же мы можем устанавливать время работы нашего сценария. Будет интересно.
(далее…)
Настало время познакомить вас с объектом RegExp языка VBScript
(далее…)
Что то я совсем убежал вперёд и не рассказал вам про две функции диалоговых окон: MsgBox и InputBox. В этом очень небольшом уроке я и расскажу про все приблуды к этим двум функциям. Так же существуют и другие способы создания диалоговых окон, но для этого потребуются
(далее…)
Приветствую читателей своего блога по VBS программированию. Сегодня я расскажу про небольшой объект Dictionary. В использование встречается несправедливо редко. Он является объектом-коллекцией или словарём, как его называют иногда, по переводу названия. Данный объект напоминает массив VBS, но с более расширенными возможностями: задействовать в качестве номера элемента строковое значение, удаление элемента данных в середине коллекции без образования пробела, отсутствие нужды в использование ReDim и так далее. Так же в конце статьи вас ждёт пример-игра от меня.
(далее…)
Наконец настало время заключительного урока по объекту FSO. В этой статье я расскажу про все свойства и методы позволяющие, так или иначе работать с дисками. Одно из свойств может позволить нам выполнять сценарий VBScript только на определённом компьютере (по типу лицензии). Если Вас это заинтересовало, то буду рад поделиться имеющимися у меня знаниями.
(далее…)
В данной статье я расскажу про работу с файлами средствами VBS при помощи объекта FSO и File
(далее…)
В этой статье я расскажу про работу с папками при помощи объекта FSO, а так же объекта Folder. Данные объекты Windows Script Host позволяют нам создавать, удалять, проверять наличие папки, копировать или перемещать папки по шаблону, не используя циклов. Всё это будет подкреплено примерами VBScript
(далее…)
Урок VBScript №1: Знакомство с языком VBScript
Приветствую тебя, читатель моего блога. Я начинаю свою серию уроков по программированию VBScript этой ознакомительной статьёй. Вам предстоит узнать основы основ данного языка программирования.
VBScript — Это скриптовый язык программирования. Как и любой другой скриптовый язык VBScript урезан в своих возможностях. Но то, что он урезан ещё не говорит что он не интересен.
Вступление
В этом уроке мы узнаем:
- Основные особенности VBScript.
- Что такое переменные и с чем их едят.
- Простейшая функция MsgBox.
Язык VBScript на мой взгляд простой и понятный даже для ничего незнающего школьника.
Так же надо знать ещё две вещи о 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 кода веб страницы, текстовый редактор и многое другое. Ну что же, приступим.
(далее…)