Pourquoi l'appel d'un fichier batch imbriqué sans ajouter "call" à la ligne quitte-t-il le fichier batch parent?

Je comprends comment appeler des fichiers batch imbriqués à partir d'un fichier parent en utilisant la commande call, car il y a beaucoup de ressources à ce sujet:

Cependant, je ne comprends pas pourquoi appeler un autre fichier batch à partir d'un autre termine le parent.

Pour un exemple moins abstrait, supposons que j'ai un lot fichier qui " lie " ensemble des fichiers batch séparés et je par erreur n'ai pas ajouté call à chaque ligne:

foo.bat
bar.bat

Cela exécuterait seulement foo.chauve-souris, puis sur quitter. Pour exécuter correctement les deux commandes, je devrais ajouter un appel avant chaque instruction:

call foo.bat
call bar.bat

Pourquoi la première fonctionnalité existe toujours? Pourquoi n'a-t-il pas été changé? J'ai remarqué que call a été introduit dans MS-DOS 3.3, qui a été publié à la fin des années 80, donc cette fonctionnalité est toujours là pour inverser compatibilité? Je ne peux penser à aucun usage (pratique) de celui-ci, mais peut-être que je suis trop habitué aux "nouvelles" techniques de programmation.

29
demandé sur Community 2012-07-25 00:21:18

3 réponses

DOS utilisait un traitement de texte simple (à l'époque où vous aviez des choses comme FILES=20 dans config.sys pour permettre 20 poignées de fichier), donc ouvert le fichier, Lire la ligne suivante, fermé le fichier, puis exécuté la ligne juste lire. Si le fichier en appelle un autre, le traitement se poursuit avec ce fichier, donc seulement 1 handle de fichier sera nécessaire pour un fichier batch.

Jusqu'à ce que Microsoft mette la commande call, Il n'y avait aucun moyen de revenir au fichier d'origine (sans utiliser des astuces comme donner le nom du fichier précédent en tant que paramètre, et en utilisant des fichiers temporaires pour faire savoir au fichier batch original qu'il avait un traitement, et pourrait alors GOTO la partie suivante du fichier).

30
répondu SeanC 2012-07-24 21:18:54

Comme L'a écrit Sean Cheshire, c'est nécessaire pour la rétrocompatibilité.

Mais Démarrer un fichier batch à partir d'un fichier batch sans utiliser CALL ne met pas fin au parent!
Cela ressemble à cela, car le parent ne sera normalement pas exécuté plus loin après la sortie du deuxième lot.
Mais en utilisant un appel avant de commencer la seconde.chauve-souris montrent que le premier lot n'est pas terminé.

Parent.MTD

echo parent.bat
call :myLabel
echo back in parent.bat main
exit /b

:myLabel
second.bat & echo back in parent.bat
exit /b

De seconde en Seconde.MTD

echo second.bat
exit /b

J'utilise ici le secpond.bat & echo back ... pour éviter un autre bug / Fonctionnalité de cmd.EXE.
Si vous utilisez second.bat sans les extras, il va commencer second.bat ET saut à l'étiquette :myLabel dans second.bat!

7
répondu jeb 2012-07-25 08:46:02

Call est essentiellement dire "allez exécuter cet autre fichier batch, puis revenez ici et continuez". Il est là depuis DOS 3.3 ou plus, et s'il était supprimé maintenant casserait toute rétrocompatibilité (c'est pourquoi les gens utilisent toujours des scripts batch). Il peut également être utilisé pour se brancher à des emplacements :link.

Pour plus d'informations sur l'utilisation et la syntaxe (pour référence future pour les autres), vous pouvez voir ce MS lien TechNet

Si vous avez besoin de nouvelles fonctionnalités, utilisez Scripts PowerShell à la place.

0
répondu Ken White 2012-07-24 20:40:02