Nhận đầu ra của một chuỗi Java từ VBA
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
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, StdInvà StdOut. 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