.NET控制台StandardOutput不返回输入“问题”

时间:2011-06-28 15:37:01

标签: vb.net console redirectstandardoutput

我试图完全拦截控制台应用程序,即抓取它的输出,并插入输入。

到目前为止,我几乎可以抓住输出,输入完全是完美的。 但是,在您发送一些输入之前,它不会显示控制台输出的“前缀”/“问题”。

例如,挂钩到CMD.exe控制台时。当你经常在Windows中启动它时,你会得到这样的结果:

  

Microsoft Windows [Version 6.1.7600]
  版权所有(c)2009 Microsoft Corporation。保留所有权利。

     

C:\ Users \用户用户名>

但是,输出仅返回:

  

Microsoft Windows [Version 6.1.7600]
  版权所有(c)2009 Microsoft Corporation。保留所有权利。

然后当您插入类似“D:”(转到D:\ disk)的内容时,您会得到以下内容:

  

C:\ Users \用户用户名> d:

就是这样。不会给你“D:\>”或者,重新开始循环。

这是我目前的代码,然而,我99%肯定它没有任何问题。除此之外它完美无缺。

Class MainWindow

Private MainDispatcher As System.Windows.Threading.Dispatcher = System.Windows.Threading.Dispatcher.CurrentDispatcher

Private Sub MainWindow_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Me.Loaded
    StartProcess("cmd.exe")
End Sub

Private Sub InputTB_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Input.KeyEventArgs) Handles InputTB.KeyUp
    If e.Key = System.Windows.Input.Key.Enter Then
        InputStream.WriteLine(InputTB.Text)
        InputTB.Text = ""
    End If
End Sub

Private InputStream As IO.StreamWriter
Private OutputStream As IO.StreamReader
Public ProcessToMonitor As New Process
Private Sub StartProcess(ByVal FileName As String)

    ProcessToMonitor = New Process
    ProcessToMonitor.StartInfo.FileName = FileName
    ProcessToMonitor.StartInfo.UseShellExecute = False
    ProcessToMonitor.StartInfo.RedirectStandardError = True
    ProcessToMonitor.StartInfo.RedirectStandardOutput = True
    ProcessToMonitor.StartInfo.RedirectStandardInput = True
    ProcessToMonitor.StartInfo.ErrorDialog = False
    ProcessToMonitor.StartInfo.CreateNoWindow = True

    ProcessToMonitor.Start()

    InputStream = ProcessToMonitor.StandardInput
    OutputStream = ProcessToMonitor.StandardOutput

    ConstantReadThread.Priority = System.Threading.ThreadPriority.Lowest
    ConstantReadThread.Start()
End Sub

Private Sub OutputReceived(ByVal sender As Object, ByVal e As System.Diagnostics.DataReceivedEventArgs)
    MainDispatcher.Invoke(New WriteOutputDelegate(AddressOf WriteOutput), e.Data)
End Sub

Private ConstantReadThread As New System.Threading.Thread(AddressOf ConstantRead)
Private Sub ConstantRead()
    Do
        MainDispatcher.Invoke(New WriteOutputDelegate(AddressOf WriteOutput), OutputStream.ReadLine())
    Loop
End Sub

Private Delegate Sub WriteOutputDelegate(ByVal Text As String)
Private Sub WriteOutput(ByVal Text As String)
    OutputTB.Text &= Text & vbNewLine
    OutputTB.ScrollToEnd()
End Sub

结束班

我也知道“OutputDataReceived”,这是我最初使用的,它有同样的问题,这就是我进入读循环的原因,我知道它消耗的CPU更多。

和往常一样,任何帮助都非常感激。

-René

P.S。 C#.Net中的解决方案/建议也被接受了。

1 个答案:

答案 0 :(得分:1)

您无法获得所需的额外数据,因为这是通过“CMD”作为应用程序本身生成的。我相信您尝试接收的功能甚至不会输出到输出流。

这可能是因为Windows将此额外功能添加到它启动的每个控制台应用程序中,而不是应用程序实际作为输出流发送的内容。

我建议你做的是找出CMD开始的默认路径(看起来相当于):

System.Environment.GetFolderPath(Environment.SpecialFolder.Personal)

您可以使用它来模拟相同的功能。

如果您想知道CMD检查应用程序的位置等,请参阅系统上的环境变量,更具体地说是“PATH”环境变量。