it-swarm.xyz

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

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

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

touch thisfile ; ls -lstrh

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

740
flybywire

Вот так на всех ОС Microsoft с 2000 года и до сих пор хорош:

dir & echo foo

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

dir && echo foo

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

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

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

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

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

dir | echo foo

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

dir ^T echo foo
1005
djdanlib

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

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

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

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

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

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

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

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

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

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

519
Raihan

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

65
manojlds

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

23
scrappedcola

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

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

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

set A=Hello & call echo %A%
11
SSi

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

@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
6
sambul35

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

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

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

5
SNAFUBAR

cmd /c ipconfig /all & Output.txt

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

5
dpp.2325

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

color 0a & start chrome.exe

Ура!

3
PryroTech

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

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

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

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

start /b command1 parameters & command2 parameters

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

3
sdcxp

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

DIR /S & START FILE.TXT

Или же,

tasklist | find "notepad.exe"

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

3
PyDever

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

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

1
notarealname

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

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

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

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

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

gulp - по умолчанию> build

gulp build - build build-folder

gulp watch - запустить просмотр файла

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

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

cd c:\xampp\htdocs\project & gulp & gulp watch
0
Mile Mijatovic

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

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

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

Это просто: просто дифференцируйте их с помощью символов &&. Пример: 

echo Hello World && echo GoodBye World

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

0
Rajan Dhanowa