سؤال

لقد كنت أعمل على أتمتة عمليات البناء الخاصة بنا وأردت التوصل إلى طريقة غير مؤلمة لإجراء اختبارات الوحدة بشكل منتظم. تحقيقًا لهذه الغاية ، ألقيت تطبيقًا بسيطًا يفحص ملفات المشروع ويستعد قائمة الحلول للاختبار. يعمل النموذج الأولي من حيث يتم تنفيذ الاختبارات مع النتائج المتوقعة ، ولكن بمجرد أن أحاول إعادة توجيه إخراج قنابل التطبيق على العملية. دعوة ، تشكو من أنه لا يمكن العثور على ملف.

لقد جربت العديد من التكرارات حول ما رأيته في مكان آخر ، بما في ذلك العديد من المنشورات هنا ، لكنني لم أحصل على هذا الأمر بشكل صحيح.

هذا يعمل:

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"

أي اقتراحات لحل هذا باستخدام هذا النموذج سيكون موضع تقدير.

هل كانت مفيدة؟

المحلول

يؤدي Useshellexecute إلى البحث في الملف في أماكن مختلفة.

من عند MSDN:

تتصرف خاصية WorkDirectory بشكل مختلف عندما تكون UseshellexEcute صحيحة مما هو الحال عندما تكون Useshellexecute خاطئة. عندما تكون Useshellexecute صحيحة ، تحدد خاصية WorkDirectory موقع القابل للتنفيذ. إذا كان WorkDirectory عبارة عن سلسلة فارغة ، فمن المفهوم أن الدليل الحالي يحتوي على القابل للتنفيذ.

عندما تكون Useshellexecute خاطئة ، لا يتم استخدام خاصية WorkDirectory للعثور على القابل للتنفيذ. بدلاً من ذلك ، يتم استخدامها من قبل العملية التي بدأت ولا معنى لها إلا في سياق العملية الجديدة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top