• Администрация SafeZone приветствует вас на нашем форуме!
    Если вы больше не желаете видеть рекламу при просмотре тем и сообщений - то достаточно просто зарегистрироваться. Для зарегистрированных пользователей реклама не отображается.

VBS Вызов функций из скрипта

Паразит

Пользователь
Сообщения
53
Симпатии
1
#1
Привет. Как мне вызывать функции из VBS скрипта?

Допустим, что в скрипте есть две функции. Если я запускаю этот скрипт, то срабатывают обе.
Но мне нужна конкретная функция. Как я могу к ней обратиться?

VB.NET:
Sub RunRegedit()
Set objShellApp = CreateObject("Shell.Application")
objShellApp.ShellExecute "regedit.exe", "/m", "", "open", 1
Set objShellApp = Nothing
End Sub


Sub RunRegedit()
Set objShellApp = CreateObject("Shell.Application")
objShellApp.ShellExecute "taskmgr.exe", "", "", "open", 1
Set objShellApp = Nothing
End Sub
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,601
Симпатии
5,465
#2
Допустим, что в скрипте есть две функции. Если я запускаю этот скрипт, то срабатывают обе.
Назвать по-разному.
Но мне нужна конкретная функция. Как я могу к ней обратиться?
Вызвать по имени.

И для точности, это процедура, а не функция.
 

Паразит

Пользователь
Сообщения
53
Симпатии
1
#3
Точно. Я забыл переименовать процедуру в RunTaskmgr.
Как должна выглядить командная строка, чтобы вызвать процедуру RunTaskmgr?
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,601
Симпатии
5,465
#4

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,601
Симпатии
5,465
#6
Тогда нужно делать внутри VBS отдельный обработчик аргументов командной строки, например:

Host.vbs
VB.NET:
Option Explicit

Dim objShellApp
Set objShellApp = CreateObject("Shell.Application")

If WScript.Arguments.Count <> 0 then
    Select Case WScript.Arguments(0)
    Case "/RunRegedit": RunRegedit
    Case "/RunTaskmgr": RunTaskmgr
    End Select
end if

Set objShellApp = Nothing

Sub RunRegedit()
    objShellApp.ShellExecute "regedit.exe", "/m", "", "open", 1
End Sub

Sub RunTaskmgr()
    objShellApp.ShellExecute "taskmgr.exe", "", "", "open", 1
End Sub
run.bat
CMD/BATCH:
@echo off

wscript.exe //nologo host.vbs /RunRegedit
wscript.exe //nologo host.vbs /RunTaskmgr

pause
 

Паразит

Пользователь
Сообщения
53
Симпатии
1
#7
Dragokas, получается, что невозможно запустить функцию без обработчика, который использует переданные аргументы?
Или есть такие способа?
 
Последнее редактирование:

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,601
Симпатии
5,465
#8
Я не понимаю, что ты делаешь и зачем. Можно с обработчиком, можно без.
Можешь написать в VBS:
VB.NET:
call RunRegedit
call RunTaskmgr
тогда при запуске VBS соответственно будут последовательно выполнены 2 процедуры RunRegedit, затем RunTaskmgr.
 

Паразит

Пользователь
Сообщения
53
Симпатии
1
#9
Dragokas, а возможно-ли вызвать функцию из командной строки, передав её в качестве аргумента?
При этом в скрипте не будет никаких обработчиков.
Что-то типа, MyScript.vbs "call RunTaskmgr"
 
Последнее редактирование:

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,601
Симпатии
5,465
#10
Через динамическое создание кода.
Это что какой-то новый вид обфускации?
 

Паразит

Пользователь
Сообщения
53
Симпатии
1
#11
Dragokas,
Возможно-ли в VBScript подключать внешние библиотеки функций, как в других языках программирования?
Типа, Include.

Вот для наглядности пара скриптов.

Это библиотека, которую хочу подключить (C:\111.vbs).

VB.NET:
Sub RunRegedit()
    objShellApp.ShellExecute "regedit.exe", "/m", "", "open", 1
End Sub
Sub RunTaskmgr()
    objShellApp.ShellExecute "taskmgr.exe", "", "", "open", 1
End Sub
Ну а второй (C:\222.vbs) должен вызывать некую функцию по имени из подключаемой библиотеки.

VB.NET:
Call RunTaskmgr("C:\111.vbs")
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,601
Симпатии
5,465
#14
лис.хвост,
у тебя код в развёрнутом виде:
VB.NET:
Sub Proc2
  msgbox("test")
End Sub
Разумеется, если его выполнить, то визуально ничего не произойдёт. Но включение сработает: если ты напишешь в конце Call Proc2. Будет вызвана Proc2(), подключённая через Execute.

Ну а eval и Execute - это совсем разные вещи.

1) Eval исполняет код в собственном локальном контексте и возвращает результат выполнения. При этом, все текущие переменные доступны Eval. Например:
VB.NET:
x = 1
msgbox eval("x = 1")
Это операция сравнения (а не присвоения). Вернёт true.

2) Execute и ExecuteGlobal - просто добавляют код к текущему и затем его исполняют. Код остаётся доступным и в дальнейшем.
Имеют равное значение, если исполняются в глобальном контексте.
Если исполнять внутри локальных блоков Sub / Function, будут различия, например:

VB.NET:
Option Explicit
Dim x
x = 1

testExecute
msgbox "x - после блока с Execute: " & x       'вернёт 1
testExecuteGlobal
msgbox "x - после блока с ExecuteGlobal: " & x 'вернёт 3

Sub testExecute()
  Dim x
  x = 2
  Execute ("x = 3")
  msgbox "x - внутри блока, после Execute: " & x 'вернёт 3
End Sub

Sub testExecuteGlobal()
  Dim x
  x = 2
  ExecuteGlobal ("x = 3")
  msgbox "x - внутри блока, после ExecuteGlobal: " & x 'вернёт 2
End Sub
т.е. ExecuteGlobal работает с переменными, аналогично как в C++, ::x
Ну и сам пример с тестом включений:
VB.NET:
Option Explicit

' добавляем включения
testExecute false 'Dec (локальное для testExecute)
testExecuteGlobal 'Inc (глобальное)

Dim x
x = 1

testExecute (true)
msgbox "x - после декремента через локальный блок: " & x

Inc x
msgbox "x - после инкремента: " & x

Dec x ' здесь будет ошибка Runtime, т.к. Dec доступно только внутри testExecute()

Sub testExecute(bDoDec)
  Execute ("Sub Dec(x): x = x -1: End Sub")

  if bDoDec then
    Dec x
  end if
End Sub

Sub testExecuteGlobal()
  ExecuteGlobal ("Sub Inc(x): x = x +1: End Sub")
End Sub
В этом примере testExecute false - по сути не несёт полезной нагрузки, т.к. включение уничтожается сразу же после выхода из блока testExecute.
Если вы укажите Execute под блоком if (not bDoDec), то получите ошибку runtim'a.
 
Последнее редактирование: