Получение вывода строки Java из VBA
Мне нужно получить строку вывода 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
Ни один из них у меня не работал.
Я бы хотел избежать использования временных файлов, как в моем примере второй попытки. В последнем случае я вызову эту функцию сотни тысяч раз, и я предпочитаю не создавать такое количество файлов и не редактировать этот файл столько раз ...
Ответы
Я нашел решение для обеих попыток, и в основном это та же проблема: вывод 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