You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VB调用Java程序:如何查看执行结果并自动关闭CMD窗口

解决方案

问题分析

  1. 当前代码向CMD输入命令后立即关闭进程,导致Java程序未执行完毕就失去关联,无法看到完整执行过程,且CMD窗口不会自动退出。
  2. 未配置输出重定向,无法将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 01:42:50