Java Dizesinin Çıktısını VBA'dan Alın
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
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