Polecenie CALL vs. START z opcją / WAIT

149

Jak działa komenda START z opcją WAIT

START /wait notepad.exe 
START /wait  notepad.exe 

... różni się od używania polecenia CALL?

CALL notepad.exe 
CALL notepad.exe 

Czy jest sytuacja, w której jeden może zachowywać się inaczej niż drugi w zależności od tego, co jest wykonywane?

Czad
źródło

Odpowiedzi:

183

Przypuszczam, że w przypadku plików exe różnice są prawie nieistotne.
Ale aby rozpocząć exe , nawet nie potrzebujesz CALL.

Przy uruchamianiu kolejnej partii jest to duża różnica,
ponieważ CALLuruchomi ją w tym samym oknie, a wywołana partia ma dostęp do tego samego kontekstu zmiennej.
Więc może również zmieniać zmienne, które mają wpływ na dzwoniącego.

STARTutworzy nowy cmd.exe dla wywołanego wsadu i bez / b otworzy nowe okno.
Ponieważ jest to nowy kontekst, zmiennych nie można udostępniać.

Różnice

Użyciestart /wait <prog>
- Zmiany zmiennych środowiskowych są tracone po <prog>zakończeniu
- Wzywający czeka na <prog>zakończenie

Użyciecall <prog>
- w przypadku exe może zostać pominięte, ponieważ jest równe tylko uruchomieniu <prog>
- w przypadku exe-prog partia wywołującego czeka lub uruchamia exe asynchronicznie, ale zachowanie zależy od samego exe .
- W przypadku plików wsadowych partia wywołującego jest kontynuowana, po <batch-file>zakończeniu wywołania BEZ wywołania sterowanie nie wróci do partii wywołującego

Uzupełnienie:

Za pomocą CALLmożna zmienić parametry (dla plików wsadowych i plików exe), ale tylko wtedy, gdy zawierają one znaki daszków lub procent.

call myProg param1 param^^2 "param^3" %%path%%

Zostanie rozwinięty do (z pliku wsadowego)

myProg param1 param2 param^^3 <content of path>
jeb
źródło
25
Podczas wykonywania pliku.bat za pomocą polecenia START / CZEKAJ należy określić START / CZEKAJ cmd / c "plik.bat" zamiast tylko START / CZEKAĆ "plik.bat", w przeciwnym razie okno cmd utworzone dla pliku.bat pozostanie otwarte
FrinkTheBrave
5
Porównanie CALL i START można znaleźć pod adresem: ss64.com/nt/start.html (zaktualizowane dzisiaj o sekcje „Start / Wait” i „START vs CALL”)
Alfredo Capobianchi
Moim ulubionym jest to, start /wait /b cmd /c <batchfile.bat>że pliki wsadowe są uruchamiane jeden po drugim w tym samym oknie poleceń
linux64kb
@ linux64kb, Ale dla plików wsadowych nie jest to konieczne, potrzebujesz tylkocall batchfile.bat
jeb
@jeb True. Wolę ten, ponieważ każdy plik wsadowy będzie działał w innym środowisku powłoki poleceń, dziedzicząc zmienne z wywołującej powłoki, a zmiany w wartościach początkowych zostaną utracone po zakończeniu partii -> nie pozostaną tam żadne śmieci po każdym kolejnym uruchomieniu. Kolejną zaletą jest to, że nie musisz zajmować się resetowaniem zmiennych w swoich skryptach.
linux64kb
17

Myślę, że powinny one generalnie działać tak samo, ale są pewne różnice. STARTjest zwykle używany do uruchamiania aplikacji lub uruchamiania aplikacji domyślnej dla danego typu pliku. W ten sposób, jeśli START http://mywebsite.comtak nie jest START iexplore.exe http://mywebsite.com.

START myworddoc.docxuruchomi Microsoft Word i otworzy myworddoc.docx. CALL myworddoc.docxrobi to samo ... jednak STARTzapewnia więcej opcji dla stanu okna i tego typu rzeczy. Umożliwia również ustawienie priorytetu i powinowactwa procesu.

Krótko mówiąc, biorąc pod uwagę dodatkowe opcje oferowane przez start, powinno to być Twoje narzędzie z wyboru.

START ["title"] [/D path] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED]
  [/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL]
  [/NODE <NUMA node>] [/AFFINITY <hex affinity mask>] [/WAIT] [/B]
  [command/program] [parameters]

"title"     Title to display in window title bar.
path        Starting directory.
B           Start application without creating a new window. The
            application has ^C handling ignored. Unless the application
            enables ^C processing, ^Break is the only way to interrupt
            the application.
I           The new environment will be the original environment passed
            to the cmd.exe and not the current environment.
MIN         Start window minimized.
MAX         Start window maximized.
SEPARATE    Start 16-bit Windows program in separate memory space.
SHARED      Start 16-bit Windows program in shared memory space.
LOW         Start application in the IDLE priority class.
NORMAL      Start application in the NORMAL priority class.
HIGH        Start application in the HIGH priority class.
REALTIME    Start application in the REALTIME priority class.
ABOVENORMAL Start application in the ABOVENORMAL priority class.
BELOWNORMAL Start application in the BELOWNORMAL priority class.
NODE        Specifies the preferred Non-Uniform Memory Architecture (NUMA)
            node as a decimal integer.
AFFINITY    Specifies the processor affinity mask as a hexadecimal number.
            The process is restricted to running on these processors.

            The affinity mask is interpreted differently when /AFFINITY and
            /NODE are combined.  Specify the affinity mask as if the NUMA
            node's processor mask is right shifted to begin at bit zero.
            The process is restricted to running on those processors in
            common between the specified affinity mask and the NUMA node.
            If no processors are in common, the process is restricted to
            running on the specified NUMA node.
WAIT        Start application and wait for it to terminate.
mckeejm
źródło
8

Oto, co znalazłem podczas równoległego uruchamiania plików wsadowych (wiele wystąpień tego samego pliku bat w tym samym czasie z różnymi parametrami wejściowymi):

Powiedzmy, że masz plik exe, który wykonuje długie zadanie o nazwie LongRunningTask.exe

Jeśli wywołasz exe bezpośrednio z pliku bat, tylko pierwsze wywołanie LongRunningTask powiedzie się, podczas gdy reszta otrzyma błąd systemu operacyjnego „Plik jest już używany przez proces”

Jeśli używasz tego polecenia:

start / B / WAIT "" "LongRunningTask.exe" "parametry"

Będziesz mógł uruchomić wiele instancji nietoperza i exe, jednocześnie czekając na zakończenie zadania, zanim bat będzie kontynuował wykonywanie pozostałych poleceń. Opcja / B ma na celu uniknięcie tworzenia innego okna, puste cudzysłowy są potrzebne, aby polecenie działało, patrz odniesienie poniżej.

Zwróć uwagę, że jeśli nie użyjesz / WAIT na początku, LongRunningTask zostanie wykonane w tym samym czasie, co pozostałe polecenia w pliku wsadowym, więc może to spowodować problemy, jeśli jedno z tych poleceń wymaga danych wyjściowych LongRunningTask

Wznowienie:

To nie może przebiegać równolegle:

  • wywołaj LongRunningTask.exe

Będzie to działać równolegle i będzie w porządku, o ile nie ma zależności danych między danymi wyjściowymi polecenia a resztą pliku bat:

  • start / B "" "LongRunningTask.exe" "parametry"

Będzie to działać równolegle i czekać na zakończenie zadania, więc możesz użyć danych wyjściowych:

  • start / B / WAIT "" "LongRunningTask.exe" "parametry"

Odniesienie do polecenia start: Jak uruchomić program z pliku wsadowego bez pozostawiania otwartej konsoli po uruchomieniu programu?

Cherno
źródło
6

Połączenie

Wywołuje jeden program wsadowy z innego bez zatrzymywania nadrzędnego programu wsadowego. Polecenie call akceptuje etykiety jako cel wywołania. Wywołanie nie działa w wierszu poleceń, gdy jest używane poza skryptem lub plikiem wsadowym. https://technet.microsoft.com/en-us/library/bb490873.aspx

Początek

Uruchamia osobne okno wiersza polecenia, aby uruchomić określony program lub polecenie. Polecenie start użyte bez parametrów otwiera drugie okno wiersza polecenia. https://technet.microsoft.com/en-us/library/bb491005.aspx

Deweloper
źródło
-1

To stary wątek, ale właśnie spotkałem się z tą sytuacją i odkryłem zgrabny sposób jej obejścia. Próbowałem uruchomić plik setup.exe, ale fokus wracał do następnego wiersza skryptu bez czekania na zakończenie działania setup.exe. Wypróbowałem powyższe rozwiązania bez powodzenia.

W końcu przepuszczenie polecenia przez więcej załatwiło sprawę.

setup.exe {argumenty} | więcej

Steven Sheldon
źródło