为什么StandardOut的读取在这里失败?

时间:2009-05-26 09:56:37

标签: .net vb.net

我目前正试图在审核后写一个小包装来自动发布,但是当涉及到Dim results As String = sOut.ReadToEnd()并且我可以时,这个功能失败了;为了这个原因,

编辑:它不会产生错误,它似乎只是进入ReadToEnd()永远不会返回

我只是错过了一些明显的东西吗?

Function postReview() As String
            Dim psi As ProcessStartInfo = New System.Diagnostics.ProcessStartInfo("cmd.exe")
            psi.UseShellExecute = False
            psi.RedirectStandardOutput = True
            psi.RedirectStandardInput = True
            psi.RedirectStandardError = True
            Dim proc As Process = System.Diagnostics.Process.Start(psi)
            Dim strm As StreamReader = proc.StandardError
            Dim sOut As StreamReader = proc.StandardOutput
            Dim sIn As StreamWriter = proc.StandardInput
            MsgBox()
            sIn.WriteLine("cd " & IO.Directory.GetCurrentDirectory)

            sIn.WriteLine(Me.ToString)
            sIn.WriteLine("post-review.py -d --username=User --password=Pass")
            Dim results As String = sOut.ReadToEnd()

            sIn.WriteLine("exit")
            sIn.Close()
            sOut.Close()


            Return results

        End Function

进一步信息:实际的命令正在运行,因为我可以看到它发布到评论委员会。但它似乎在等待Stream完成时陷入循环。

我尝试使用Read和Readline而没有运气

3 个答案:

答案 0 :(得分:1)

我认为可能是这一行造成了麻烦:

psi.UseShellExecute = True

来自the documentation

  

要使用StandardOutput,您必须设置   ProcessStartInfo.UseShellExecute   为假,你必须设置   ProcessStartInfo.RedirectStandardOutput   真的

答案 1 :(得分:1)

交换:

Dim results As String = sOut.ReadToEnd()
sIn.WriteLine("exit")
sIn.Close()
sOut.Close()

sIn.WriteLine("exit")
Dim results As String = sOut.ReadToEnd()
psi.WaitForExit()

我猜测输出流没有“结束”,因为你还没有退出。但是,退出后输出仍然可用 而且你不需要关闭流,但你可能要等到进程退出(最后一行代码)

答案 2 :(得分:0)

尝试使用Read或ReadLine。