Holen Sie sich die Ausgabe eines Java-Strings von VBA
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
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 Run
Befehls 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 StdErr
anstelle von gelöst StdOut
. Ich habe die Beleuchtung bekommen, die diesen Link liest . Das WshExec
Objekt hat drei Hauptelemente: StdErr
, StdIn
und StdOut
. Wenn die Java-Ausgabezeichenfolge als Fehler behandelt wird, sollte sie sich StdErr
stattdessen 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