Obtenir la sortie d'une chaîne Java à partir de VBA

Nov 25 2020

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

Joracosu Nov 26 2020 at 07:41

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 Runcommande 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 StdErrau lieu de StdOut. J'ai eu l'éclairage en lisant ce lien . L' WshExecobjet comporte trois éléments principaux: StdErr, StdInet StdOut. Si la chaîne de sortie java est traitée comme une erreur, elle doit être à la StdErrplace.

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