代码之家  ›  专栏  ›  技术社区  ›  Dean

为什么标准输出的读取在这里失败?

  •  0
  • Dean  · 技术社区  · 17 年前

    我目前正尝试在post review周围编写一个小包装器来自动发布,但是这个函数在涉及到 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
    

    进一步的信息:实际的命令正在工作,因为我可以看到它张贴到审查委员会。但在等待流完成时,它似乎陷入了一个循环中。

    我试过阅读和阅读,但没有运气。

    3 回复  |  直到 17 年前
        1
  •  1
  •   tanascius    17 年前

    交换:

    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
  •  1
  •   Fredrik Mörk    17 年前

    我想这句话可能会给你带来麻烦:

    psi.UseShellExecute = True
    

    the documentation :

    要使用StandardOutput,必须设置 处理开始信息.useShellExecute 如果设置为“假”,则必须设置 处理开始信息。重定向标准输出 成真

        3
  •  0
  •   leppie    17 年前

    尝试读或读。