VB调用Java程序:如何查看执行结果并自动关闭CMD窗口
解决方案
问题分析
- 当前代码向CMD输入命令后立即关闭进程,导致Java程序未执行完毕就失去关联,无法看到完整执行过程,且CMD窗口不会自动退出。
- 未配置输出重定向,无法将Java程序的执行结果捕获并展示在VB窗体中。
修改后的代码
txbSendCommand.Text = "java -jar FACTEMICLI-2.5.16-33194-cmdClient.jar " & "-i " & TextBox1.Text & " -n " & stNIF & " -p " & stPassword & " -a " & iAno & " -m " & iMes & " -op " & stvalidar & stFicheiroEscolhido & " -o c:\saft\outputfile.xml" Dim stcaminhoexterno As String If stErrorMessage = False Then ' 构造CMD命令:/c 参数表示执行完命令后自动关闭CMD窗口 Dim cmdArgs As String = "/c """ & txbSendCommand.Text & """" Dim psi As New ProcessStartInfo("cmd.exe") With { .Arguments = cmdArgs, .UseShellExecute = False, .CreateNoWindow = False, ' 显示CMD窗口,用于查看执行过程 .RedirectStandardOutput = True, .RedirectStandardError = True, .StandardOutputEncoding = System.Text.Encoding.UTF8, .StandardErrorEncoding = System.Text.Encoding.UTF8 } Dim myProcess As Process = Process.Start(psi) ' 异步读取标准输出,更新VB窗体(需跨线程调用) AddHandler myProcess.OutputDataReceived, Sub(sender, e) If Not String.IsNullOrEmpty(e.Data) Then Me.Invoke(Sub() ' 假设窗体中有一个名为txbResult的多行TextBox用于展示结果 txbResult.AppendText(e.Data & Environment.NewLine) End Sub) End If End Sub ' 异步读取错误输出,更新VB窗体 AddHandler myProcess.ErrorDataReceived, Sub(sender, e) If Not String.IsNullOrEmpty(e.Data) Then Me.Invoke(Sub() txbResult.AppendText("错误:" & e.Data & Environment.NewLine) End Sub) End If End Sub myProcess.BeginOutputReadLine() myProcess.BeginErrorReadLine() ' 等待Java程序执行完毕 myProcess.WaitForExit() ' 释放进程资源 myProcess.Close() End If
关键修改说明
- 使用
cmd.exe /c "命令":/c参数让CMD执行完指定命令后自动关闭窗口,解决执行完毕不关闭的问题,同时CMD窗口会全程显示Java程序的执行过程。 - 重定向输出流:通过
RedirectStandardOutput和RedirectStandardError捕获Java程序的输出和错误信息,借助异步事件跨线程更新VB窗体的控件(需提前在窗体中添加一个名为txbResult的多行TextBox)。 - 调用
WaitForExit():确保等待Java程序完全执行完毕后再释放资源,保证能捕获到完整的输出内容。
额外注意事项
- 若Java程序输出使用特殊编码,需调整
StandardOutputEncoding和StandardErrorEncoding为对应编码(如GBK)。 - 确保用于展示结果的TextBox开启
Multiline属性并设置垂直滚动条,方便查看大量输出内容。
内容的提问来源于stack exchange,提问作者user20313373
相关产品推荐
相关产品推荐

