Próbowałem wykonać ponowne kodowanie wiersza polecenia systemu Windows w języku C #. Zastanawiałem się, skąd wiersz poleceń wie, kiedy czekać na rozpoczęcie procesu kończenia, a kiedy nie czekać na zakończenie wywoływanego procesu.
Na przykład, jeśli wpiszesz w wierszu polecenia „notatnik”, uruchomi się Notatnik , ale nadal możesz wykonywać inne polecenia. Jeśli jednak otworzysz narzędzie, takie jak more.com, ping.exe lub inne narzędzie, zaczeka na zakończenie działania programu, zanim pozwoli ci wykonać kolejne polecenie.
Skąd wiersz polecenia wie, kiedy czekać na zakończenie i jak można emulować to zachowanie w języku C #?
c#
windows
command-prompt
Justin Krejcha
źródło
źródło
Odpowiedzi:
Jeśli aplikacja jest aplikacją GUI Win32, zostanie po prostu uruchomiona, a wiersz polecenia nie będzie czekał na zamknięcie.
Jeśli aplikacja jest aplikacją konsolową, będzie działać w wierszu poleceń i będziesz musiał poczekać, aż zakończy się, aby odzyskać wiersz polecenia.
EDYTOWAĆ:
OK. Wygląda na to, że potrzebujesz wyjaśnienia technicznego. Jeśli chcesz emulować tę samą funkcję w swojej aplikacji, możesz sprawdzić tutaj
IMAGE_OPTIONAL_HEADER
pliki EXE .Wewnątrz
IMAGE_OPTIONAL_HEADER
znajduje się:If SubSystem == 0x02
oznacza to, że jest to aplikacja GUI.If SubSystem == 0x03
oznacza to, że jest to aplikacja wiersza poleceń.EDYCJA 2:
Jeśli chcesz zobaczyć to w akcji:
Pobierz http://www.ntcore.com/exsuite.php
Skopiuj plik calc.exe lub notepad.exe na pulpit
Otwórz skopiowany plik calc.exe w programie CFF Explorer
Przejdź do Nagłówki NT -> Nagłówki opcjonalne
Zmień podsystem z 0x002 na 0x003
Zapisz to
Teraz uruchom nowy zmodyfikowany kalkulator, a zobaczysz wiersz polecenia czekający na zakończenie.
źródło
Domyślnie w wierszu polecenia jest uruchamianie programu GUI w oddzielnym procesie / rozwidleniu. Możesz jednak uruchomić Notatnik (lub inny program GUI) w linii z wierszem poleceń / skryptem powłoki:
W ten sposób wiersz polecenia / skrypt powłoki jest kontynuowany tylko po zakończeniu procesu notepad.exe.
Mam nadzieję, że to pomoże, TW
źródło
Po uruchomieniu nowego procesu, aplikacji GUI w tym kontekście, która faktycznie działa poza granicami podpowiedzi, podpowiedź nie będzie czekać. Ale jeśli uruchomisz polecenie, które działa całkowicie w granicach bieżącego wystąpienia monitu, czeka.
Tak więc polecenie
notepad
po prostu uruchamia aplikację Notatnik i pozostawia kontrolę nad aplikacją. Podczas gdy polecenieipconfig
działa w domenie (nie, to nie jest domena aplikacji ), z monitu.Aby bardzo uogólnić, kiedy używasz
Process.Start
w swoim odpowiedniku C #, nie czekaj. I tak nie będzie.źródło