Как запустить две команды в одной строке в Windows CMD?

962

Я хочу выполнить две команды в консоли Windows CMD.

В Linux я бы сделал это так

touch thisfile ; ls -lstrh

Как это делается в Windows?

ЭЛЕКТРОДИСТАНЦИОННАЯ СИСТЕМА УПРАВЛЕНИЯ
источник

Ответы:

1322

Подобно этому на всех ОС Microsoft с 2000 года и до сих пор хорош:

dir & echo foo

Если вы хотите, чтобы вторая команда выполнялась только в случае успешного завершения первой команды:

dir && echo foo

Синтаксис с одним амперсандом (&) для выполнения нескольких команд в одной строке восходит к Windows XP, Windows 2000 и некоторым более ранним версиям NT. (По крайней мере, 4.0, согласно одному комментатору здесь.)

Есть немало других моментов, которые вы найдете, прокручивая эту страницу вниз.

Исторические данные следуют, для тех, кто может найти это образовательным.

До этого синтаксис && был только функцией замены оболочки 4DOS до того, как эта функция была добавлена ​​в интерпретатор команд Microsoft.

В Windows 95, 98 и ME вы бы вместо этого использовали символ канала:

dir | echo foo

В MS-DOS 5.0 и более поздних версиях, в некоторых более ранних версиях интерпретатора команд для Windows и NT, (недокументированным) разделителем команд был символ 20 (Ctrl + T), который я буду обозначать здесь ^ T.

dir ^T echo foo
djdanlib
источник
26
По крайней мере, до NT 4.
Joey
17
Работает также на Win 8.0 и 8.1.
MEMark
5
@Fallenreaper, это работает и в прямом смысле, так что cmdя полагаю, что это не плохая привычка. :)
6
@Fallenreaper Убедитесь, что вы знаете о практической разнице между ними: см. Ответ Райхана ниже.
Моше Кац
8
Вас понял. A && B, B будет работать только в случае успеха A, тогда как A & B будет запускать B после A, независимо от того, каков будет результат A. Спасибо за внимание
Fallenreaper
580

Цитата из документации:

Использование нескольких команд и условной обработки символов

Вы можете запустить несколько команд из одной командной строки или сценария, используя условные символы обработки. При запуске нескольких команд с символами условной обработки команды справа от символа условной обработки действуют на основе результатов команды слева от символа условной обработки.

Например, вы можете выполнить команду только в случае сбоя предыдущей команды. Или вы можете запустить команду, только если предыдущая команда была успешной.

Вы можете использовать специальные символы, перечисленные в следующей таблице, для передачи нескольких команд.

  • & [...]
    command1 & command2
    Используется для разделения нескольких команд в одной командной строке. Cmd.exe запускает первую команду, а затем вторую команду.

  • && [...]
    command1 && command2
    Используйте для запуска команды после &&, только если команда, предшествующая символу, успешна. Cmd.exe запускает первую команду, а затем запускает вторую команду, только если первая команда выполнена успешно.

  • || [...]
    command1 || command2
    Используйте для запуска команды, следующей за || только если команда предшествует || выходит из строя. Cmd.exe запускает первую команду, а затем запускает вторую команду только в том случае, если первая команда не выполнена успешно (получает код ошибки больше нуля).

  • ( ) [...]
    (command1 & command2)
    Используйте для группировки или вложения нескольких команд.

  • ; or ,
    command1 parameter1;parameter2
    Используйте для разделения параметров команды.

Райхан
источник
41
Попробуй cmd /c "echo foo & echo bar".
Райхан
2
vagrant up && vagrant sshработал без кавычек на Windows 10.
furman87
Спасибо! Я не знал о Singe &- делает его асинхронным и работает одновременно. Я застрял, потому что я использовал &&с синхронно и продолжается, только если первый удастся!
TetraDev
1
ссылка на документацию не работает, новое местоположение technet.microsoft.com/en-us/library/bb490954.aspx
nkef
7
@TetraDev &не делает команды асинхронными или параллельными. command1 & command2будет работать command2 после command1 завершения Успех или неудача не command1имеет значения.
bornfromanegg
74

&является эквивалентом Bash для ;(команды запуска) и &&является эквивалентом Bash &&(команды запуска только тогда, когда предыдущая не вызвала ошибку).

manojlds
источник
1
это также верно для csh, tcsh и многих других оболочек. Я никогда не видел ;в Linux
phuclv
10
@ LưuVĩnhPhúc в оболочках в стиле sh, ;означает запуск первой команды, ожидание ее завершения, а затем выполнение второй команды. &означает выполнить первую команду, перевести ее в фоновый режим и запустить вторую команду. Таким образом, обе программы запускаются одновременно. Обратите внимание, что они не объединяют символы, они являются конечными символами первой команды; Вы можете запустить одну команду в фоновом режиме progname &без второй команды.
ММ
25

Вы можете использовать & для запуска команд одна за другой. Пример:c:\dir & vim myFile.txt

scrappedcola
источник
19

Если вы хотите создать ярлык cmd (например, на рабочем столе), добавьте параметр / k (/ k означает сохранить, / c закроет окно):

cmd /k echo hello && cd c:\ && cd Windows
Troodon-Mike
источник
16

Вы можете использовать call для решения проблемы оценки переменных среды слишком рано - например,

set A=Hello & call echo %A%
SSi
источник
1
Это работает, только если переменная еще не установлена, и в этом случае echoпечатает старый значение, а не новое значение. По крайней мере, это то, что я наблюдаю на моем Windows 7.
Крейг М. Бранденбург
Сначала я использую set A =, чтобы убедиться, что переменная не установлена.
SSi
1
Лучший способ - использовать отложенное расширение ( setlocal EnableDelayedExpansionв скрипте или cmd /v). Например: timeout 5 && cmd /v /c echo !TIME! && echo %TIME%.
Ник
5
Используйте ^ после первого процента, чтобы получить новое значение: set A = Hello & call echo% ^ A%
Nicolas
9

Ряд символов обработки может использоваться при выполнении нескольких команд в одной строке и может привести к перенаправлению обработки в некоторых случаях, изменению вывода в другом случае или просто к ошибке. Одним из важных случаев является размещение в одной строке команд, которые манипулируют переменными.

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

0 1

Как видно из приведенного выше примера, когда команды, использующие переменные, размещаются в одной строке, вы должны использовать отложенное расширение для обновления значений переменных. Если ваша переменная проиндексирована, используйте команду CALL с %% модификаторами, чтобы обновить ее значение в той же строке:

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

path5=C:\Users\UserName\AppData\Local\Temp\MyFile5
sambul35
источник
данный пример не сработал для меня, но ниже один cmd /V:ON /c "set i=5 & set arg!i!=MyFile!i! & echo path!i!=%temp%\%arg!i!%"
сработал
8

cmd /c ipconfig /all & Output.txt

Эта команда выполняет команду и открывает Output.txtфайл в одной команде

dpp.2325
источник
8

Итак, я пытался включить конкретную задачу запуска RegAsm(зарегистрировать сборку) из контекстного меню. Проблема, с которой я столкнулся, заключалась в том, что результат вспыхнет и исчезнет, ​​прежде чем я смог прочитать его. Поэтому я попытался передать по трубопроводу Pause, который не работает при сбое команды (как упоминалось здесь, команда Pause не работает в сценарии .bat, а здесь команда PAUSE для пакетного файла не работает ). Поэтому я попытался, cmd /kно это оставляет окно открытым для большего количества команд (я просто хочу прочитать результат). Поэтому я добавил pauseзатем exitк цепи, в результате чего в следующем:

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

Это работает как чудо - RegAsm запускает файл и показывает его результаты, затем отображается приглашение «Нажать любую клавишу для продолжения ...», а затем окно командной строки закрывается при нажатии клавиши.

PS Для других, кому это может быть интересно, вы можете использовать следующие записи файла .reg, чтобы добавить ассоциацию dllfile к файлам .dll и затем расширение команды RegAsm для этого (обратите внимание на экранированные кавычки и обратную косую черту):

[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"

Теперь у меня есть красивое меню, вызываемое правой кнопкой мыши, чтобы зарегистрировать сборку.

SNAFUBAR
источник
lifehacker.com/…
Энтон
4

Чтобы выполнить две команды одновременно, вы должны поместить символ & (амперсанд) между двумя командами. Вот так:

color 0a & start chrome.exe

Ура!

PryroTech
источник
4

Я пытаюсь иметь два пинга в одном окне, и это последовательная команда в одной строке. После окончания первого запуска второй команды.

Решением было объединиться с start /bкомандной строкой Windows 7.

Начните как обычно, без /b, и запустите в отдельном окне.

Команда, используемая для запуска в той же строке:

start /b command1 parameters & command2 parameters

В любом случае, если вы хотите проанализировать вывод, я не рекомендую использовать это. Я заметил, что вывод зашифрован между выводами команд.

sdcxp
источник
4

Ну, у вас есть два варианта: трубопровод или просто &:

DIR /S & START FILE.TXT

Или,

tasklist | find "notepad.exe"

Piping ( |) больше подходит для получения выходных данных одной команды и помещения их в другую. И ( &) просто говорит запустить это, и это.

PyDever
источник
Не могли бы вы отредактировать свой пост, включив в него некоторые объяснения, что делает &и что делает, и |чем они отличаются, если вообще отличаются? Прямо сейчас люди, не знакомые с этими понятиями, не могут сами решить, какой из них следует использовать в их случаях.
Мирек Длугош
Как я был. Виноват. Я буду редактировать пост немедленно. Ценить это.
PyDever
Должно быть «findstr» вместо просто «найти»
Ану Шибин Джозеф Радж
2

Нет, cd / && tree && echo %time%. Время отголоска - это время, когда выполняется первая команда.

У трубопровода есть некоторая проблема, но это не критично, пока люди знают, как это работает.

notarealname
источник
1

Еще один пример: например, когда мы используем систему gulpсборки, а не

gulp - по умолчанию> сборка

gulp build - build build-folder

gulp watch - начать просмотр файла

gulp dist - построить dist-folder

Мы можем сделать это одной строкой:

cd c:\xampp\htdocs\project & gulp & gulp watch
Миля Миятович
источник
1

Когда вы пытаетесь использовать или манипулировать переменными в одной строке, остерегайтесь их содержимого! Например, переменная, подобная следующей

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

может привести к множеству непредвиденных проблем, если вы используете его как %PATH%

  1. Закрывающие скобки завершают вашу групповую инструкцию
  2. Двойные кавычки не позволяют использовать %PATH%для решения проблемы скобок
  3. И что будет %USERPROFILE%содержать ссылочная переменная, такая как ?
V15I0N
источник
2
Какое это имеет отношение к запуску двух команд в одной строке в Windows CMD?
Питер Мортенсен
1

Используйте &символ в Windows, чтобы использовать команду в одной строке

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

как в Linux мы используем,

touch thisfile ; ls -lstrh
Аршдип Харбанда
источник
0

Да, есть. Это &.

&& выполнит команду 2, когда команда 1 будет выполнена, при условии, что она не завершилась неудачей.

& будет выполнять независимо.

هادی کشاورز Хади Кешаварз
источник
-2

Все просто: просто различайте их по &&знакам. Пример:

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

«Goodbye World» будет напечатан после «Hello World».

Раджан Дханова
источник
6
Независимо от того, что уже есть старые ответы, которые показывают то же самое, это все еще не совсем правильно. &&является условным оператором, следующая команда выполняется только тогда, когда первая команда выполнена успешно (errorlevel = 0)
jeb
конечно. само собой разумеется, если человек хочет выполнить две команды, эти две будут правильными, и, таким образом, все пойдет хорошо
Раджан Дханова
1
Раджан: он означает, что «следующая команда выполняется только в случае успеха первой команды».
Иван
2
« Goodbye World будет напечатан после Hello World », если печать Hello Worldне провалилась. как сказал @jeb, &&условно. &запускает команды независимо от того, был ли предыдущий успешным или нет.
Пранав А.