尝试重定向输出时Process.Start失败

时间:2009-11-17 22:44:56

标签: vb.net process.start redirectstandardoutput

我一直致力于自动化构建过程,并希望能够提供一种无痛的方法来定期运行单元测试。为此,我将一个简单的应用程序放在一起,该应用程序检查项目文件并准备要测试的解决方案列表。原型的工作原理是测试是以预期的结果执行的,但是一旦我尝试重定向我的输出,就会在Process.Start调用上弹出app炸弹,抱怨无法找到文件。

我已经尝试了几次迭代,看看我在其他地方看过的内容,包括这里的几篇帖子,但我还没有让它正常工作。

这有效:

Private Function WTF(ByVal aWorkingDirectory As String, ByVal aFileName As String, ByVal aArguments As String) As Boolean

    Dim lProcess As New Process()
    With lProcess
        .StartInfo.WorkingDirectory = aWorkingDirectory
        .StartInfo.FileName = aFileName
        .StartInfo.Arguments = aArguments
    End With
    lProcess.Start()
    lProcess.WaitForExit()

End Function

这不起作用:

Private Function WTF(ByVal aWorkingDirectory As String, ByVal aFileName As String, ByVal aArguments As String) As Boolean

    Dim lProcess As New Process()
    With lProcess
        .StartInfo.CreateNoWindow = True
        .StartInfo.UseShellExecute = False
        .StartInfo.RedirectStandardOutput = True
        .StartInfo.RedirectStandardError = True
        .StartInfo.WorkingDirectory = aWorkingDirectory
        .StartInfo.FileName = aFileName
        .StartInfo.Arguments = aArguments
    End With
    lProcess.EnableRaisingEvents = True 
    AddHandler lProcess.OutputDataReceived, AddressOf blah
    AddHandler lProcess.ErrorDataReceived, AddressOf blah
    lProcess.Start()
    lProcess.BeginOutputReadLine()
    lProcess.BeginErrorReadLine()
    lProcess.WaitForExit()

End Function

Private Shared Sub blah(ByVal sender As Object, ByVal e As System.Diagnostics.DataReceivedEventArgs)
    Console.WriteLine(e.Data)
End Sub

“System.ComponentModel.Win32Exception:系统找不到指定的文件    在System.Diagnostics.Process.StartWithCreateProcess(ProcessStartInfo startInfo)    在System.Diagnostics.Process.Start()... yadda yadda yadda“

任何使用此模型解决此问题的建议都将受到赞赏。

1 个答案:

答案 0 :(得分:2)

UseShellExecute导致在不同的地方查找文件。

来自MSDN

当UseShellExecute为true时,WorkingDirectory属性的行为与UseShellExecute为false时的行为不同。当UseShellExecute为true时,WorkingDirectory属性指定可执行文件的位置。如果WorkingDirectory是一个空字符串,则当前目录被理解为包含可执行文件。

当UseShellExecute为false时,不使用WorkingDirectory属性来查找可执行文件。相反,它由启动的进程使用,并且仅在新进程的上下文中具有意义。