VBA से जावा स्ट्रिंग का आउटपुट प्राप्त करें

Nov 25 2020

मुझे अपने VBA प्रोजेक्ट में जावा फ़ंक्शन के आउटपुट स्ट्रिंग को प्राप्त करने की आवश्यकता है। एक तेज उदाहरण के रूप में, मैं जावा संस्करण के आउटपुट को स्थापित करने की कोशिश कर रहा हूं, लेकिन वास्तविक एप्लिकेशन में यह अन्य निजी कार्य होंगे।

पहली कोशिश:

' 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

मैंने दोनों प्रयासों के लिए समाधान ढूंढ लिया है और मूल रूप से यह एक ही समस्या है: कमांड शेल पर प्रदर्शित जावा फ़ंक्शन के आउटपुट को एक त्रुटि के रूप में माना जाता है, इसलिए यह आउटपुट नहीं है। शंका यहां हल हो गई थी

एक फ़ाइल में जावा आउटपुट भेजने के मामले में, इसे यहाँ कहा गया है, के 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

एक चर में सीधे जावा आउटपुट लेने के मामले में, इसके StdErrबजाय इसका उपयोग करके हल किया जाता है StdOut। मुझे इस लिंक को पढ़कर रोशनी मिली । WshExecवस्तु के तीन मुख्य तत्व हैं: StdErr, StdInऔर StdOut। यदि जावा आउटपुट स्ट्रिंग को एक त्रुटि के रूप में माना जाता है, तो इसे 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