Holen Sie sich die Ausgabe eines Java-Strings von VBA

Nov 25 2020

Ich muss die Ausgabezeichenfolge einer Java-Funktion in mein VBA-Projekt übernehmen. Als schnelles Beispiel versuche ich, die Ausgabe der Java-Version zu installieren, aber in der realen Anwendung werden es andere private Funktionen sein.

Erster Versuch:

' 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

Zweiter Versuch:

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

Keiner von ihnen hat für mich gearbeitet.

Ich möchte die Verwendung temporärer Dateien wie in meinem zweiten Versuch vermeiden. Bei der endgültigen Verwendung werde ich diese Funktion hunderttausend Mal aufrufen, und ich ziehe es vor, diese Anzahl von Dateien nicht so oft zu erstellen oder zu bearbeiten ...

Antworten

Joracosu Nov 26 2020 at 07:41

Ich habe die Lösung für beide Versuche gefunden und im Grunde ist es das gleiche Problem: Die Ausgabe einer Java-Funktion, die in der Befehlsshell angezeigt wird, wird als Fehler behandelt, daher handelt es sich nicht um eine Ausgabe. Der Zweifel wurde hier gelöst

Wenn Sie die Java-Ausgabe an eine Datei senden, wird sie gelöst, 2>anstatt >wie hier angegeben . Wie in diesem anderen Link angegeben , gibt es je nach Bedarf viele verschiedene Varianten . Ein kleines Problem dieser Methode besteht darin, dass die Erstellung der Ausgabedatei einige Zeit in Anspruch nimmt. Daher muss die endgültige Variable des RunBefehls festgelegt werdenTrue

Und der Code lautet wie folgt:

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

Wenn die Java-Ausgabe direkt in eine Variable übernommen wird, wird sie mit StdErranstelle von gelöst StdOut. Ich habe die Beleuchtung bekommen, die diesen Link liest . Das WshExecObjekt hat drei Hauptelemente: StdErr, StdInund StdOut. Wenn die Java-Ausgabezeichenfolge als Fehler behandelt wird, sollte sie sich StdErrstattdessen im Inneren befinden .

Und der Code lautet wie folgt:

' 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