web-dev-qa-db-fra.com

Pourquoi avez-vous un appel de commande imbriqué sans "appel" à la première ligne à la ligne?

Je comprends comment appeler des fichiers de commandes imbriqués à partir d'un fichier parent à l'aide de la commande call, car les ressources disponibles sont nombreuses:

Cependant, je ne comprends pas que pourquoi appeler un autre fichier batch à partir d'un autre met fin au parent.

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

foo.bat
bar.bat

Cela ne ferait qu'exécuter foo.bat puis 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 1980. Cette fonctionnalité est-elle toujours là pour la compatibilité inverse?

Je ne peux penser à aucun usage (pratique) de ce logiciel, mais je suis peut-être trop habitué aux "nouvelles" techniques de programmation.

29
Brandon Amos

DOS utilisait un traitement de texte simple (à l'époque où vous aviez des éléments comme FILES=20 dans config.sys pour autoriser les poignées de fichier 20). Si le fichier en appelle un autre, le traitement continue avec ce fichier. Un seul descripteur de fichier est requis pour un fichier de traitement par lots. 

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

31
SeanC

Comme l'a écrit Sean Cheshire, c'est indispensable pour la compatibilité ascendante. 

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é après la sortie du deuxième lot.
Mais utiliser un appel avant de commencer le second.bat montrera que le premier lot n'est pas terminé.

parent.bat  

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

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

second.bat

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 aucun extra, il démarrera second.batETet passera à l'étiquette :myLabel dans second.bat!

7
jeb

Call dit en gros "allez exécuter cet autre fichier de commandes, puis revenez ici et continuez". Il existe depuis la version DOS 3.3 ou plus, et s’il était supprimé, la compatibilité avec les versions antérieures serait brisée (c’est pourquoi les utilisateurs utilisent encore des scripts batch). Il peut également être utilisé pour accéder à des emplacements :link.

Pour plus d’informations sur l’utilisation et la syntaxe (pour référence future pour d’autres), vous pouvez voir ceci Lien MS TechNet

Si vous avez besoin de nouvelles fonctionnalités, utilisez plutôt les scripts CMD ou les scripts PowerShell.

0
Ken White