Process.Start не удается при попытке перенаправить вывод - PullRequest
0 голосов
/ 18 ноября 2009

Я работал над автоматизацией наших процессов сборки и хотел найти безболезненный способ регулярного запуска модульных тестов. Для этого я собрал простое приложение, которое проверяет файлы проекта и готовит список решений для тестирования. Прототип работает так, что тесты выполняются с ожидаемыми результатами, но как только я пытаюсь перенаправить вывод, приложение бомбит при вызове Process.Start, жалуясь на то, что файл не найден.

Я перепробовал несколько итераций того, что видел в других местах, включая несколько постов здесь, но мне еще предстоит заставить это работать должным образом.

Это работает:

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 () ... Ядда Ядда Ядда "

Буду признателен за любые предложения по решению этой проблемы с использованием этой модели.

1 Ответ

2 голосов
/ 18 ноября 2009

UseShellExecute вызывает поиск файла в разных местах.

С MSDN :

Свойство WorkingDirectory ведет себя иначе, когда UseShellExecute имеет значение true, чем когда UseShellExecute равно false Когда значение UseShellExecute равно true, свойство WorkingDirectory указывает расположение исполняемого файла. Если WorkingDirectory - пустая строка, то под текущим каталогом понимается исполняемый файл.

Когда UseShellExecute имеет значение false, свойство WorkingDirectory не используется для поиска исполняемого файла. Вместо этого он используется запущенным процессом и имеет значение только в контексте нового процесса.

...