Получение вывода строки Java из VBA

Nov 25 2020

Мне нужно получить строку вывода java-функции в моем проекте VBA. В качестве быстрого примера я пытаюсь получить вывод установленной версии java, но в реальном приложении это будут другие частные функции.

Первая попытка:

' Needs a reference to Windows Script Host Object Model
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Sub get_java_output()
    Dim cmd_windows    As New WshShell
    Dim execution_cmd  As WshExec
    Dim command_str    As String
    command_str = "java -version"
    Set execution_cmd = cmd_windows.exec("cmd.exe /c " & command_str)
    Do While execution_cmd.Status = WshRunning
        Sleep 20
    Loop
    final_string = execution_cmd.StdOut.ReadAll
    Debug.Print final_string
End Sub

Вторая попытка:

Sub get_java_output_2()
    Dim windows_shell As Object
    
    Set windows_shell = CreateObject("WScript.Shell")
    command_str = "java -version"
    shell_output = windows_shell.Run("cmd /c " & command_str & " > c:\temp\output.txt", 0, False)
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set File = fso.OpenTextFile("c:\temp\output.txt", 1)
    final_string = File.ReadAll
    File.Close
    Debug.Print final_string
End Sub

Ни один из них у меня не работал.

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

Ответы

Joracosu Nov 26 2020 at 07:41

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

В случае отправки вывода java в файл, это решается с использованием 2>вместо того, >как здесь сказано . В любом случае, есть много разных вариантов в зависимости от того, что вам нужно, как указано в этой другой ссылке . Незначительная проблема этого метода заключается в том, что для создания выходного файла требуется время, поэтому последняя переменная Runкоманды должна быть установлена ​​наTrue

А код такой:

Sub get_java_output_2()
    Dim windows_shell As Object
    
    Set windows_shell = CreateObject("WScript.Shell")
    command_str = "java -version"
    shell_output = windows_shell.Run("cmd /c " & command_str & " 2> c:\temp\output.txt", 0, True)
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set File = fso.OpenTextFile("c:\temp\output.txt", 1)
    final_string = File.ReadAll
    File.Close
    Debug.Print final_string
End Sub

В случае прямого преобразования java-вывода в переменную, это решается с использованием StdErrвместо StdOut. Получил подсветку читая по этой ссылке . WshExecОбъект имеет три основных элемента: StdErr, StdInи StdOut. Если строка вывода java рассматривается как ошибка, она должна быть внутри StdErr.

А код такой:

' Needs a reference to Windows Script Host Object Model
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Sub get_java_output()
    Dim cmd_windows    As New WshShell
    Dim execution_cmd  As WshExec
    Dim command_str    As String
    command_str = "java -version"
    Set execution_cmd = cmd_windows.exec(command_str)
    Do While execution_cmd.Status = WshRunning
        Sleep 20
    Loop
    final_string = execution_cmd.StdErr.ReadAll
    Debug.Print final_string
End Sub