Varias maneras de llamar a un archivo por lotes de Windows desde otro o desde el prompt. ¿Cuál en cual caso?

Se puede llamar a un archivo de proceso por lotes de Windows ( caller.bat o caller.cmd ) desde otro archivo de proceso por lotes ( caller.bat o caller.cmd ) o caller.bat caller.cmd interactivo cmd.exe de varias maneras:

  1. llamada directa: called.bat
  2. usando el comando de call called.bat : call called.bat
  3. usando el comando cmd: cmd /c called.bat
  4. usando el comando de start called.bat : start called.bat

Estoy bastante en problemas para diferenciar su uso previsto en función de su texto de ayuda: ¿cuándo usar cuál? por ejemplo, por qué podría usar el comando ‘llamar’ en lugar de la llamada directa. ¿Qué es diferente?

Me interesa un informe resumido que analice las 4 posibilidades (y otras si faltan) desde varios puntos de vista: casos de uso recomendados para los que están diseñados para adaptarse, proceso de desove, contexto de ejecución, entorno, procesamiento del código de retorno.

Nota: estoy usando Windows XP SP3.

  1. El archivo por lotes será ejecutado por la instancia actual de cmd.exe (o una nueva instancia de cmd.exe si, por ejemplo, se hace doble clic en el Explorador).

  2. Igual que el # 1, solo tiene un efecto cuando se usa dentro de un archivo por lotes / cmd. En un archivo por lotes, sin ‘invocar’, el archivo principal del proceso por lotes finaliza y el control pasa al archivo por lotes llamado; con ‘llamada’ ejecuta el archivo por lotes hijo, y el archivo por lotes principal continúa con instrucciones después de la llamada.

  3. Ejecuta el archivo por lotes en una nueva instancia de cmd.exe.

  4. Start ejecutará el archivo por lotes en una nueva instancia de cmd.exe en una nueva ventana y la persona que llama no esperará hasta que finalice.

Algo que no queda claro en los comentarios aquí: cuando llama a un archivo por lotes desde otro utilizando solo su nombre (Caso # 1 en la pregunta original), la ejecución se detiene desde el archivo por lotes que realiza la llamada. Por ejemplo, en estas líneas:

 called.bat echo Hello 

La línea ‘eco Hola’ (y todo lo que le sigue) no se llamará. Si usa la palabra clave ‘call’, la ejecución se reanuda después de la llamada. Entonces en este caso:

 call called.bat echo Hello 

Se llamará a la línea ‘eco Hola’.

Además, todas las variables establecidas en el archivo called.bat también se pasarán al proceso de llamada.

Imagine un archivo ‘called.bat’ que tenía esta línea:

 set MYVAR=hello 

Entonces,% MYVAR% estaría disponible para el archivo por lotes de llamada si se usa:

 call called.bat 

Pero, no estaría usando

 REM starts a new cmd.exe process start called.bat REM stops and replaces current cmd.exe process with a new one called.bat