Como executo dois comandos em uma linha no Windows CMD?

962

Quero executar dois comandos em um console do Windows CMD.

No Linux, eu faria assim

touch thisfile ; ls -lstrh

Como é feito no Windows?

flybywire
fonte

Respostas:

1321

Assim em todos os sistemas operacionais da Microsoft desde 2000, e ainda hoje em dia:

dir & echo foo

Se você deseja que o segundo comando seja executado apenas se o primeiro sair com êxito:

dir && echo foo

A sintaxe do único e comercial (&) para executar vários comandos em uma linha remonta ao Windows XP, Windows 2000 e algumas versões anteriores do NT. (4.0 pelo menos, de acordo com um comentarista aqui.)

Existem alguns outros pontos sobre isso que você encontrará rolando esta página.

Seguem-se dados históricos, para aqueles que o acharem educacional.

Antes disso, a sintaxe && era apenas um recurso do 4DOS de substituição de shell antes que esse recurso fosse adicionado ao interpretador de comandos da Microsoft.

No Windows 95, 98 e ME, você usaria o caractere de pipe:

dir | echo foo

No MS-DOS 5.0 e posterior, por meio de algumas versões anteriores do interpretador de comandos para Windows e NT, o separador de comando (não documentado) era o caractere 20 (Ctrl + T) que representarei com ^ T aqui.

dir ^T echo foo
djdanlib
fonte
26
Pelo menos até o NT 4.
Joey
17
Funciona no Windows 8.0 e 8.1 também.
MEMark
5
@ Fallenreaper, que também funciona no cmdprompt direto , então suponho que não seja um mau hábito entrar. :)
6
@ Fallenreaper Verifique se você está ciente da diferença prática entre os dois: Veja a resposta de Raihan abaixo.
Moshe Katz
8
Entendi. A&&B, B somente será executado se A for bem-sucedido, enquanto A&B será executado B após A, independentemente do resultado de A. Obrigado pela
atenção
579

Uma citação da documentação:

Usando vários comandos e símbolos de processamento condicional

Você pode executar vários comandos em uma única linha de comando ou script usando símbolos de processamento condicional. Quando você executa vários comandos com símbolos de processamento condicional, os comandos à direita do símbolo de processamento condicional atuam com base nos resultados do comando à esquerda do símbolo de processamento condicional.

Por exemplo, você pode querer executar um comando apenas se o comando anterior falhar. Ou, você pode querer executar um comando apenas se o comando anterior for bem-sucedido.

Você pode usar os caracteres especiais listados na tabela a seguir para passar vários comandos.

  • & [...]
    command1 & command2
    Use para separar vários comandos em uma linha de comando. Cmd.exe executa o primeiro comando e, em seguida, o segundo comando.

  • && [...]
    command1 && command2
    Use para executar o comando a seguir && somente se o comando que precede o símbolo for bem-sucedido. Cmd.exe executa o primeiro comando e, em seguida, executa o segundo comando somente se o primeiro comando for concluído com êxito.

  • || [...]
    command1 || command2
    Use para executar o comando a seguir || somente se o comando que precede || falha. Cmd.exe executa o primeiro comando e, em seguida, executa o segundo comando somente se o primeiro comando não foi concluído com êxito (recebe um código de erro maior que zero).

  • ( ) [...]
    (command1 & command2)
    Use para agrupar ou aninhar vários comandos.

  • ; or ,
    command1 parameter1;parameter2
    Use para separar os parâmetros de comando.

Raihan
fonte
41
Tente cmd /c "echo foo & echo bar".
Raihan #
2
vagrant up && vagrant sshfuncionou sem aspas no Windows 10. #
furman87
Obrigado! Eu não sabia sobre o singe &- o torna assíncrono e roda os dois em paralelo. Eu estava preso porque estava usando &&síncrono e só continua se o primeiro tiver êxito!
TetraDev 01/06
1
link da documentação quebrado, novo local technet.microsoft.com/en-us/library/bb490954.aspx
nkef 26/06/17
7
O @TetraDev &não torna os comandos assíncronos ou paralelos. command1 & command2será executado command2 após a command1 conclusão. O sucesso ou fracasso de command1é irrelevante.
bornfromanegg
74

&é o equivalente do Bash para ;(comandos de execução) e &&é o equivalente do Bash de &&(comandos de execução apenas quando o anterior não causou um erro).

manojlds
fonte
1
isso também é válido para csh, tcsh e muitos outros shells. Eu nunca vi ;antes no Linux
phuclv
10
@ LưuVĩnhPhúc em conchas no estilo sh, ;significa executar o primeiro comando, aguardar o término e executar o segundo comando. &significa executar o primeiro comando, colocá-lo em segundo plano e executar o segundo comando. Portanto, ambos os programas são iniciados simultaneamente. Observe que eles não estão combinando símbolos, eles estão arrastando símbolos para o primeiro comando; você pode iniciar um único comando em segundo plano progname &sem ter um segundo comando.
MM
25

Você pode usar & para executar comandos um após o outro. Exemplo:c:\dir & vim myFile.txt

scrappedcola
fonte
19

Se você deseja criar um atalho de cmd (por exemplo, na área de trabalho), adicione o parâmetro / k (/ k significa keep, / c fechará a janela):

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

Você pode usar a chamada para superar o problema de as variáveis ​​de ambiente serem avaliadas muito cedo - por exemplo,

set A=Hello & call echo %A%
SSi
fonte
1
Isso funciona apenas se a variável ainda não estiver configurada; nesse caso, ela echoimprime o valor antigo , não o novo valor. Pelo menos, é o que observo na minha caixa do Windows 7.
Craig M. Brandenburg
Eu uso o conjunto A = primeiro para garantir que a variável não esteja definida.
SSi
1
Um método melhor é usar a expansão atrasada ( setlocal EnableDelayedExpansionem um script ou cmd /v). Por exemplo: timeout 5 && cmd /v /c echo !TIME! && echo %TIME%.
Nick
5
Use ^ após o primeiro percentual para obter o novo valor: defina A = Olá e chame eco% ^ A%
Nicolas
9

Vários símbolos de processamento podem ser usados ​​ao executar vários comandos na mesma linha e podem levar ao redirecionamento de processamento em alguns casos, alterar a saída em outro caso ou simplesmente falhar. Um caso importante é colocar na mesma linha comandos que manipulam variáveis.

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

0 1

Como você vê no exemplo acima, quando comandos usando variáveis ​​são colocados na mesma linha, você deve usar a expansão atrasada para atualizar seus valores de variável. Se sua variável estiver indexada, use o comando CALL com modificadores %% para atualizar seu valor na mesma linha:

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

path5=C:\Users\UserName\AppData\Local\Temp\MyFile5
sambul35
fonte
exemplo dado não funcionou para mim, mas abaixo o fez:cmd /V:ON /c "set i=5 & set arg!i!=MyFile!i! & echo path!i!=%temp%\%arg!i!%"
sactiw
8

cmd /c ipconfig /all & Output.txt

Este comando executa o comando e abre o Output.txtarquivo em um único comando

dpp.2325
fonte
8

Então, eu estava tentando habilitar a tarefa específica de execução RegAsm(registrar montagem) em um menu de contexto. A questão que eu tinha era que o resultado surgiria e desapareceria antes que eu pudesse lê-lo. Por isso, tentei fazer o piping para Pause, o que não funciona quando o comando falha (como mencionado aqui O comando Pause não funciona no script .bat e o comando PAUSE no arquivo em lote PAUSE não funciona ). Então eu tentei, cmd /kmas isso deixa a janela aberta para mais comandos (eu só quero ler o resultado). Então, adicionei um pauseseguido de exità cadeia, resultando no seguinte:

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

Isso funciona como um encanto - o RegAsm é executado no arquivo e mostra seus resultados; em seguida, o prompt "Pressione qualquer tecla para continuar ..." é exibido e a janela do prompt de comando é fechada quando uma tecla é pressionada.

PS Para outros interessados, você pode usar as seguintes entradas de arquivo .reg para adicionar uma associação de arquivo dll a arquivos .dll e, em seguida, uma extensão de comando RegAsm (observe as aspas e as 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"

Agora eu tenho um bom menu de botão direito para registrar uma montagem.

SNAFUBAR
fonte
4

Para executar dois comandos ao mesmo tempo, você deve colocar um símbolo & (e comercial) entre os dois comandos. Igual a:

color 0a & start chrome.exe

Felicidades!

PryroTech
fonte
4

Eu tento ter dois pings na mesma janela e é um comando serial na mesma linha. Depois de terminar o primeiro, execute o segundo comando.

A solução foi combinar com start /bum prompt de comando do Windows 7.

Comece como de costume, sem /be inicie em uma janela separada.

O comando usado para iniciar na mesma linha é:

start /b command1 parameters & command2 parameters

De qualquer forma, se você deseja analisar a saída, não recomendo usar isso. Notei que a saída está embaralhada entre a saída dos comandos.

sdcxp
fonte
4

Bem, você tem duas opções: Tubulação ou apenas &:

DIR /S & START FILE.TXT

Ou,

tasklist | find "notepad.exe"

Piping ( |) é mais para pegar a saída de um comando e colocá-lo em outro. E ( &) está apenas dizendo, execute isso e aquilo.

PyDever
fonte
Você pode editar o seu post para incluir alguma explicação o que faz &e |fazer e como eles diferem, se em tudo? No momento, pessoas não familiarizadas com esses conceitos são incapazes de decidir por si mesmas qual delas deve ser usada em seus casos.
Mirek Długosz
Como eu era. Foi mal. Vou editar a postagem imediatamente. Aprecie isso.
PyDever 2/17/17
Deve ser "findstr" em vez de apenas "encontrar"
Anu Shibin Joseph Raj
2

Não, cd / && tree && echo %time%. A hora ecoada é quando o primeiro comando é executado.

A tubulação tem algum problema, mas não é crítica desde que as pessoas saibam como ela funciona.

notarealname
fonte
1

Mais um exemplo: por exemplo, quando usamos o gulpsistema de compilação, em vez de

gulp - padrão> compilar

gulp build - construir pasta de construção

gulp watch - inicie a observação de arquivos

gulp dist - constrói dist-folder

Podemos fazer isso com uma linha:

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

Ao tentar usar ou manipular variáveis ​​em uma linha, cuidado com o conteúdo delas! Por exemplo, uma variável como a seguinte

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

pode levar a muitos problemas imprevisíveis se você o usar como %PATH%

  1. Os parênteses de fechamento encerram sua declaração de grupo
  2. As aspas duplas não permitem que você use %PATH%para lidar com o problema de parênteses
  3. E o que conterá uma variável referenciada %USERPROFILE%?
V15I0N
fonte
2
O que isso tem a ver com a execução de dois comandos em uma linha no Windows CMD?
Peter Mortensen
1

Use o &símbolo no Windows para usar o comando em uma linha

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

como no linux usamos,

touch thisfile ; ls -lstrh
Arshdeep Kharbanda
fonte
0

Sim existe. É &.

&& executará o comando 2 quando o comando 1 estiver completo, desde que não falhe.

& será executado independentemente.

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

É simples: basta diferenciá-los com &&sinais. Exemplo:

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

"Goodbye World" será impresso após "Hello World".

Rajan Dhanowa
fonte
6
Independentemente do fato de que já existem respostas antigas que mostram o mesmo, ainda não está totalmente correto. &&é uma condicional operador, o próximo comando só é executado quando o primeiro comando sucedido (errorlevel = 0)
jeb
claro. É auto evidente se a pessoa quiser correr dois comandos aqueles dois será correta e, portanto, tudo vai correr bem
Rajan Dhanowa
1
Rajan: ele significa "o próximo comando só é executado se o primeiro comando for bem-sucedido".
23417 Ivan Ivan
2
"O adeus mundo será impresso depois do Hello World "Hello World não falhe. como @jeb disse, &&é condicional. &executa comandos independentemente se o anterior foi bem-sucedido ou não.
Pranav A.