从vba获取java字符串的输出

vatpfxk5  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(562)

我需要把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

他们都不为我工作。
我想避免使用临时文件,就像我第二次尝试的例子一样。在最后的用法中,我将调用这个函数数十万次,我不希望创建那么多的文件或编辑文件那么多次。。。

qzwqbdag

qzwqbdag1#

我已经找到了两种尝试的解决方案,基本上是相同的问题:命令shell上显示的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

相关问题