Plusieurs façons d'appeler un fichier de commandes Windows à partir d'un autre ou d'une invite. Lequel dans quel cas?

92

Un fichier de commandes Windows ( called.batou called.cmd) peut être appelé à partir d'un autre fichier de commandes ( caller.batou caller.cmd) ou d'une invite cmd.exe interactive de plusieurs manières:

  1. appel direct: called.bat
  2. en utilisant la commande d'appel: call called.bat
  3. en utilisant la commande cmd: cmd /c called.bat
  4. en utilisant la commande de démarrage: start called.bat

J'ai du mal à différencier leur utilisation prévue en fonction de leur texte d'aide: quand utiliser lequel? par exemple, pourquoi je pourrais utiliser la commande «appel» au lieu d'un appel direct. Qu'est ce qui est different?

Je suis intéressé par un rapport de synthèse qui analyse les 4 possibilités (et d'autres le cas échéant) à partir de différents points de vue: les cas d'utilisation recommandés pour lesquels ils sont conçus pour s'adapter, le processus de génération, le contexte d'exécution, l'environnement, le traitement du code de retour.

Remarque: j'utilise Windows XP SP3.

faible
la source

Réponses:

101
  1. Le fichier de commandes sera exécuté par l'instance cmd.exe actuelle (ou une nouvelle instance cmd.exe si, par exemple, double-cliquez dans l'Explorateur).

  2. Identique au n ° 1, n'a d'effet que lorsqu'il est utilisé dans un fichier batch / cmd. Dans un fichier batch, sans «appel», le fichier batch parent se termine et le contrôle passe au fichier batch appelé; with 'call' exécute le fichier de commandes enfant et le fichier de commandes parent continue avec des instructions après l'appel.

  3. Exécute le fichier de commandes dans une nouvelle instance cmd.exe.

  4. Démarrer exécutera le fichier de commandes dans une nouvelle instance cmd.exe dans une nouvelle fenêtre et l'appelant n'attendra pas la fin.

Kyle Alons
la source
7
Remarque pour l'option 4, la commande de démarrage doit toujours être suivie d'un 'titre' , donc si vous n'avez pas besoin d'un titre, vous devriez avoir des guillemets vides, par exemplestart "" [options] command
Daryn
@Daryn ce lien mentionne simplement que vous devriez toujours en avoir un, mais dit même que Microsoft décrit le paramètre comme facultatif. Ils ne me disent pas pourquoi cela devrait être «obligatoire». Même plusieurs de leurs exemples en bas omettent le paramètre title.
Adam Plocher
5

Une chose n'est pas claire dans les commentaires ici: lorsque vous appelez un fichier de commandes à partir d'un autre en utilisant uniquement son nom (cas n ° 1 dans la question d'origine), l'exécution s'arrête à partir du fichier de commandes appelant. Par exemple, dans ces lignes:

called.bat
echo Hello

La ligne 'echo Hello' (et tout ce qui la suit) ne sera pas appelée. Si vous utilisez le mot clé 'call', l'exécution reprend après l'appel. Donc dans ce cas:

call called.bat
echo Hello

La ligne 'echo Hello' sera appelée.

De plus, toutes les variables définies dans le fichier called.bat seront également transmises au processus appelant.

Imaginez un fichier 'called.bat' qui avait cette ligne:

set MYVAR=hello

Ensuite,% MYVAR% serait disponible pour le fichier batch appelant s'il utilisait:

call called.bat

Mais, il n'utiliserait pas

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

REM stops and replaces current cmd.exe process with a new one
called.bat        
Ken
la source