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.
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).
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
!
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.