Obtenir la sortie d'une chaîne Java à partir de VBA
J'ai besoin d'obtenir la chaîne de sortie d'une fonction java dans mon projet VBA. À titre d'exemple rapide, j'essaie d'obtenir la sortie de la version java installée mais dans l'application réelle, ce sera d'autres fonctions privées.
Premier essai:
' 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
Deuxième essai:
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
Aucun d'eux n'a fonctionné pour moi.
Je voudrais éviter l'utilisation de fichiers temporaires comme dans mon exemple de deuxième tentative. Dans l'utilisation finale, j'appellerai cette fonction des centaines de milliers de fois, et je préfère ne pas créer autant de fichiers ou modifier ce fichier autant de fois ...
Réponses
J'ai trouvé la solution pour les deux tentatives et en gros c'est le même problème: la sortie d'une fonction java affichée sur le shell de commande est traitée comme une erreur, donc ce n'est pas une sortie. Le doute a été résolu ici
Dans le cas de l'envoi de la sortie java vers un fichier, il est résolu en utilisant 2>
au lieu de juste >
comme il est dit ici . Quoi qu'il en soit, il existe de nombreuses variantes en fonction de vos besoins, comme indiqué dans cet autre lien . Un problème mineur de cette méthode est que la création du fichier de sortie nécessite un certain temps, donc la variable finale de la Run
commande doit être réglée surTrue
Et le code est le suivant:
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
Dans le cas de la prise directe de la sortie java vers une variable, elle est résolue en utilisant StdErr
au lieu de StdOut
. J'ai eu l'éclairage en lisant ce lien . L' WshExec
objet comporte trois éléments principaux: StdErr
, StdIn
et StdOut
. Si la chaîne de sortie java est traitée comme une erreur, elle doit être à la StdErr
place.
Et le code est le suivant:
' 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