¿Cómo ejecuto dos comandos en una línea en Windows CMD?

962

Quiero ejecutar dos comandos en una consola CMD de Windows.

En Linux lo haría así

touch thisfile ; ls -lstrh

¿Cómo se hace en Windows?

flybywire
fuente

Respuestas:

1322

Así en todos los sistemas operativos de Microsoft desde 2000, y sigue siendo bueno hoy:

dir & echo foo

Si desea que el segundo comando se ejecute solo si el primero salió correctamente:

dir && echo foo

La sintaxis de ampersand (&) para ejecutar múltiples comandos en una línea se remonta a Windows XP, Windows 2000 y algunas versiones anteriores de NT. (4.0 al menos, según un comentarista aquí.)

Hay bastantes otros puntos sobre esto que encontrará desplazándose hacia abajo en esta página.

Siguen los datos históricos, para aquellos que pueden encontrarlo educativo

Antes de eso, la sintaxis && era solo una característica del 4DOS de reemplazo de shell antes de que esa característica se agregara al intérprete de comandos de Microsoft.

En Windows 95, 98 y ME, usaría el carácter de canalización en su lugar:

dir | echo foo

En MS-DOS 5.0 y versiones posteriores, a través de algunas versiones anteriores de Windows y NT del intérprete de comandos, el separador de comandos (no documentado) era el carácter 20 (Ctrl + T) que representaré con ^ T aquí.

dir ^T echo foo
djdanlib
fuente
26
Al menos hasta NT 4.
Joey
17
Funciona en Win 8.0 y 8.1 también.
MEMark
55
@Fallenreaper, eso también funciona en línea recta cmd, así que supongo que no es un mal hábito. :)
66
@Fallenreaper Asegúrese de conocer la diferencia práctica entre los dos: consulte la respuesta de Raihan a continuación.
Moshe Katz
8
Te tengo. A && B, B solo se ejecutará si A tiene éxito, mientras que A & B ejecutará B después de A, sin importar cuál sea el resultado de A. Gracias por el
aviso
580

Una cita de la documentación:

Uso de múltiples comandos y símbolos de procesamiento condicional.

Puede ejecutar múltiples comandos desde una sola línea de comando o script usando símbolos de procesamiento condicional. Cuando ejecuta varios comandos con símbolos de procesamiento condicional, los comandos a la derecha del símbolo de procesamiento condicional actúan en función de los resultados del comando a la izquierda del símbolo de procesamiento condicional.

Por ejemplo, es posible que desee ejecutar un comando solo si falla el comando anterior. O bien, es posible que desee ejecutar un comando solo si el comando anterior es exitoso.

Puede usar los caracteres especiales enumerados en la siguiente tabla para pasar múltiples comandos.

  • & [...]
    command1 & command2
    Use para separar múltiples comandos en una línea de comando. Cmd.exe ejecuta el primer comando y luego el segundo comando.

  • && [...]
    command1 && command2
    Use para ejecutar el comando después de && solo si el comando que precede al símbolo es exitoso. Cmd.exe ejecuta el primer comando y luego ejecuta el segundo comando solo si el primer comando se completó correctamente.

  • || [...]
    command1 || command2
    Use para ejecutar el comando siguiente || solo si el comando precede a || falla Cmd.exe ejecuta el primer comando y luego ejecuta el segundo comando solo si el primer comando no se completó correctamente (recibe un código de error mayor que cero).

  • ( ) [...]
    (command1 & command2)
    Use para agrupar o anidar múltiples comandos.

  • ; or ,
    command1 parameter1;parameter2
    Se usa para separar los parámetros del comando.

Raihan
fuente
41
Tratar cmd /c "echo foo & echo bar".
Raihan
2
vagrant up && vagrant sshtrabajó sin comillas en Windows 10.
furman87
¡Gracias! No sabía sobre chamuscar &, lo hace asíncrono y ejecuta ambos en paralelo. Estaba atascado porque estaba usando &&síncrono y solo continúa si el primero tiene éxito.
TetraDev
1
enlace de documentación roto, nueva ubicación technet.microsoft.com/en-us/library/bb490954.aspx
nkef
77
@TetraDev &no hace que los comandos sean asíncronos o paralelos. command1 & command2correrá command2 después de que se command1 haya completado. El éxito o el fracaso de command1es irrelevante.
bornfromanegg
74

&es el equivalente de Bash para ;(ejecutar comandos) y &&es el equivalente de Bash de &&(ejecutar comandos solo cuando lo anterior no ha causado un error).

manojlds
fuente
1
Esto también es cierto para csh, tcsh y muchos más shells. Nunca he visto ;antes en Linux
phuclv
10
@ LưuVĩnhPhúc en shells de estilo sh, ;significa ejecutar el primer comando, esperar a que termine y luego ejecutar el segundo comando. &significa ejecutar el primer comando, ponerlo en segundo plano y ejecutar el segundo comando. Entonces ambos programas se lanzan simultáneamente. Tenga en cuenta que estos no son símbolos combinados, son símbolos finales al primer comando; puede iniciar un solo comando en segundo plano progname &sin tener un segundo comando.
MM
25

Puede usar & para ejecutar comandos uno tras otro. Ejemplo:c:\dir & vim myFile.txt

Scrappedcola
fuente
19

Si desea crear un acceso directo de cmd (por ejemplo, en su escritorio) agregue el parámetro / k (/ k significa mantener, / c cerrará la ventana):

cmd /k echo hello && cd c:\ && cd Windows
TroodoN-Mike
fuente
16

Puede usar la llamada para superar el problema de las variables de entorno que se evalúan demasiado pronto, por ejemplo

set A=Hello & call echo %A%
SSi
fuente
1
Esto sólo funciona si no está ya establecido la variable, en cuyo caso los echoimprime el antiguo valor, no el nuevo valor. Al menos, esto es lo que observo en mi cuadro de Windows 7.
Craig M. Brandenburg
Uso el conjunto A = primero para asegurarme de que la variable no esté configurada.
SSi
1
Un mejor método es utilizar la expansión retrasada ( setlocal EnableDelayedExpansionen un script o cmd /v). Por ejemplo: timeout 5 && cmd /v /c echo !TIME! && echo %TIME%.
Nick
55
Use ^ después del primer porcentaje para obtener el nuevo valor: establezca A = Hola y llame a echo% ^ A%
Nicolas
9

Se pueden usar varios símbolos de procesamiento cuando se ejecutan varios comandos en la misma línea, y pueden conducir a la redirección de procesamiento en algunos casos, alterar la salida en otro caso, o simplemente fallar. Un caso importante es colocar en la misma línea comandos que manipulan variables.

@echo off
setlocal enabledelayedexpansion
set count=0
set "count=1" & echo %count% !count!

0 1

Como puede ver en el ejemplo anterior, cuando los comandos que usan variables se colocan en la misma línea, debe usar la expansión retardada para actualizar sus valores de variables. Si su variable está indexada, use el comando CALL con modificadores %% para actualizar su valor en la misma línea:

set "i=5" & set "arg!i!=MyFile!i!" & call echo path!i!=%temp%\%%arg!i!%%

path5=C:\Users\UserName\AppData\Local\Temp\MyFile5
sambul35
fuente
el ejemplo dado no funcionó para mí, pero a continuación uno sí:cmd /V:ON /c "set i=5 & set arg!i!=MyFile!i! & echo path!i!=%temp%\%arg!i!%"
Sábado
8

cmd /c ipconfig /all & Output.txt

Este comando ejecuta el comando y abre el Output.txtarchivo en un solo comando

dpp.2325
fuente
8

Entonces, estaba tratando de habilitar la tarea específica de ejecución RegAsm(ensamblaje de registro) desde un menú contextual. El problema que tuve fue que el resultado aparecería y desaparecería antes de que pudiera leerlo. Así que traté de canalizar Pause, lo que no funciona cuando el comando falla (como se menciona aquí, el comando Pausa no funciona en el script .bat y aquí el comando de archivo por lotes PAUSE no funciona ). Así que lo intenté cmd /kpero eso deja la ventana abierta para más comandos (solo quiero leer el resultado). Entonces agregué un pauseseguido de exita la cadena, lo que resultó en lo siguiente:

cmd /k C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm.exe "%1" /codebase \"%1\" & pause & exit

Esto funciona de maravilla: RegAsm se ejecuta en el archivo y muestra sus resultados, luego se muestra el mensaje "Presione cualquier tecla para continuar ...", luego la ventana del símbolo del sistema se cierra cuando se presiona una tecla.

PD Para otras personas que puedan estar interesadas, puede usar las siguientes entradas de archivo .reg para agregar una asociación de archivos dll a archivos .dll y luego una extensión de comando RegAsm (observe las comillas y barras invertidas):

[HKEY_CLASSES_ROOT\.dll]
"Content Type"="application/x-msdownload"
@="dllfile"

[HKEY_CLASSES_ROOT\dllfile]
@="Application Extension"

[HKEY_CLASSES_ROOT\dllfile\Shell\RegAsm]
@="Register Assembly"

[HKEY_CLASSES_ROOT\dllfile\Shell\RegAsm\command]
@="cmd /k C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\regasm.exe \"%1\" /codebase \"%1\" & pause & exit"

Ahora tengo un buen menú contextual para registrar un ensamblaje.

SNAFUBAR
fuente
4

Para ejecutar dos comandos al mismo tiempo, debe colocar un símbolo & (ampersand) entre los dos comandos. Al igual que:

color 0a & start chrome.exe

¡Salud!

PryroTech
fuente
4

Intento tener dos pings en la misma ventana, y es un comando en serie en la misma línea. Después de terminar el primero, ejecute el segundo comando.

La solución fue combinar con start /bun símbolo del sistema de Windows 7.

Comience como de costumbre, sin /b, e inicie en una ventana separada.

El comando utilizado para iniciar en la misma línea es:

start /b command1 parameters & command2 parameters

De cualquier manera, si desea analizar la salida, no recomiendo usar esto. Noté que la salida está codificada entre la salida de los comandos.

sdcxp
fuente
4

Bueno, tienes dos opciones: tuberías, o simplemente &:

DIR /S & START FILE.TXT

O,

tasklist | find "notepad.exe"

Piping ( |) es más para tomar la salida de un comando y ponerlo en otro. Y ( &) solo dice ejecutar esto y aquello.

PyDever
fuente
¿Podrías editar tu publicación para incluir alguna explicación de lo que hace &y |hace y en qué se diferencian? En este momento, las personas que no están familiarizadas con estos conceptos no pueden decidir por sí mismas cuál debe usarse en sus casos.
Mirek Długosz
Como yo era. Culpa mía. Editaré la publicación de inmediato. Lo aprecio.
PyDever
Debería ser "Findstr" en lugar de simplemente "Find"
Anu Shibin Joseph Raj
2

No, cd / && tree && echo %time%. El tiempo repetido es cuando se ejecuta el primer comando.

La tubería tiene algún problema, pero no es crítica mientras la gente sepa cómo funciona.

no es un nombre real
fuente
1

Un ejemplo más: por ejemplo, cuando usamos el gulp sistema de compilación, en lugar de

gulp - predeterminado> construir

gulp build - construir carpeta de compilación

gulp watch - iniciar la observación de archivos

gulp dist - construir dist-folder

Podemos hacer eso con una línea:

cd c:\xampp\htdocs\project & gulp & gulp watch
Mile Mijatović
fuente
1

Cuando intente usar o manipular variables en una línea, ¡tenga cuidado con su contenido! Por ejemplo, una variable como la siguiente

PATH=C:\Program Files (x86)\somewhere;"C:\Company\Cool Tool";%USERPROFILE%\AppData\Local\Microsoft\WindowsApps;

puede ocasionar muchos problemas imposibles de manejar si lo usa como %PATH%

  1. Los paréntesis de cierre terminan su declaración de grupo
  2. Las comillas dobles no te permiten usar %PATH% para manejar el problema de paréntesis
  3. ¿Y qué contendrá una variable referenciada como %USERPROFILE%?
V15I0N
fuente
2
¿Qué tiene esto que ver con ejecutar dos comandos en una línea en Windows CMD?
Peter Mortensen
1

Use el &símbolo en Windows para usar el comando en una línea

C:\Users\Arshdeep Singh>cd Desktop\PROJECTS\PYTHON\programiz & jupyter notebook

como en linux usamos,

touch thisfile ; ls -lstrh
Arshdeep Kharbanda
fuente
0

Sí hay. Es &.

&& ejecutará el comando 2 cuando el comando 1 esté completo siempre que no haya fallado.

& se ejecutará independientemente

هادی کشاورز Hadi Keshavarz
fuente
-2

Es simple: simplemente diferenciarlos con &&signos. Ejemplo:

echo "Hello World" && echo "GoodBye World".

"Goodbye World" se imprimirá después de "Hello World".

Rajan Dhanowa
fuente
66
Independientemente del hecho de que ya hay respuestas antiguas que muestran lo mismo, todavía no es del todo correcto. &&es un operador condicional , el siguiente comando solo se ejecuta cuando el primer comando tuvo éxito (errorlevel = 0)
jeb
por supuesto. es evidente si la persona quiere ejecutar dos comandos, esos dos serán correctos y, por lo tanto, todo irá bien
Rajan Dhanowa
1
Rajan: quiere decir "el siguiente comando solo se ejecuta si el primer comando tiene éxito".
Ivan
2
" Goodbye World se imprimirá después de Hello World " siempre que la impresión Hello Worldno haya fallado. como ha dicho @jeb, &&es condicional. &ejecuta comandos independientemente de si el anterior fue exitoso o no.
Pranav A.