Как получить возвращаемое значение VBScript для автоматизации где угодно?

Вот пример кода, над которым я пытаюсь работать, и он выдает код ошибки 1025. Я пытаюсь найти что-то, что может решить эту проблему, но мне не удается найти какую-либо полезную информацию.

Я просто хочу вернуть значение «num3» в автоматизацию где угодно. Я не уверен, что использую правильную командную строку для возврата значения (WScript.StdOut.Write). Если я использую неправильную команду, научите меня или укажите ссылку, по которой я могу изучить командную строку записи.

Dim num1, num2, num3 As Integer

Private Sub Form_Load()

num1 = 2
num2 = 5
num3 = num1 + num2


WScript.StdOut.Write(num3) ' Is this the right command ?

End Sub

Как получить возвращаемое значение VBScript для автоматизации где угодно?


person Luna    schedule 02.12.2019    source источник
comment
Это похоже на код VB6. В этом случае объект Wscriot будет недоступен, вам необходимо сначала создать экземпляр   -  person Étienne Laneville    schedule 02.12.2019
comment
Спасибо за ответ, да, это код VB6, так что WScript.StdOut.Write верен? Мне просто нужно создать экземпляр?   -  person Luna    schedule 02.12.2019
comment
Итак, вы хотите написать toe stdout, используя VB6? Вы пытаетесь сделать инструмент командной строки в vb6?   -  person Trevor    schedule 02.12.2019
comment
Что вы имеете в виду под автоматизацией?   -  person StayOnTarget    schedule 03.12.2019


Ответы (3)


Вам нужно добавить ссылку на библиотеку типов Windows Script Host Object Model в меню Project->References..., затем сохранить .vbp файлы проекта, открыть его в Блокноте и добавить следующие две строки в конце:

[VBCompiler]
LinkSwitches=/SUBSYSTEM:CONSOLE

Сохраните файл .vbp, повторно откройте проект в VB6 IDE и вставьте следующий код в Form1:

Option Explicit

Private StdOut                  As TextStream

Dim num1, num2, num3 As Integer

Private Sub Form_Load()
    With New FileSystemObject
        Set StdOut = .GetStandardStream(1)
    End With

    num1 = 2
    num2 = 5
    num3 = num1 + num2

    StdOut.WriteLine num3
End Sub

Скомпилируйте проект в Project1.exe и запустите его из командной строки, чтобы получить в консоли что-то вроде этого:

C:> Project1.exe
7

. . . а затем отображается Form1, поэтому приложение не будет немедленно завершено.

Попробуйте поместить свой код в Sub Main в стандартный .bas модуль без каких-либо форм для действительно консольного приложения VB6.

Вот zip проекта выше: StdOutTest.zip

person wqw    schedule 02.12.2019

Вопрос немного двусмысленный, но я постараюсь ответить на него как можно лучше.

Если вы хотите вывести число (код выхода)

Просто сделай это,

' https://social.msdn.microsoft.com/Forums/sqlserver/en-US/d6e76731-8e3b-465f-9d5a-12c6498d6b6c/how-to-return-exit-code-from-vb6-form?forum=winforms
Private Declare Sub ExitProcess Lib "kernel32" (ByVal uExitCode As Long)
' (then in some function)
ExitProcess 666666 ' whatever number to output to the other process

Если вы хотите выводить в StdOut (консоль)

Скриншот Nirsoft

Это немного сложнее. VB6 изначально не предназначен для работы таким образом. Однако есть малоизвестный обходной путь. Первоначально разработанный Nirsoft, которому удалось сделать невозможное, я модифицировал и немного оптимизировал ( по иронии судьбы, для использования CLI) их код, который теперь доступен в моем репо. Вот как это развернуть.

  1. Клонировать репо,
  2. Скопируйте CLI.bas в свой проект, затем добавьте CLI.bas в свой проект. Теперь вы можете использовать функции CLI. Например
CLI.setup ' required line, to set up variables
CLI.send "some text -> "
CLI.SetTextColour CLI.FOREGROUND_RED OR CLI.FOREGROUND_GREEN OR CLI.FOREGROUND_INTENSITY ' for Orange and Intensive text, need to use OR, not AND
CLI.sendln "Orange foobar!"
CLI.sendln "maybe another line, why not?"
  1. Теперь вы можете использовать эти функции, если ваш код. Обязательно сначала позвоните CLI.setup. Я бы рекомендовал в первый раз, просто проверьте функциональность в Form1_Load()
  2. Скомпилируйте исполняемый файл с помощью пакета VB6, но это еще не конец истории
  3. Ваше скомпилированное приложение должно быть исправлено для работы в режиме командной строки. Для этого CD в AMC_patcher-CLI папку, которую вы вызвали, и выполните

amc "C:/Projects/My supa CLI project/Project1.exe" 3

Где "C:/Projects/My supa CLI project/Project1.exe" - это путь к вашему приложению EXE

Или, в качестве альтернативы, для этапа исправления используйте оригинальную реализацию патчера графического интерфейса Nirsoft. Он менее масштабируемый, но такой же прочный

person tabdiukov    schedule 03.12.2019
comment
спасибо за ответ :) я попробую :) спасибо сэр - person Luna; 03.12.2019
comment
@ Луна Всем доброго друга! Если у вас есть вопросы, дайте мне знать! Наверное, когда-то я, наверное, слишком повеселился с этим :) - person tabdiukov; 03.12.2019
comment
Доблестные усилия, но недокументированный LinkSwitches=/SUBSYSTEM:CONSOLE сохраняет все исправления, изменяющие компиляцию поста заголовка PE, а поток от GetStandardStream на FileSystemObject сохраняет все кровавые детали API. - person wqw; 03.12.2019
comment
@ wqw Возможно. Я рад, что узнал о LinkSwitches=/SUBSYSTEM:CONSOLE Сегодня. Но разве подключение дополнительной библиотеки только для правильной компиляции не будет излишним и не сделает полученный EXE неоправданно мощным? - person tabdiukov; 03.12.2019
comment
@tabdiukov О какой дополнительной библиотеке идет речь? Хост сценариев Windows не статически связан с исполняемым файлом и является встроенным компонентом Windows, поэтому нет необходимости распространять его также. Кстати, можно настроить link.exe переключатели еще больше, чтобы еще больше уменьшить конечный исполняемый файл. - person wqw; 10.12.2019

В дополнение к приведенным ответам обратите внимание, что ...

Dim num1, num2, num3 As Integer

... на самом деле означает (кроме случаев, когда оператор Defxxx используется где-то в другом месте и опущен здесь)

Dim num1 As Variant
Dim num2 As Variant
Dim num3 As Integer

... что, вероятно, не то, что вы думаете.

person Hel O'Ween    schedule 02.12.2019