Process.Start schlägt fehl, wenn versucht wird, die Ausgabe zu umleiten
-
20-09-2019 - |
Frage
Ich habe auf die Automatisierung unserer Build-Prozesse gearbeitet und wollte mit einem schmerzlos zu entwickeln, um Unit-Tests in regelmäßigen Abständen ausgeführt werden. Zu diesem Zweck habe ich zusammen eine einfache Anwendung geworfen, die die Projektdateien und bereitet eine Liste von Lösungen Test untersucht. Der Prototyp arbeitet, dass die Tests mit den erwarteten Ergebnissen ausgeführt werden, aber sobald ich versuche, meine Ausgabe der App Bomben auf dem Process.Start Anruf zu umleiten, beschweren, dass eine Datei nicht gefunden werden konnte.
Ich habe versucht, mehrere Iterationen auf, was ich an anderer Stelle getan gesehen, darunter mehrere Beiträge hier, aber ich habe noch diese richtig an die Arbeit zu machen.
Das funktioniert:
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
Das funktioniert nicht:
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: Das System kann die angegebene Datei nicht finden bei System.Diagnostics.Process.StartWithCreateProcess (Processstartinfo) bei System.Diagnostics.Process.Start () ... bla bla bla "
Alle Vorschläge zur Lösung dieser Verwendung dieses Modells würde geschätzt.
Lösung
UseShellExecute bewirkt, dass die Datei in verschiedenen Orten gesucht werden.
MSDN :
Die Working Eigenschaft verhält sich anders, wenn UseShellExecute gilt als wenn UseShellExecute falsch ist. Wenn UseShellExecute ist wahr, die Working Eigenschaft gibt den Speicherort der ausführbaren Datei. Wenn Working eine leere Zeichenfolge ist, wird das aktuelle Verzeichnis versteht die ausführbare Datei enthalten.
Wenn UseShellExecute falsch ist, wird die Working Eigenschaft nicht verwendet, um die ausführbare Datei zu finden. Stattdessen wird es durch das Verfahren verwendet, das gestartet wird, und hat nur Sinn im Rahmen des neuen Verfahrens.