To trochę boleśnie, ponieważ nie mam kodu przed sobą, ale spróbuję wyjaśnić.Dlaczego funkcja C# ProcessStartInfoRedirectStandardOutput spowodowałaby niepowodzenie procesu xcopy
Mam prostą aplikację C#, która uruchamia skrypt Ruby (robi kilka innych rzeczy, więc generuje plik wsadowy i wykonuje to).
Używam obiektu procesu C# i ustawić następujące redirectstandardoutput = true redirectstandarderror = true UseShellExecute = false CreateNoWindow = true (piękny bitowej wstecznej logiki tam!)
I następnie utworzyć dwa wątki i odpytaj ReadLine() zarówno dla strumienia błędów, jak i wyjściowych, czekając na zakończenie obydwu, zanim zadzwonię do WaitForExit().
Teraz, bez względu na to, co robię, mój skrypt Ruby nie wywołuje polecenia systemowego ("xcopy ..."), gdy przekierowuję dane wyjściowe (nie generuje się błędów, to po prostu nie kopiuje). Nie kopiuje też innych plików, o które proszę go skopiować.
Dzieje się tak, gdy kieruję oba strumienie na wątek, jeden z nich, przekierowuję tylko jeden z nich i po prostu wywołuję ReadToEnd().
Działa tylko poprawnie, jeśli ustawię przekierowanie wyjścia na standard i przekierowuję wartość domyślną na false.
Mam tu całkowitą stratę. Myślałem, że może strumień wyjściowy jest wypełniony, ale nie mogę sobie wyobrazić, dlaczego dzwonię do ReadLine (potrzebuję czytanej linii, aby móc analizować każdą linię i prezentować tylko odpowiednie dla użytkownika końcowego). Sądziłem też, że wywoływanie poleceń DOS z wątku C# może powodować problemy.
Czy ktoś ma pojęcie, co może się tu dziać? Powinienem powiedzieć, że jestem na VS .net 2005, co moim zdaniem to .Net Framework 2.0.
To był problem. Po prostu ustawiłem processToRun.StartInfo.RedirectStandardInput = true, a xcopy działa idealnie. Zabawnie, gdy działałem, i tak zamierzałem przekierować dane wejściowe. –
Dzięki! Miałem ten sam problem z dużym skryptem wsadowym i próbowałem wszystkiego, dopóki tego nie znalazłem. – Botz3000