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

두 번째 시도 :

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

그들 중 누구도 나를 위해 일하지 않았습니다.

두 번째 시도 예제에서와 같이 임시 파일의 사용을 피하고 싶습니다. 마지막 사용법에서는이 함수를 수십만 번 호출 할 것이며, 그 양의 파일을 만들거나 그 파일을 너무 많이 편집하지 않는 것을 선호합니다.

답변

Joracosu Nov 26 2020 at 07:41

두 시도 모두에 대한 해결책을 찾았으며 기본적으로 동일한 문제입니다. 명령 셸에 표시된 Java 함수의 출력은 오류로 처리되므로 출력이 아닙니다. 의심은 여기서 해결되었습니다

Java 출력을 파일로 보내는 경우 여기 에 언급 된대로 2>대신 사용하여 해결 됩니다 . 어쨌든 이 다른 링크에 보고 된대로 필요한 항목에 따라 다양한 변형 이 있습니다. 이 방법의 사소한 문제는 출력 파일 생성에 시간이 필요하므로 명령 의 최종 변수를 다음과 같이 설정 해야한다는 것입니다.>RunTrue

그리고 코드는 다음과 같습니다.

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목적은 세 가지 주요 요소가 있습니다 StdErr, StdIn하고 StdOut. 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