Як запустити дві команди в одному рядку в Windows CMD?


958

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

В Linux я б це робив так

touch thisfile ; ls -lstrh

Як це робиться в Windows?

Відповіді:


1317

Як це робиться на всіх операційних системах Microsoft починаючи з 2000 року і досі добре:

dir & echo foo

Якщо ви хочете, щоб друга команда виконувалася лише в тому випадку, якщо перша успішно завершилася:

dir && echo foo

Єдиний синтаксис ampersand (&) для виконання декількох команд в одному рядку повертається до Windows XP, Windows 2000 та деяких попередніх версій NT. (4,0 принаймні, за даними одного з коментаторів тут.)

З цього приводу існує досить багато інших пунктів, які ви можете прокрутити по цій сторінці.

Історичні дані випливають для тих, хто вважає це навчальним.

До цього синтаксис && був лише функцією заміни оболонки 4DOS до того, як ця функція була додана до інтерпретатора команд Microsoft.

У Windows 95, 98 та ME ви замість цього використовуєте символ "pipe":

dir | echo foo

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

dir ^T echo foo

26
Принаймні вниз до NT 4.
Joey

17
Працює і на програмах Win 8.0 та 8.1.
ПАМ’ЯТЬ

5
@Fallenreaper, це працює і в прямому cmdпідказці, тому я вважаю, що це не погана звичка потрапляти. :)

6
@Fallenreaper Переконайтеся, що ви знаєте практичну різницю між ними: Дивіться відповідь Райхана нижче.
Моше Кац

8
Зрозумів. A&B, B працює лише в тому випадку, якщо A успішний, тоді як A & B буде B після A, незалежно від результату A. Дякую за голову вгору
Fallenreaper

578

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

Використання декількох команд та умовних символів обробки

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

Наприклад, ви можете запустити команду, лише якщо попередня команда не працює. Або ви можете запустити команду, лише якщо попередня команда була успішною.

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

  • & [...]
    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

Дякую! Я не знав про синге &- робить це асинхронним і виконує обоє паралельно. Я застряг, тому що я використовував &&синхронно і продовжується лише у випадку успіху першого!
TetraDev

1
документація посилання зламана, нове місце technet.microsoft.com/en-us/library/bb490954.aspx
nkef

7
@TetraDev &не робить команди асинхронними або паралельними. command1 & command2запуститься command2 після command1 завершення. Успіх чи невдача не command1має значення.
bornfromanegg

74

&є еквівалентом Bash для ;(запускати команди) і &&є еквівалентом Bash &&(виконувати команди лише тоді, коли попередні не спричинили помилку).


1
це також стосується csh, tcsh та багатьох інших оболонок. Я ніколи не бачив ;в Linux
phuclv

10
@ LưuVĩnhPhúc в шкаралупах стилю sh, ;означає запустити першу команду, дочекатися її завершення, а потім виконати другу команду. &означає запустити першу команду, поставити її на другий план і виконати другу команду. Тож обидві програми запускаються одночасно. Зауважте, що це не комбінуючі символи, вони є символами, що відносяться до першої команди; ви можете запустити одну команду у фоновому режимі, progname &не маючи другої команди.
ММ


19

Якщо ви хочете створити ярлик cmd (наприклад, на робочому столі), додайте параметр / k (/ k означає зберегти, / c закриє вікно):

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

16

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

set A=Hello & call echo %A%

1
Це працює лише в тому випадку, якщо змінна ще не встановлена, і в цьому випадку echoвиводиться старе значення, а не нове значення. Принаймні, це те, що я спостерігаю у своєму вікні Windows 7.
Крейг М. Бранденбург

Я використовую set A = спочатку, щоб переконатися, що змінна не встановлена.
SSi

1
Кращий метод - використовувати уповільнене розширення ( setlocal EnableDelayedExpansionу сценарії чи cmd /v). Наприклад: timeout 5 && cmd /v /c echo !TIME! && echo %TIME%.
Нік

5
Використовуйте ^ після першого відсотка, щоб отримати нове значення: встановіть 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

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файл в одній команді


8

Отже, я намагався включити конкретне завдання запуску RegAsm(складання реєстру) з контекстного меню. Проблема в мене полягала в тому, що результат спалахне і згасне, перш ніж я зможу його прочитати. Тож я спробував piping до Pause, який не працює, коли команда не спрацьовує (як згадувалося тут, команда "Пауза" не працює в .bat скрипті і тут команда Batch file 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"

Тепер у мене є гарне меню правою кнопкою миші, щоб зареєструвати збірку.



4

Для того, щоб виконати дві команди одночасно, ви повинні поставити символ & (ampersand) між двома командами. Так:

color 0a & start chrome.exe

Ура!


4

Я намагаюся мати два пінгви в одному вікні, і це послідовна команда в одному рядку. Закінчивши першу, запустіть другу команду.

Рішення полягало в поєднанні з start /bкомандним рядком Windows 7.

Почніть як завжди, без /b, і запустіть в окремому вікні.

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

start /b command1 parameters & command2 parameters

У будь-якому випадку, якщо ви хочете проаналізувати вихід, я не рекомендую використовувати це. Я помітив, що вихід між кодом команд.


4

Ну, у вас є два варіанти: трубопровід, або просто &:

DIR /S & START FILE.TXT

Або,

tasklist | find "notepad.exe"

Piping ( |) більше призначений для отримання результатів однієї команди та введення її в іншу. І ( &) просто говорить запустити це, і це.


Чи не могли б ви змінити свій пост , щоб включити якесь - то пояснення , що це &і |робити , і як вони відрізняються, якщо взагалі? Зараз люди, незнайомі з цими поняттями, не в змозі самі вирішити, який із них слід використовувати.
Mirek Długosz

Як я був. Моє ліжко. Я відредагую пост негайно. Оцініть це.
PyDever

Потрібно бути "findstr" замість просто "знайти"
Ану Шибін Джозеф Радж

2

Ні, cd / && tree && echo %time%. Час лунає, коли виконується перша команда.

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


1

Ще один приклад: Наприклад, коли ми використовуємо систему gulpзбирання замість

gulp - за замовчуванням> збірка

gulp build - побудувати збірку-папку

gulp watch - запустити перегляд файлів

gulp dist - побудувати dist-папку

Ми можемо це зробити одним рядком:

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%?

2
Що це стосується виконання двох команд в одному рядку в Windows CMD?
Пітер Мортенсен


0

Використовуйте &символ у Windows для використання команди в одному рядку

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

як у Linux, який ми використовуємо,

touch thisfile ; ls -lstrh

-2

Це просто: просто розмежуйте їх за &&знаками. Приклад:

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

"Goodbye World" буде надруковано після "Hello World".


6
Незалежно від того, що вже є старі відповіді, які показують те саме, це все ще не зовсім коректно. &&є умовним оператором, наступна команда виконується лише тоді, коли перша команда вдалася (errorlevel = 0)
jeb

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

1
Раджан: він означає "наступна команда виконується лише в тому випадку, коли перша команда буде успішною".
Іван

2
" Світ прощань буде надрукований після Hello World " за умови, що друк Hello Worldне пройшов. як сказав @jeb, &&це умовно. &виконує команди незалежно від того, попередній був успішним чи ні.
Пранов А.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.