Dapatkan Output dari String Java Dari VBA

Nov 25 2020

Saya perlu mendapatkan string keluaran dari fungsi java ke dalam proyek VBA saya. Sebagai contoh cepat, saya mencoba untuk mendapatkan keluaran dari versi java terinstal tetapi dalam aplikasi nyata itu akan menjadi fungsi pribadi lainnya.

Percobaan pertama:

' 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

Usaha kedua:

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

Tak satu pun dari mereka berhasil untuk saya.

Saya ingin menghindari penggunaan file sementara seperti pada contoh percobaan kedua saya. Dalam penggunaan terakhir, saya akan memanggil fungsi ini ratusan ribu kali, dan saya memilih untuk tidak membuat file sebanyak itu atau mengedit file itu berkali-kali ...

Jawaban

Joracosu Nov 26 2020 at 07:41

Saya telah menemukan solusi untuk kedua upaya tersebut dan pada dasarnya itu adalah masalah yang sama: keluaran dari fungsi java yang ditampilkan pada shell perintah diperlakukan sebagai kesalahan, oleh karena itu ini bukan keluaran. Keraguan terpecahkan di sini

Dalam kasus pengiriman keluaran java ke sebuah file, itu diselesaikan dengan menggunakan 2>bukan >seperti yang dikatakan di sini . Bagaimanapun, ada banyak varian berbeda tergantung dari apa yang Anda butuhkan, seperti yang dilaporkan di tautan lain ini . Masalah kecil dari metode ini adalah pembuatan file keluaran membutuhkan waktu untuk diselesaikan, oleh karena itu variabel terakhir dari Runperintah harus diselesaikanTrue

Dan kodenya adalah sebagai berikut:

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

Dalam kasus mengambil langsung keluaran java ke variabel, itu diselesaikan dengan menggunakan StdErrbukan StdOut. Saya mendapat iluminasi membaca tautan ini . The WshExecobjek memiliki tiga elemen utama: StdErr, StdIndan StdOut. Jika string keluaran java diperlakukan sebagai kesalahan, itu seharusnya ada di dalam StdErr.

Dan kodenya adalah sebagai berikut:

' 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