Varias formas de llamar a un archivo por lotes de Windows desde otro o desde el indicador. Cual en cada caso?

92

Un archivo por lotes de Windows ( called.bato called.cmd) puede ser llamado desde otro archivo por lotes ( caller.bato caller.cmd) o cmd.exe interactiva prompt de diversas maneras:

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

Estoy bastante en problemas para diferenciar su uso previsto según 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?

Estoy interesado en algún 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 generación, contexto de ejecución, entorno, procesamiento de código de retorno.

Nota: estoy usando Windows XP SP3.

oscuro
fuente

Respuestas:

101
  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 n. ° 1, solo tiene efecto cuando se usa dentro de un archivo por lotes / cmd. En un archivo por lotes, sin 'llamada', el archivo por lotes principal finaliza y el control pasa al archivo por lotes llamado; con 'llamada' ejecuta el archivo por lotes secundario, y el archivo por lotes principal continúa con las declaraciones después de la llamada.

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

  4. Inicio ejecutará el archivo por lotes en una nueva instancia de cmd.exe en una nueva ventana y la persona que llama no esperará a que se complete.

Kyle Alons
fuente
7
Tenga en cuenta que para la opción 4, el comando de inicio siempre debe ir seguido de un 'título' , por lo que si no necesita un título, debe tener comillas dobles vacías, por ejemplostart "" [options] command
Daryn
@Daryn ese enlace simplemente menciona que siempre debe tener uno, pero incluso dice que Microsoft describe el parámetro como opcional. No me dicen por qué debería ser "obligatorio". Incluso varios de sus ejemplos en la parte inferior omiten el parámetro de título.
Adam Plocher
5

Una cosa que no queda clara en los comentarios aquí: cuando llama a un archivo por lotes desde otro usando solo su nombre (Caso n. ° 1 en la pregunta original), la ejecución se detiene desde el archivo por lotes que llama. Por ejemplo, en estas líneas:

called.bat
echo Hello

La línea 'echo Hello' (y cualquier cosa que la siga) no será llamada. 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 'echo Hello'.

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

Imagine un archivo 'llamado.bat' que tiene esta línea:

set MYVAR=hello

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

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        
conocido
fuente