Java Dizesinin Çıktısını VBA'dan Alın

Nov 25 2020

Bir java işlevinin çıktı dizesini VBA projeme almam gerekiyor. Hızlı bir örnek olarak, kurulu java sürümünün çıktısını almaya çalışıyorum ancak gerçek uygulamada diğer özel işlevler olacak.

İlk girişim:

' 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

İkinci deneme:

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

Hiçbiri benim için çalışmadı.

İkinci deneme örneğimdeki gibi geçici dosyaların kullanımından kaçınmak istiyorum. Son kullanımda bu işlevi yüz bin kez adlandıracağım ve bu kadar dosya oluşturmamayı veya bu dosyayı defalarca düzenlememeyi tercih ediyorum ...

Yanıtlar

Joracosu Nov 26 2020 at 07:41

Her iki girişim için de çözümü buldum ve temelde aynı sorun: komut kabuğunda görüntülenen bir java işlevinin çıktısı bir hata olarak değerlendirildi, bu nedenle bir çıktı değil. Şüphe burada çözüldü

Bir dosyaya java çıkışını gönderme durumunda, kullanmadan çözüldü 2>yerine sadece >bu söylenir olarak burada . Her neyse, bu diğer bağlantıda bildirildiği gibi, ihtiyacınız olan şeye bağlı olarak birçok farklı değişken var . Bu yöntemin küçük bir sorunu, çıktı dosyasının oluşturulmasının bir süreye ihtiyaç duymasıdır, bu nedenle Runkomutun son değişkeni şu şekilde ayarlanmalıdır:True

Ve kod aşağıdaki gibidir:

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

Doğrudan bir değişkene java çıktısının alınması durumunda, StdErryerine kullanılarak çözülür StdOut. Aydınlatmayı bu bağlantıyı okuyarak aldım . WshExecNesnenin üç ana bölümden meydana gelir: StdErr, StdInve StdOut. Java çıktı dizesi bir hata olarak değerlendirilirse, onun StdErryerine içinde olmalıdır .

Ve kod aşağıdaki gibidir:

' 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