Kilka sposobów wywołania pliku wsadowego systemu Windows z innego lub z zachęty. Który w jakim przypadku?

92

Plik wsadowy systemu Windows ( called.batlub called.cmd) można wywołać z innego pliku wsadowego ( caller.batlub caller.cmd) lub interaktywnego polecenia cmd.exe na kilka sposobów:

  1. bezpośrednie połączenie: called.bat
  2. używając polecenia call: call called.bat
  3. używając polecenia cmd: cmd /c called.bat
  4. za pomocą polecenia start: start called.bat

Mam problem z rozróżnieniem ich przeznaczenia na podstawie tekstu pomocy: kiedy użyć którego? np. dlaczego mógłbym użyć polecenia „zadzwoń” zamiast bezpośredniego połączenia. Co za różnica?

Interesuje mnie jakiś raport podsumowujący, który analizuje wszystkie 4 możliwości (i inne, jeśli w ogóle ich brakuje) z różnych punktów widzenia: zalecane przypadki użycia, do których są przeznaczone, tworzenie procesów, kontekst wykonania, środowisko, przetwarzanie kodu zwrotnego.

Uwaga: używam dodatku SP3 dla systemu Windows XP.

ciemny
źródło

Odpowiedzi:

101
  1. Plik wsadowy zostanie wykonany przez bieżącą instancję cmd.exe (lub nową instancję cmd.exe, na przykład po dwukrotnym kliknięciu w Eksploratorze).

  2. Tak samo jak # 1, ma wpływ tylko wtedy, gdy jest używany wewnątrz pliku wsadowego / cmd. W pliku wsadowym, bez „wywołania”, nadrzędny plik wsadowy kończy się i sterowanie przechodzi do wywoływanego pliku wsadowego; z 'call' uruchamia podrzędny plik wsadowy, a nadrzędny plik wsadowy kontynuuje z instrukcjami następującymi po wywołaniu.

  3. Uruchamia plik wsadowy w nowej instancji cmd.exe.

  4. Start uruchomi plik wsadowy w nowej instancji cmd.exe w nowym oknie, a dzwoniący nie będzie czekał na zakończenie.

Kyle Alons
źródło
7
Uwaga dla opcji 4, po poleceniu start zawsze powinien znajdować się „tytuł” , więc jeśli nie potrzebujesz tytułu, powinieneś mieć puste podwójne cudzysłowy, np.start "" [options] command
Daryn
@Daryn ten link po prostu wspomina, że ​​zawsze powinieneś go mieć, ale nawet mówi, że Microsoft opisuje ten parametr jako opcjonalny. Nie mówią mi, dlaczego powinno to być „wymagane”. Nawet kilka ich przykładów na dole pomija parametr tytułu.
Adam Plocher,
5

Jedna rzecz nie jest jasna z komentarzy tutaj: kiedy wywołujesz jeden plik wsadowy z innego, używając tylko jego nazwy (przypadek nr 1 w pierwotnym pytaniu), wykonywanie zatrzymuje się z wywołującego pliku wsadowego. Na przykład w tych wierszach:

called.bat
echo Hello

Linia „echo Hello” (i wszystko po niej) nie zostanie wywołana. Jeśli użyjesz słowa kluczowego „call”, wykonanie zostanie wznowione po wywołaniu. Więc w tym przypadku:

call called.bat
echo Hello

Zostanie wywołana linia „echo Hello”.

Ponadto wszystkie zmienne ustawione w pliku nazwany.bat zostaną przekazane z powrotem do procesu wywołującego.

Wyobraź sobie plik „nazwany.bat”, który zawiera taki wiersz:

set MYVAR=hello

Wtedy% MYVAR% byłby dostępny dla wywołującego pliku wsadowego, gdyby użył:

call called.bat

Ale to nie będzie używane

REM starts a new cmd.exe process
start called.bat   

REM stops and replaces current cmd.exe process with a new one
called.bat        
rozpoznać
źródło