CALL-Befehl vs. START mit / WAIT-Option

149

Wie ist der START-Befehl mit einer WAIT-Option

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

... etwas anderes als ein CALL-Befehl?

CALL notepad.exe 
CALL notepad.exe 

Gibt es eine Situation, in der sich einer anders verhält als der andere, abhängig davon, was ausgeführt wird?

Tschad
quelle
2
Werfen Sie einen Blick auf technet.microsoft.com/en-us/library/bb491005.aspx handelt von START und technet.microsoft.com/en-us/library/bb490873.aspx handelt von CALL
Developer

Antworten:

183

Für exe- Dateien sind die Unterschiede vermutlich nahezu unwichtig.
Aber um eine Exe zu starten , brauchst du nicht einmal CALL.

Wenn Sie einen anderen Stapel starten, ist dies ein großer Unterschied,
da CALLer im selben Fenster gestartet wird und der aufgerufene Stapel Zugriff auf denselben variablen Kontext hat.
So können auch Variablen geändert werden, die sich auf den Aufrufer auswirken.

STARTerstellt eine neue cmd.exe für den aufgerufenen Stapel und öffnet ohne / b ein neues Fenster.
Da es sich um einen neuen Kontext handelt, können Variablen nicht gemeinsam genutzt werden.

Unterschiede

Verwendenstart /wait <prog>
- Änderungen von Umgebungsvariablen gehen verloren, wenn das Ende <prog>endet.
- Der Anrufer wartet, bis das <prog>beendet ist

Verwenden voncall <prog>
- Für exe kann es weggelassen werden, da es gleichbedeutend mit dem Starten ist. <prog>
- Für ein Exe-Prog wartet oder startet der Aufrufer-Batch die Exe asynchron, aber das Verhalten hängt von der Exe selbst ab.
- Bei Batch- Dateien wird der Aufrufer-Stapel fortgesetzt. Wenn der Aufruf <batch-file>beendet ist, kehrt das Steuerelement OHNE Aufruf nicht zum Aufrufer-Stapel zurück

Nachtrag:

Mit CALLkann können die Parameter (für Batch- und Exe-Dateien) geändert werden, jedoch nur, wenn sie Carets oder Prozentzeichen enthalten.

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

Wird erweitert auf (aus einer Batch-Datei)

myProg param1 param2 param^^3 <content of path>
jeb
quelle
25
Wenn ein file.bat Ausführung mit START / WARTEN Sie angeben müssen START / WAIT cmd / c „file.bat“ anstatt nur START / WAIT „file.bat“, sonst das cmd Fenster für file.bat erstellt wird offen bleiben
FrinkTheBrave
5
Den Vergleich zwischen CALL und START finden Sie unter: ss64.com/nt/start.html (heute aktualisiert mit den Abschnitten "Start / Wait" und "START vs CALL")
Alfredo Capobianchi
Mein Favorit ist, start /wait /b cmd /c <batchfile.bat>weil die Batch-Dateien nacheinander im selben Befehlsfenster ausgeführt werden
linux64kb
@ linux64kb, aber für Batch-Dateien ist es nicht notwendig, Sie brauchen nurcall batchfile.bat
jeb
@ jeb True. Ich bevorzuge diese, da jede Batch-Datei in einer anderen Befehls-Shell-Umgebung ausgeführt wird, Variablen von der aufrufenden Shell erbt und Änderungen an den Anfangswerten nach Beendigung des Batches verloren gehen -> nach jedem aufeinanderfolgenden Lauf bleibt dort kein Müll übrig. Ein weiterer Vorteil ist, dass Sie sich nicht mit dem Zurücksetzen von Variablen in Ihren Skripten befassen müssen.
Linux64kb
17

Ich denke, dass sie im Allgemeinen die gleiche Leistung erbringen sollten, aber es gibt einige Unterschiede. STARTwird im Allgemeinen zum Starten von Anwendungen oder zum Starten der Standardanwendung für einen bestimmten Dateityp verwendet. Auf diese Weise, wenn Sie START http://mywebsite.comes nicht tun START iexplore.exe http://mywebsite.com.

START myworddoc.docxwürde Microsoft Word starten und myworddoc.docx öffnen. CALL myworddoc.docxmacht das gleiche ... STARTbietet jedoch mehr Optionen für den Fensterzustand und solche Dinge. Außerdem können Prozesspriorität und -affinität festgelegt werden.

Kurz gesagt, angesichts der zusätzlichen Optionen, die start bietet, sollte es das Werkzeug Ihrer Wahl sein.

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
quelle
11

Es gibt einen nützlichen Unterschied zwischen callund start /waitbeim Aufrufen, regsvr32.exe /sauf den beispielsweise Gary in seiner Antwort auf die Frage hinweist, wie ich den Anwendungs-Exit-Code aus einer Windows-Befehlszeile erhalte

call regsvr32.exe /s broken.dll
echo %errorlevel%

wird aber immer 0 zurückgeben

start /wait regsvr32.exe /s broken.dll
echo %errorlevel%

gibt die Fehlerstufe von regsvr32.exe zurück

aedjp
quelle
8

Folgendes habe ich beim parallelen Ausführen von Batch-Dateien gefunden (mehrere Instanzen derselben Bat-Datei gleichzeitig mit unterschiedlichen Eingabeparametern):

Nehmen wir an, Sie haben eine exe-Datei, die eine lange Aufgabe namens LongRunningTask.exe ausführt

Wenn Sie die exe direkt aus der bat-Datei aufrufen, ist nur der erste Aufruf der LongRunningTask erfolgreich, während der Rest den Betriebssystemfehler "Datei wird bereits vom Prozess verwendet" erhält.

Wenn Sie diesen Befehl verwenden:

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

Sie können mehrere Instanzen von bat und exe ausführen, während Sie noch auf den Abschluss der Aufgabe warten, bevor der bat die verbleibenden Befehle weiter ausführt. Mit der Option / B soll vermieden werden, dass ein weiteres Fenster erstellt wird. Die leeren Anführungszeichen werden benötigt, damit der Befehl funktioniert (siehe Referenz unten).

Beachten Sie, dass, wenn Sie / WAIT zu Beginn nicht verwenden, die LongRunningTask gleichzeitig mit den verbleibenden Befehlen in der Batchdatei ausgeführt wird. Daher kann es zu Problemen kommen, wenn einer dieser Befehle die Ausgabe der LongRunningTask erfordert

Wiederaufnahme:

Das kann nicht parallel laufen:

  • Rufen Sie LongRunningTask.exe auf

Dies läuft parallel und ist in Ordnung, sofern keine Datenabhängigkeiten zwischen der Ausgabe des Befehls und dem Rest der bat-Datei bestehen:

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

Dies wird parallel ausgeführt und wartet, bis die Aufgabe abgeschlossen ist, sodass Sie die Ausgabe verwenden können:

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

Referenz für den Startbefehl: Wie kann ich ein Programm aus einer Batchdatei ausführen, ohne die Konsole nach dem Programmstart geöffnet zu lassen?

Cherno
quelle
6

Anruf

Ruft ein Stapelverarbeitungsprogramm von einem anderen auf, ohne das übergeordnete Stapelverarbeitungsprogramm zu stoppen. Der Aufrufbefehl akzeptiert Beschriftungen als Ziel des Anrufs. Aufruf hat keine Auswirkung auf die Befehlszeile, wenn er außerhalb eines Skripts oder einer Batchdatei verwendet wird. https://technet.microsoft.com/en-us/library/bb490873.aspx

Anfang

Startet ein separates Eingabeaufforderungsfenster , um ein bestimmtes Programm oder einen bestimmten Befehl auszuführen. Wird ohne Parameter verwendet, öffnet start ein zweites Eingabeaufforderungsfenster. https://technet.microsoft.com/en-us/library/bb491005.aspx

Entwickler
quelle
-1

Dies ist ein alter Thread, aber ich bin gerade auf diese Situation gestoßen und habe einen ordentlichen Weg gefunden, um sie zu umgehen. Ich habe versucht, eine setup.exe auszuführen, aber der Fokus lag darauf, zur nächsten Zeile des Skripts zurückzukehren, ohne auf den Abschluss der setup.exe zu warten. Ich habe die oben genannten Lösungen ohne Glück ausprobiert.

Am Ende hat es den Trick geschafft, den Befehl durch mehr zu leiten.

setup.exe {Argumente} | Mehr

Steven Sheldon
quelle