2012-07-24 16 views
25

entiendo cómo llamar a archivos por lotes anidados dentro de un archivo principal con el comando call, ya que hay un montón de recursos en la que:¿Por qué la llamada a un archivo por lotes anidado sin anteponer "call" a la línea sale del archivo por lotes principal?

Sin embargo, no entiendo por qué llamando a otro archivo por lotes de otro termina el principal.

Para un ejemplo menos abstracto, supongamos que tengo un archivo por lotes que "enlaces" junto separan archivos por lotes y yo erróneamente no Prepend call a cada línea:

foo.bat 
bar.bat 

Esto sólo se ejecutaría foo .bat y luego salir. Para ejecutar correctamente ambos comandos, que habría que anteponer llamada antes de cada declaración:

call foo.bat 
call bar.bat 

Por qué sigue existiendo la primera funcionalidad? ¿Por qué no ha sido cambiado? Me di cuenta de que call se introdujo en MS-DOS 3.3, que se lanzó a finales de los 80, así que ¿esta funcionalidad sigue estando aquí para la compatibilidad inversa? No puedo pensar en ningún uso (práctico) de ello, pero tal vez estoy demasiado acostumbrado a las "nuevas" técnicas de programación.

Respuesta

27

DOS que se utiliza procesamiento de texto simple (espalda cuando se tenía cosas como FILES=20 en config.sys para permitir 20 identificadores de archivo), por lo que se abrió el archivo, leer la siguiente línea, cerrado el archivo, a continuación, ejecutar la línea acaba de leer . Si el archivo llamó a otro, entonces el procesamiento continuó con ese archivo, por lo que solo se necesitaría 1 identificador de archivo para un archivo por lotes.

Hasta que Microsoft ingresó el comando call, no había forma de volver al archivo original (sin usar trucos como dar el nombre del archivo anterior como parámetro y usar archivos temporales para que el archivo por lotes original sepa tenía domo algún procesamiento, y podría entonces GOTO la siguiente parte del archivo).

+0

Bien, ¿entonces la funcionalidad inicial simplemente fue pasada por alto? 'call' se implementó porque las personas comúnmente usaban soluciones como describió? ¿No sobrescribieron la funcionalidad inicial simplemente por compatibilidad con versiones anteriores? –

+5

a la derecha. La compatibilidad con versiones anteriores es lo que permite que muchos programas win 3.0 se ejecuten en win 7. En ese momento, terminé escribiendo algunas funciones en ensamblador para que fuera un programa y pudiera volver al archivo por lotes, lo que ahora es 'choice ' ', Implementé el uso de un programa simple que establece el nivel de error en el valor ASCII del carácter presionado. – SeanC

+0

Como un lado, la funcionalidad de leer una línea, ejecutarla, leer otra línea, etc. significa que puede tener archivos de lotes auto-modificables. Nunca he hecho esto a propósito, pero si tiene un archivo por lotes que recupera (una nueva versión) del control de revisión, puede obtener resultados extraños donde ejecuta la versión 1 hasta la línea que hace la recuperación, luego continúa con la versión 2. – yoyo

0

Call es básicamente decir "vaya a ejecutar este otro archivo por lotes, y luego regrese aquí y continúe". Ha estado allí desde el DOS 3.3 o más, y si se eliminara ahora rompería toda compatibilidad con versiones anteriores (razón por la cual las personas siguen usando scripts por lotes). También se puede usar para ramificar a ubicaciones :link.

Para información sobre el uso y la sintaxis (para referencia futura para otros), se puede ver este MS TechNet link

Si necesita una nueva funcionalidad, utiliza secuencias de comandos CMD o scripts de PowerShell en su lugar.

+0

Gracias por la respuesta, pero eso no es exactamente lo que estaba preguntando. También duplicó parte de la información que di en mi pregunta. Entiendo cómo funciona 'call' y hay mucha referencia para las personas que no lo hacen. Me preguntaba cuando la otra forma (no usar 'call') se usaría prácticamente en un script por lotes. ¿Por qué alguien querría que el padre se detuviera sin importar si un archivo por lotes está anidado dentro de otro? –

+2

Porque mantener una pila donde lo dejó aumentaría el tamaño de su segmento de memoria residente, lo que limitaría el tamaño máximo del programa que podría ejecutarse. Una vez que se tomó la decisión, no se puede cambiar porque haría que los archivos por lotes existentes dejaran de funcionar. –

7

Como escribió Sean Cheshire, es necesario para la compatibilidad con versiones anteriores.

¡Pero iniciar un archivo por lotes desde un archivo por lotes sin usar CALL no termina el elemento principal!
Se ve de esa manera, ya que normalmente el padre no se ejecutará más después de que salga el segundo lote.
Pero usar una llamada antes de iniciar el segundo.bat, mostrará que el primer lote no finaliza.

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 

utilizo aquí el del secpond.bat & echo back ... para evitar otro error/característica de cmd.exe.
Si utiliza second.bat sin ningún elemento adicional, comenzará second.batY ¡salte a la etiqueta :myLabel en second.bat!

+1

Me gustaría señalar que '/ B' se introdujo en NT 4, antes de eso, solo había horribles trucos de programación disponibles – SeanC

Cuestiones relacionadas