Una sola línea con múltiples comandos usando un archivo por lotes de Windows

Resuelto Quanti Monati asked hace 10 años • 1 respuestas

Intento entender cómo funcionan varios comandos en una sola línea de comando en un archivo por lotes.

dir & md folder1 & rename folder1 mainfolder

Y otro caso con comandos similares, pero &sustituidos por &&.

dir && md folder1 && rename folder1 mainfolder

1. ¿Cuál es la diferencia entre estos dos casos?


Otra cosa que quiero preguntar:

Un trazador de líneas batch.bat:

dir & md folder1 & rename folder1 mainfolder

Multilínea batch.bat:

dir
md folder1
rename folder1 mainfolder

2. ¿Son iguales estos de una sola línea y de varias líneas en términos de procedimiento de archivo por lotes?


Y una cosa más que me gustaría saber:

3. Si llamo a otros archivos por lotes desde main.bat, ¿se ejecutan de forma independiente y simultánea? ¿El archivo por lotes principal no espera a que finalicen los procedimientos en otros archivos por lotes? ¿Como hacer eso?

Quanti Monati avatar Aug 17 '14 02:08 Quanti Monati
Aceptado

&entre dos comandos simplemente da como resultado la ejecución de ambos comandos independientemente del resultado del primer comando. El comando a la derecha de &se ejecuta después de que el comando a la izquierda de &finalice independientemente del éxito o error del comando anterior, es decir, independiente del valor de salida/retorno del comando anterior.

&&da como resultado una ejecución condicional del segundo comando. El segundo comando se ejecuta solo si el primero fue exitoso, lo que significa que se salió con el código de retorno 0.

Para obtener una explicación alternativa, consulte Ejecución condicional .

dir & md folder1 & rename folder1 mainfolder

es por lo tanto igual

dir
md folder1
rename folder1 mainfolder

Un reemplazo multilínea para

dir && md folder1 && rename folder1 mainfolder

sería

dir
if not errorlevel 1 (
   md folder1
   if not errorlevel 1 (
      rename folder1 mainfolder
   )
)

if not errorlevel 1significa que el comando anterior no terminó con un código de salida mayor que 0 . Como los comandos diry mdnunca salen con un valor negativo, solo con 0 o más (como casi todos los comandos y aplicaciones de consola) y el valor 0 es el código de salida para el éxito, este es un método correcto para probar la ejecución exitosa de diry md.

Otros temas útiles de Stack Overflow sobre errorlevel:

  • ¿Qué comandos internos de cmd.exe borran el ERRORLEVEL a 0 en caso de éxito?
  • ¿Cuáles son los valores de ERRORLEVEL establecidos por los comandos internos de cmd.exe?

Se debe tener cuidado al mezclar operadores incondicionales &con operadores condicionales como &&y ||debido a que el orden de ejecución no es necesariamente el orden de los comandos en la línea de comandos.

Ejemplo:

dir "C:\Users\%UserName%" /AD 2>nul || dir "%UserProfile%" /AD & echo User profile path: "%UserProfile%"

Esta línea de comando se ejecuta como:

dir "C:\Users\%UserName%" /AD 2>nul
if errorlevel 1 dir "%UserProfile%" /AD
echo User profile path: "%UserProfile%"

El comando ECHO siempre se ejecuta independientemente del resultado de la ejecución del primer DIR , mientras que el segundo DIR se ejecuta solo si el primer DIR falla como en Windows XP o la carpeta de perfil del usuario no está en la unidad C: o no está en ninguna carpeta Users.

Es necesario utilizar (y )al ejecutar ECHO sólo si el primer DIR falla después del segundo DIR independientemente del resultado del segundo DIR .

dir "C:\Users\%UserName%" /AD 2>nul || ( dir "%UserProfile%" /AD & echo User profile path: "%UserProfile%" )

Esta línea de comando se ejecuta como:

dir "C:\Users\%UserName%" /AD 2>nul
if errorlevel 1 (
    dir "%UserProfile%" /AD
    echo User profile path: "%UserProfile%"
)

Para obtener la respuesta a la tercera pregunta, consulte mi respuesta sobre ¿Cómo llamar a un archivo por lotes en la carpeta principal del archivo por lotes actual? donde expliqué las diferencias al ejecutar un archivo por lotes con comando callo con comando starto sin ninguno de esos dos comandos desde un archivo por lotes.

Mofi avatar Aug 16 '2014 21:08 Mofi