Commande CALL vs START avec l'option / WAIT

149

Comment est la commande START avec une option WAIT

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

... différent de l'utilisation d'une commande CALL?

CALL notepad.exe 
CALL notepad.exe 

Y a-t-il une situation où l'un peut se comporter différemment de l'autre en fonction de ce qui est exécuté?

Tchad
la source

Réponses:

183

Pour les fichiers exe , je suppose que les différences sont presque sans importance.
Mais pour démarrer un exe, vous n'avez même pas besoin CALL.

Lors du démarrage d'un autre lot, c'est une grande différence,
car CALLle démarrera dans la même fenêtre et le lot appelé a accès au même contexte de variable.
Ainsi, il peut également changer les variables qui affectent l'appelant.

STARTcréera un nouveau cmd.exe pour le lot appelé et sans / b il ouvrira une nouvelle fenêtre.
Comme il s'agit d'un nouveau contexte, les variables ne peuvent pas être partagées.

Différences

Utilisationstart /wait <prog>
- Les modifications des variables d'environnement sont perdues à la <prog>fin
- L'appelant attend que le <prog>soit terminé

Utilisationcall <prog>
- Pour exe, il peut être omis, car il équivaut à démarrer <prog>
- Pour un exe-prog, le lot de l'appelant attend ou démarre l' exe de manière asynchrone, mais le comportement dépend de l' exe lui-même.
- Pour les fichiers batch , le batch appelant continue, lorsque l'appelé se <batch-file>termine, SANS appel le contrôle ne retournera pas au batch caller

Addenda:

L'utilisation CALLpeut modifier les paramètres (pour les fichiers batch et exe), mais uniquement lorsqu'ils contiennent des signes carets ou des pourcentages.

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

Sera étendu à (à partir d'un fichier batch)

myProg param1 param2 param^^3 <content of path>
jeb
la source
25
Lors de l'exécution d'un fichier.bat en utilisant START / WAIT, vous devez spécifier START / WAIT cmd / c "file.bat" plutôt que simplement START / WAIT "file.bat", sinon la fenêtre cmd créée pour file.bat restera ouverte
FrinkTheBrave
5
Vous pouvez trouver la comparaison entre CALL et START sur: ss64.com/nt/start.html (mis à jour aujourd'hui avec les sections "Start / Wait" et "START vs CALL")
Alfredo Capobianchi
Mon préféré est start /wait /b cmd /c <batchfile.bat>parce que les fichiers de commandes s'exécutent les uns après les autres dans la même fenêtre de commande
linux64kb
@ linux64kb, mais pour les fichiers batch, ce n'est pas nécessaire, vous avez seulement besoincall batchfile.bat
jeb
@jeb True. Je préfère celui-ci car chaque fichier de commandes fonctionnera dans un environnement de shell de commande différent, héritant des variables du shell appelant et les modifications apportées aux valeurs initiales seront perdues une fois le lot terminé -> il ne reste plus de déchets après chaque exécution consécutive. Un autre avantage est que vous n'avez pas à vous soucier de la réinitialisation des variables dans vos scripts.
linux64kb
17

Je pense qu'ils devraient généralement fonctionner de la même manière, mais il y a des différences. STARTest généralement utilisé pour démarrer des applications ou pour démarrer l'application par défaut pour un type de fichier donné. De cette façon si vous START http://mywebsite.comne le faites pas START iexplore.exe http://mywebsite.com.

START myworddoc.docxdémarrerait Microsoft Word et ouvrirait myworddoc.docx. CALL myworddoc.docxfait la même chose ... mais STARTfournit plus d'options pour l'état de la fenêtre et les choses de cette nature. Il permet également de définir la priorité et l'affinité du processus.

En bref, étant donné les options supplémentaires fournies par start, cela devrait être votre outil de choix.

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
la source
11

Il y a une différence utile entre callet start /waitlors de l'appel regsvr32.exe /spar exemple, également référencée par Gary dans sa réponse à how-do-i-get-the-application-exit-code-from-a-windows-command-line

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

retournera toujours 0 mais

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

renverra le niveau d'erreur de regsvr32.exe

aedjp
la source
8

C'est ce que j'ai trouvé en exécutant des fichiers batch en parallèle (plusieurs instances du même fichier bat en même temps avec différents paramètres d'entrée):

Disons que vous avez un fichier exe qui effectue une longue tâche appelée LongRunningTask.exe

Si vous appelez l'exe directement à partir du fichier bat, seul le premier appel à LongRunningTask réussira, tandis que les autres recevront une erreur du système d'exploitation "Le fichier est déjà utilisé par le processus"

Si vous utilisez cette commande:

start / B / WAIT "" "LongRunningTask.exe" "paramètres"

Vous serez en mesure d'exécuter plusieurs instances de la batte et de l'exe, tout en attendant que la tâche se termine avant que la batte continue d'exécuter les commandes restantes. L'option / B permet d'éviter de créer une autre fenêtre, les guillemets vides sont nécessaires pour que la commande fonctionne, voir la référence ci-dessous.

Notez que si vous n'utilisez pas le / WAIT au début, la LongRunningTask sera exécutée en même temps que les commandes restantes dans le fichier de commandes, donc cela pourrait créer des problèmes si l'une de ces commandes nécessite la sortie de la LongRunningTask

Reprise:

Cela ne peut pas fonctionner en parallèle:

  • appeler LongRunningTask.exe

Cela fonctionnera en parallèle et sera correct dans la mesure où il n'y a pas de dépendances de données entre la sortie de la commande et le reste du fichier bat:

  • start / B "" "LongRunningTask.exe" "paramètres"

Cela s'exécutera en parallèle et attendra que la tâche se termine, vous pouvez donc utiliser la sortie:

  • start / B / WAIT "" "LongRunningTask.exe" "paramètres"

Référence pour la commande de démarrage: Comment puis-je exécuter un programme à partir d'un fichier batch sans laisser la console ouverte après le démarrage du programme?

Cherno
la source
6

Appel

Appelle un programme batch depuis un autre sans arrêter le programme batch parent. La commande call accepte les étiquettes comme cible de l'appel. L'appel n'a aucun effet sur la ligne de commande lorsqu'il est utilisé en dehors d'un script ou d'un fichier de commandes. https://technet.microsoft.com/en-us/library/bb490873.aspx

Début

Démarre une fenêtre d'invite de commandes distincte pour exécuter un programme ou une commande spécifié. Utilisé sans paramètres, démarrer ouvre une deuxième fenêtre d'invite de commande. https://technet.microsoft.com/en-us/library/bb491005.aspx

Développeur
la source
-1

Ceci est un vieux fil, mais je viens de rencontrer cette situation et j'ai découvert un moyen de contourner cela. J'essayais d'exécuter un setup.exe, mais le focus revenait à la ligne suivante du script sans attendre la fin de setup.exe. J'ai essayé les solutions ci-dessus sans succès.

En fin de compte, passer la commande à travers plus a fait l'affaire.

setup.exe {arguments} | plus

Steven Sheldon
la source