Process.Start завершается с ошибкой при попытке перенаправить вывод

StackOverflow https://stackoverflow.com/questions/1752416

Вопрос

Я работал над автоматизацией наших процессов сборки и хотел найти безболезненный способ регулярного запуска модульных тестов.С этой целью я собрал простое приложение, которое проверяет файлы проекта и готовит список решений для тестирования.Прототип работает так, что тесты выполняются с ожидаемыми результатами, но как только я пытаюсь перенаправить вывод, приложение взрывается при вызове 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 () ...Йадда Йадда Йадда"

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

Это было полезно?

Решение

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

От MSDN:

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top