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

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

Тема в разделе "Visual Basic 6 / Сценарии VBScript, JScript", создана пользователем Паразит, 18 янв 2017.

  1. Паразит
    Оффлайн

    Паразит Новый пользователь

    Сообщения:
    52
    Симпатии:
    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
     
  2. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    5.076
    Симпатии:
    4.946
    Назвать по-разному.
    Вызвать по имени.

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

    Паразит Новый пользователь

    Сообщения:
    52
    Симпатии:
    1
    Точно. Я забыл переименовать процедуру в RunTaskmgr.
    Как должна выглядить командная строка, чтобы вызвать процедуру RunTaskmgr?
     
  4. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    5.076
    Симпатии:
    4.946
    Вам вызывать нужно из-под командной строки? (через аргумент)
     
  5. Паразит
    Оффлайн

    Паразит Новый пользователь

    Сообщения:
    52
    Симпатии:
    1
    Да, меня интересует вызов из командной строки.
     
  6. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    5.076
    Симпатии:
    4.946
    Тогда нужно делать внутри 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
    Код (DOS):
    @echo off

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

    pause
     
    Паразит нравится это.
  7. Паразит
    Оффлайн

    Паразит Новый пользователь

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

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    5.076
    Симпатии:
    4.946
    Я не понимаю, что ты делаешь и зачем. Можно с обработчиком, можно без.
    Можешь написать в VBS:
    Код (vb.net):

    call RunRegedit
    call RunTaskmgr
     
    тогда при запуске VBS соответственно будут последовательно выполнены 2 процедуры RunRegedit, затем RunTaskmgr.
     
    Паразит нравится это.
  9. Паразит
    Оффлайн

    Паразит Новый пользователь

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

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    5.076
    Симпатии:
    4.946
    Через динамическое создание кода.
    Это что какой-то новый вид обфускации?
     
  11. Паразит
    Оффлайн

    Паразит Новый пользователь

    Сообщения:
    52
    Симпатии:
    1
    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")
     
  12. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    5.076
    Симпатии:
    4.946
  13. лис.хвост
    Оффлайн

    лис.хвост VIP Разработчик

    Сообщения:
    655
    Симпатии:
    1.017
    Код (vb.net):
    SS = "Sub Proc2" & vbCrLf
    SS = SS & "msgbox(""test"")" & vbCrLf
    SS = SS & "End Sub"
    Execute SS
    Execute у меня не отработал, а вот
    Код (vb.net):
    eval("msgbox(""test"")")
    не подвел.
     
  14. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    5.076
    Симпатии:
    4.946
    лис.хвост,
    у тебя код в развёрнутом виде:
    Код (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
    --- Объединённое сообщение, 6 мар 2017 ---
    Ну и сам пример с тестом включений:
    Код (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.
     
    Последнее редактирование: 6 мар 2017
    лис.хвост нравится это.

Поделиться этой страницей