Nhận đầu ra của một chuỗi Java từ VBA

Nov 25 2020

Tôi cần lấy chuỗi đầu ra của hàm java vào dự án VBA của mình. Ví dụ nhanh, tôi đang cố gắng lấy đầu ra của phiên bản java được cài đặt nhưng trong ứng dụng thực, nó sẽ là các chức năng riêng tư khác.

Lần thử đầu tiên:

' 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

Lần thử thứ hai:

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

Không ai trong số họ làm việc cho tôi.

Tôi muốn tránh việc sử dụng các tệp tạm thời như trong ví dụ thử thứ hai của tôi. Trong lần sử dụng cuối cùng, tôi sẽ gọi hàm này hàng trăm nghìn lần và tôi không muốn tạo số lượng tệp đó hoặc chỉnh sửa tệp đó nhiều lần ...

Trả lời

Joracosu Nov 26 2020 at 07:41

Tôi đã tìm thấy giải pháp cho cả hai lần thử và về cơ bản nó là cùng một vấn đề: đầu ra của hàm java hiển thị trên trình bao lệnh được coi là lỗi, do đó nó không phải là đầu ra. Sự nghi ngờ đã được giải quyết ở đây

Trong trường hợp gửi đầu ra java đến một tệp, nó được giải quyết bằng cách sử dụng 2>thay vì chỉ >như được nói ở đây . Dù sao, có rất nhiều biến thể khác nhau tùy thuộc vào những gì bạn cần, như được báo cáo trong liên kết khác này . Một vấn đề nhỏ của phương pháp này là việc tạo tệp đầu ra cần một thời gian để hoàn thành, do đó biến cuối cùng của Runlệnh phải được giải quyết thànhTrue

Và mã như sau:

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

Trong trường hợp lấy trực tiếp đầu ra java cho một biến, nó được giải quyết bằng cách sử dụng StdErrthay vì StdOut. Tôi nhận được ánh sáng khi đọc liên kết này . Các WshExecđối tượng có ba yếu tố chính: StdErr, StdInStdOut. Nếu chuỗi đầu ra java được coi là lỗi, nó sẽ nằm bên trong StdErr.

Và mã như sau:

' 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