VBAからJava文字列の出力を取得する

Nov 25 2020

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

2回目の試み:

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

それらのどれも私のために働いていませんでした。

2回目の試行例のように、一時ファイルの使用を避けたいと思います。最終的な使用法では、この関数を数十万回呼び出しますが、その量のファイルを作成したり、そのファイルを何度も編集したりすることは好みません...

回答

Joracosu Nov 26 2020 at 07:41

私は両方の試みの解決策を見つけましたが、基本的には同じ問題です。コマンドシェルに表示される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オブジェクトは、3つの主要な要素がありますStdErrStdInStdOut。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