Czy istnieje Windows CMD równoważny z wykonaniem powłoki Unixa?

9

Czy w systemie Windows istnieje odpowiednik „exec” powłoki Unix Shell? Zasadniczo muszę unikać rozwidlania nowego procesu, aby zachować rury wejściowe / wyjściowe, a także identyfikator procesu.

Edytować:

Oto mój problem. Mam proces A, który uruchamia skrypt, a skrypt ten kończy się uruchomieniem procesu B. Potrzebuję A, aby uzyskać wszystkie dane wyjściowe B, a także móc zabić B, zabijając proces, który się pojawił (skrypt) .

W systemie Unix wykonywanie B za pomocą exectej funkcji działa.

Daniel C. Sobral
źródło
Nie ma odpowiednika, przynajmniej nie używa standardowych poleceń i programów systemu Windows.
John Gardeniers
Jeśli próbujesz uruchomić plik wykonywalny zamiast innego pliku wsadowego, nie ma (obsługiwanego / realistycznego) sposobu na zrobienie tego. Jednak potoki wejścia / wyjścia są zwykle dziedziczone przez aplikacje działające w pliku wsadowym. Jeśli potrafisz opisać, dlaczego chcesz to zrobić, możemy zaproponować alternatywy.
Harry Johnston,
Proces A powinien już otrzymać wszystkie dane wyjściowe B, chyba że skrypt to nadpisze. Czy to nie działa?
Harry Johnston,
Możliwe jest użycie interfejsu API Win32, aby zorganizować proces potomny, który umrze, gdy proces macierzysty to zrobi, jednak nie ma wbudowanej opcji wiersza polecenia AFAIK. Jeśli podam jakiś kod źródłowy (dla Visual C ++), czy jesteś w stanie go zbudować?
Harry Johnston,
@Harry, rozwidlam skrypt z Javy, więc jeśli chodzi o to, aby proces A używał tego API Win32, obawiam się, że to raczej nie zadziała, chociaż jestem wdzięczny za wysiłek. Lepiej wytłumaczenie, że to niemożliwe, i przyjmuję to jako odpowiedź.
Daniel C. Sobral,

Odpowiedzi:

7

AFAIK nie ma. Windowsowi brakuje tego, execv()co robi bash exec. calldziała w przypadku wywoływania plików wsadowych (łatwe, wystarczy zinterpretować plik w bieżącym interpretera, podobnie jak .polecenie bash ), ale nie w exe.

Uniemożliwia to pisanie skryptów opakowujących jeden wiersz dla skryptów w dowolnym języku w systemie Windows. Zawsze otrzymasz komunikat „Zakończyć zadanie wsadowe?” bzdury na Ctrl + C, a zabicie procesu wsadowego (nie przy pomocy Ctrl + C, jak mówi menedżer zadań) nie zabije procesu potomnego. Teraz szukam pliku szablonu C do tego zawijania.

AKTUALIZACJA: Windows ma _execv()w swojej warstwie zgodności z POSIX w MSVCRT, ale AFAIK (nie testowałem tego) to tylko opakowanie, CreateProcesswięc zawsze będzie tworzyć nowy proces, nie może zastąpić bieżącego procesu.

capr
źródło
2

Myślę, że połączenie działa tak, jak chcesz, ale nie jestem w 100% pewien.

Paweł Brodacki
źródło
4
Jeśli chcesz uruchomić jeden plik wsadowy z innego, bez uruchamiania nowej instancji programu cmd.exe, wywołanie jest właściwą odpowiedzią.
Harry Johnston,
1

Można zbudować dynamiczne polecenie wsadowe i wykonać je na podstawie wyników poprzednich operacji. Nie jestem pewien, czy byłoby to rozwiązanie w twoim przypadku, ale poniższy kod działa dobrze.

SET yourDynamicCommand=SET var=1
%yourDynamicCommand%
ECHO var's value is %var%
Abdo
źródło
to nie robi nic takiego jak exec...
Jakuje
-1
  • Wykonaj pliki wsadowe :call
  • Wykonaj pliki exe : polecenie nie jest potrzebne, wywołaj je bezpośrednio przez/path/to/exe/something.exe
leonheess
źródło