Comando CALL vs. COMIENZO con la opción / WAIT

149

¿Cómo es el comando START con una opción WAIT?

START /wait notepad.exe 
START /wait  notepad.exe 

... algo diferente de usar un comando CALL?

CALL notepad.exe 
CALL notepad.exe 

¿Existe una situación en la que uno puede comportarse de manera diferente que el otro depende de lo que se está ejecutando?

Chad
fuente
2
Eche un vistazo a technet.microsoft.com/en-us/library/bb491005.aspx se trata de START y technet.microsoft.com/en-us/library/bb490873.aspx se trata de CALL
Developer

Respuestas:

183

Para los archivos exe , supongo que las diferencias son casi sin importancia.
Pero para comenzar un exe que ni siquiera necesitas CALL.

Al comenzar otro lote es una gran diferencia,
ya queCALL lo iniciará en la misma ventana y el lote llamado tiene acceso al mismo contexto variable.
Por lo tanto, también puede cambiar las variables que afectan a la persona que llama.

START creará un nuevo cmd.exe para el lote llamado y sin / b abrirá una nueva ventana.
Como es un contexto nuevo, las variables no se pueden compartir.

Las diferencias

Usostart /wait <prog>
: los cambios de las variables de entorno se pierden cuando <prog>finaliza
: la persona que llama espera<prog> que finalice

Usocall <prog>
: para exe se puede omitir, porque es igual a solo comenzar <prog>
: para un exe-prog, el lote de la persona que llama espera o inicia el exe de forma asincrónica, pero el comportamiento depende del propio exe .
- Para los archivos por lotes , el lote de la persona que llama continúa, cuando se llama<batch-file> finaliza , SIN llamar al control no volverá al lote de la persona que llama

Apéndice:

El uso CALLpuede cambiar los parámetros (para archivos por lotes y exe), pero solo cuando contienen signos de porcentaje o signos de porcentaje.

call myProg param1 param^^2 "param^3" %%path%%

Se expandirá a (desde un archivo por lotes)

myProg param1 param2 param^^3 <content of path>
jeb
fuente
25
Al ejecutar un archivo .bat usando START / WAIT, debe especificar START / WAIT cmd / c "file.bat" en lugar de solo START / WAIT "file.bat", de lo contrario la ventana cmd creada para file.bat permanecerá abierta
FrinkTheBrave
55
Puede encontrar la comparación entre CALL y START en: ss64.com/nt/start.html (actualizado hoy con las secciones "Start / Wait" y "START vs CALL")
Alfredo Capobianchi
Mi favorito es start /wait /b cmd /c <batchfile.bat>debido a que los archivos por lotes se ejecutan uno tras otro en la misma ventana de comandos
linux64kb
@ linux64kb, pero para los archivos por lotes no es necesario, solo necesitacall batchfile.bat
jeb
@jeb True. Prefiero este porque cada archivo por lotes se ejecutará en un entorno de shell de comando diferente, heredando las variables del shell de llamada y los cambios en los valores iniciales se perderán después de que termine el lote -> no queda basura después de cada ejecución consecutiva. Otra victoria es que no tiene que lidiar con el restablecimiento de variables en sus scripts.
linux64kb
17

Creo que en general deberían funcionar igual, pero hay algunas diferencias. STARTgeneralmente se usa para iniciar aplicaciones o para iniciar la aplicación predeterminada para un tipo de archivo determinado. De esa manera, si no START http://mywebsite.comlo hace START iexplore.exe http://mywebsite.com.

START myworddoc.docxiniciaría Microsoft Word y abriría myworddoc.docx. CALL myworddoc.docxhace lo mismo ... sin embargo, STARTofrece más opciones para el estado de la ventana y cosas de esa naturaleza. También permite establecer la prioridad del proceso y la afinidad.

En resumen, dadas las opciones adicionales proporcionadas por start, debería ser su herramienta de elección.

START ["title"] [/D path] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED]
  [/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL]
  [/NODE <NUMA node>] [/AFFINITY <hex affinity mask>] [/WAIT] [/B]
  [command/program] [parameters]

"title"     Title to display in window title bar.
path        Starting directory.
B           Start application without creating a new window. The
            application has ^C handling ignored. Unless the application
            enables ^C processing, ^Break is the only way to interrupt
            the application.
I           The new environment will be the original environment passed
            to the cmd.exe and not the current environment.
MIN         Start window minimized.
MAX         Start window maximized.
SEPARATE    Start 16-bit Windows program in separate memory space.
SHARED      Start 16-bit Windows program in shared memory space.
LOW         Start application in the IDLE priority class.
NORMAL      Start application in the NORMAL priority class.
HIGH        Start application in the HIGH priority class.
REALTIME    Start application in the REALTIME priority class.
ABOVENORMAL Start application in the ABOVENORMAL priority class.
BELOWNORMAL Start application in the BELOWNORMAL priority class.
NODE        Specifies the preferred Non-Uniform Memory Architecture (NUMA)
            node as a decimal integer.
AFFINITY    Specifies the processor affinity mask as a hexadecimal number.
            The process is restricted to running on these processors.

            The affinity mask is interpreted differently when /AFFINITY and
            /NODE are combined.  Specify the affinity mask as if the NUMA
            node's processor mask is right shifted to begin at bit zero.
            The process is restricted to running on those processors in
            common between the specified affinity mask and the NUMA node.
            If no processors are in common, the process is restricted to
            running on the specified NUMA node.
WAIT        Start application and wait for it to terminate.
mckeejm
fuente
8

Esto es lo que encontré al ejecutar archivos por lotes en paralelo (varias instancias del mismo archivo bat al mismo tiempo con diferentes parámetros de entrada):

Digamos que tiene un archivo exe que realiza una tarea larga llamada LongRunningTask.exe

Si llama al exe directamente desde el archivo bat, solo se realizará la primera llamada a LongRunningTask, mientras que el resto obtendrá un error del sistema operativo "El proceso ya está usando el archivo"

Si usa este comando:

inicio / B / WAIT "" "LongRunningTask.exe" "parámetros"

Podrá ejecutar varias instancias del bat y exe, mientras espera que la tarea finalice antes de que el bat continúe ejecutando los comandos restantes. La opción / B es evitar crear otra ventana, las comillas vacías son necesarias para que el comando funcione, consulte la referencia a continuación.

Tenga en cuenta que si no usa / WAIT al principio, LongRunningTask se ejecutará al mismo tiempo que los comandos restantes en el archivo por lotes, por lo que podría crear problemas si uno de estos comandos requiere la salida de LongRunningTask

Reanudando:

Esto no puede ejecutarse en paralelo:

  • llame a LongRunningTask.exe

Esto se ejecutará en paralelo y estará bien siempre que no existan dependencias de datos entre la salida del comando y el resto del archivo bat:

  • inicio / B "" "LongRunningTask.exe" "parámetros"

Esto se ejecutará en paralelo y esperará a que termine la tarea, para que pueda usar la salida:

  • inicio / B / WAIT "" "LongRunningTask.exe" "parámetros"

Referencia para el comando de inicio: ¿Cómo puedo ejecutar un programa desde un archivo por lotes sin dejar la consola abierta después del inicio del programa?

Cherno
fuente
6

Llamada

Llama a un programa por lotes desde otro sin detener el programa por lotes principal. El comando de llamada acepta etiquetas como destino de la llamada. La llamada no tiene efecto en la línea de comandos cuando se usa fuera de un script o archivo por lotes. https://technet.microsoft.com/en-us/library/bb490873.aspx

comienzo

Inicia una ventana separada del símbolo del sistema para ejecutar un programa o comando específico. Utilizado sin parámetros, inicio abre una segunda ventana de símbolo del sistema. https://technet.microsoft.com/en-us/library/bb491005.aspx

Desarrollador
fuente
-1

Este es un hilo viejo, pero acabo de encontrarme con esta situación y descubrí una forma clara de solucionarla. Estaba tratando de ejecutar un setup.exe, pero el enfoque volvía a la siguiente línea del script sin esperar a que finalizara el setup.exe. Probé las soluciones anteriores sin suerte.

Al final, canalizar el comando más hizo el truco.

setup.exe {argumentos} | más

Steven Sheldon
fuente