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

539

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

В Linux я бы сделал это следующим образом: touch thisfile ; ls -lstrh.

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

Теги:
batch-file
cmd
command-line

16 ответов

696
Лучший ответ

Как и во всех Microsoft-операционных системах с 2000 года, и сегодня все еще хорошо:

dir & echo foo

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

dir && echo foo

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

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

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

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

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

dir | echo foo

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

dir ^T echo foo
  • 25
    По крайней мере, до NT 4.
  • 16
    Работает также на Win 8.0 и 8.1.
Показать ещё 15 комментариев
437

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

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

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

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

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

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

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

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

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

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

  • 36
    Попробуйте cmd /c "echo foo & echo bar" .
  • 2
    Да, это работает с кавычками!
Показать ещё 4 комментария
59

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

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

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

14

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

cmd /k echo hello && cd c:\ && cd Windows
6

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

set A=Hello & call echo %A%
  • 1
    Это работает, только если переменная еще не установлена, и в этом случае echo выводит старое значение, а не новое значение. По крайней мере, это то, что я наблюдаю на моем Windows 7.
  • 0
    Сначала я использую set A =, чтобы убедиться, что переменная не установлена.
Показать ещё 2 комментария
4

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

@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
  • 0
    данный пример не работает для меня, но ниже один сделал: cmd /V:ON /c "set i=5 & set arg!i!=MyFile!i! & echo path!i!=%temp%\%arg!i!%"
4

cmd /c ipconfig /all & Output.txt

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

3

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

color 0a & start chrome.exe

Ура!

3

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

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

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

P.S. Для других, которым может быть интересно, вы можете использовать следующие записи в файле .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"

Теперь у меня есть приятное контекстное меню для регистрации сборки.

2

У вас есть два варианта: Piping или просто &:

DIR /S & START FILE.TXT

Или

tasklist | find "notepad.exe"

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

  • 0
    Не могли бы вы отредактировать свой пост, чтобы включить некоторые объяснения, что делает & и | и чем они отличаются, если вообще? Прямо сейчас люди, незнакомые с этими понятиями, не могут сами решить, какой из них следует использовать в их случаях.
  • 0
    Как я был. Виноват. Я буду редактировать пост немедленно. Ценить это.
2

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

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

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

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

start /b command1 parameters & command2 parameters

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

1

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

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

0

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

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

может привести к большому количеству неприятностей, если вы используете его как %PATH%

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

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

echo Hello World && echo GoodBye World

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

  • 3
    Независимо от того, что уже есть старые ответы, которые показывают то же самое, это все еще не совсем правильно. && является условным оператором, следующая команда выполняется только тогда, когда первая команда выполнена успешно (errorlevel = 0)
  • 0
    конечно. само собой разумеется, если человек хочет выполнить две команды, эти две будут правильными, и, таким образом, все пойдет хорошо
Показать ещё 2 комментария
0

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

gulp - default > build

gulp build - построить сборку

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

gulp dist - создать папку dist

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

cd c:\xampp\htdocs\project & gulp & gulp watch

Ещё вопросы

Сообщество Overcoder
Наверх
Меню