Process.Start échoue lors de la tentative de rediriger la sortie
-
20-09-2019 - |
Question
Je travaille sur l'automatisation de nos processus de construction et je voulais trouver un moyen indolore pour exécuter des tests unitaires sur une base régulière. À cette fin, je l'ai jeté ensemble une application simple qui examine les dossiers de projet et prépare une liste de solutions à tester. Le prototype fonctionne en ce que les tests sont exécutés avec les résultats attendus, mais dès que je tente de rediriger ma sortie les bombes app sur l'appel Process.Start, se plaignant qu'un fichier n'a pas pu être trouvé.
Je l'ai essayé plusieurs itérations sur ce que je l'ai vu faire ailleurs, y compris plusieurs postes ici, mais je dois encore que cela fonctionne correctement.
Cela fonctionne:
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
Cela ne fonctionne pas:
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: Le système ne peut pas trouver le fichier spécifié à System.Diagnostics.Process.StartWithCreateProcess (ProcessStartInfo startInfo) à System.Diagnostics.Process.Start () ... blah blah blah "
Toutes les suggestions pour résoudre ce en utilisant ce modèle serait apprécié.
La solution
UseShellExecute, le fichier à rechercher dans des endroits différents.
De MSDN :
La propriété WorkingDirectory se comporte différemment lorsque UseShellExecute est vrai que quand UseShellExecute est faux. Lorsque UseShellExecute est vrai, la propriété WorkingDirectory indique l'emplacement de l'exécutable. Si WorkingDirectory est une chaîne vide, le répertoire courant est entendu pour contenir l'exécutable.
Quand UseShellExecute est faux, la propriété WorkingDirectory ne sert pas à trouver l'exécutable. Au lieu de cela, il est utilisé par le processus qui a commencé et n'a de sens que dans le cadre du nouveau processus.