Как запустить две команды в одной строке в Windows CMD? - PullRequest
800 голосов
/ 08 ноября 2011

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

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

touch thisfile ; ls -lstrh

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

Ответы [ 17 ]

1088 голосов
/ 08 ноября 2011

Подобно этому на всех ОС 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
532 голосов
/ 08 ноября 2011

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

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

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

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

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

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

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

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

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

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

69 голосов
/ 08 ноября 2011

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

24 голосов
/ 08 ноября 2011

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

17 голосов
/ 12 ноября 2013

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

cmd /k echo hello && cd c:\ && cd Windows
13 голосов
/ 13 марта 2016

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

set A=Hello & call echo %A%
7 голосов
/ 03 августа 2016

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

@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
7 голосов
/ 26 января 2015

Итак, я пытался включить конкретную задачу запуска RegAsm (регистрация сборки) из контекстного меню. Проблема, с которой я столкнулся, заключалась в том, что результат вспыхнет и исчезнет, ​​прежде чем я смог прочитать его. Поэтому я попытался передать по трубопроводу на 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 запускает файл и показывает его результаты, затем отображается приглашение «Нажать любую клавишу для продолжения ...», а затем окно командной строки закрывается при нажатии клавиши.

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"

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

6 голосов
/ 16 апреля 2014

cmd /c ipconfig /all & Output.txt

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

4 голосов
/ 18 марта 2017

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

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

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

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

start /b command1 parameters & command2 parameters

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

...