Jak wykonać program wiersza polecenia z C # i odzyskać wyniki STD OUT? W szczególności chcę uruchomić DIFF na dwóch programowo wybranych plikach i zapisać wyniki w polu tekstowym.
c#
command-line
Skrzydło
źródło
źródło
Odpowiedzi:
Kod pochodzi z MSDN .
źródło
{YourProcessObject}.StartInfo.Arguments
ciąg.p.StandardError
strumienia. Kiedy strumień zapełni, wydaje się, że proces zostanie wstrzymany, dopóki dane są zużyte, więc muszę czytać zarównoStandardError
orazStandardOutput
w celu zagwarantowania, że to zadanie wykonuje poprawnie.Oto krótka próbka:
źródło
Przydał mi się jeszcze jeden parametr, którego używam do wyeliminowania okna procesu
pomaga to całkowicie ukryć czarne okno konsoli przed użytkownikiem, jeśli tego właśnie chcesz.
źródło
źródło
process.StartInfo.RedirectStandardError = true;
iif (process.ExitCode == 0)
która nie ma zaakceptowanej odpowiedzi.Akceptowana odpowiedź na tej stronie ma słabość, która jest kłopotliwa w rzadkich sytuacjach. Istnieją dwa uchwyty plików, do których programy piszą zgodnie z konwencją, stdout i stderr. Jeśli po prostu czytasz pojedynczy uchwyt pliku, taki jak odpowiedź Ray, a program, który uruchamiasz, zapisuje wystarczającą ilość danych wyjściowych do stderr, zapełni bufor wyjściowy i blok stderr. Wtedy twoje dwa procesy są zakleszczone. Rozmiar bufora może wynosić 4K. Jest to niezwykle rzadkie w programach krótkotrwałych, ale jeśli masz długo działający program, który wielokrotnie wysyła do stderr, w końcu się to stanie. Debugowanie i śledzenie jest trudne.
Istnieje kilka dobrych sposobów, aby sobie z tym poradzić.
Jednym ze sposobów jest uruchomienie cmd.exe zamiast programu i użycie argumentu / c do cmd.exe, aby wywołać program wraz z argumentem „2> i 1” do cmd.exe, aby nakazać mu połączenie stdout i stderr.
Innym sposobem jest użycie modelu programowania, który odczytuje oba uchwyty jednocześnie.
źródło
źródło
Będziesz musiał używać
ProcessStartInfo
zRedirectStandardOutput
włączoną - wtedy możesz odczytać strumień wyjściowy. Możesz łatwiej użyć „>”, aby przekierować dane wyjściowe do pliku (przez system operacyjny), a następnie po prostu odczytać plik.[edytuj: jak to zrobił Ray: +1]
źródło
RedirectStandardOutput
.Jeśli nie masz nic przeciwko wprowadzeniu zależności, CliWrap może uprościć to dla Ciebie:
źródło
To może nie być najlepszy / najłatwiejszy sposób, ale może być opcją:
Po uruchomieniu z kodu dodaj „> output.txt”, a następnie wczytaj plik output.txt.
źródło
Możesz uruchomić dowolny program wiersza poleceń za pomocą klasy Process i ustawić właściwość StandardOutput instancji Process za pomocą utworzonego czytnika strumieniowego (na podstawie ciągu znaków lub lokalizacji pamięci). Po zakończeniu procesu możesz wykonać dowolną różnicę w tym strumieniu.
źródło
Może to być przydatne dla kogoś, kto próbuje wysłać zapytanie do lokalnej pamięci podręcznej ARP na komputerze / serwerze.
źródło
Polecenie uruchamiania w jednym wierszu:
Odczytaj wynik polecenia w najkrótszej ilości kodu reable:
źródło
W otwartym kodzie publicznym PublicDomain znajduje się klasa ProcessHelper, która może Cię zainteresować.
źródło
Jeśli musisz także wykonać jakieś polecenie w cmd.exe, możesz wykonać następujące czynności:
Zwraca tylko wynik samego polecenia:
Możesz również użyć
StandardInput
zamiastStartInfo.Arguments
:Wynik wygląda następująco:
źródło
Dla zabawy, oto moje kompletne rozwiązanie umożliwiające uzyskanie danych wyjściowych PYTHON - pod jednym kliknięciem przycisku - z raportowaniem błędów. Wystarczy dodać przycisk o nazwie „butPython” i etykietę „llHello” ...
źródło
Ponieważ większość odpowiedzi tutaj nie implementuje
using
statemantIDisposable
i kilka innych rzeczy, które moim zdaniem mogą być niepotrzebne, dodam tę odpowiedź.Dla C # 8.0
źródło