Jak uruchomić dwa polecenia w jednym wierszu w CMD systemu Windows?

958

Chcę uruchomić dwa polecenia w konsoli CMD systemu Windows.

W Linuksie zrobiłbym to w ten sposób

touch thisfile ; ls -lstrh

Jak to się robi w systemie Windows?

Lecieć jak po sznurku
źródło

Odpowiedzi:

1317

Podobnie jak we wszystkich systemach operacyjnych Microsoft od 2000 roku, i nadal jest dobry:

dir & echo foo

Jeśli chcesz, aby drugie polecenie zostało wykonane tylko wtedy, gdy pierwsze zakończyło się pomyślnie:

dir && echo foo

Pojedyncza składnia ampersand (&) służąca do wykonywania wielu poleceń w jednym wierszu sięga systemu Windows XP, Windows 2000 i niektórych wcześniejszych wersji NT. (Przynajmniej 4.0, według jednego komentatora tutaj.)

Jest jeszcze kilka innych punktów na ten temat, które przewijają się w dół tej strony.

Dane historyczne dla tych, którzy mogą uznać je za edukacyjne.

Wcześniej składnia && była tylko funkcją wymiany powłoki 4DOS, zanim ta funkcja została dodana do interpretera poleceń Microsoft.

W systemach Windows 95, 98 i ME zamiast tego należy użyć znaku potoku:

dir | echo foo

W MS-DOS 5.0 i nowszych wersjach, w niektórych wcześniejszych wersjach interpretera poleceń dla Windows i NT, (nieudokumentowanym) separatorem poleceń był znak 20 (Ctrl + T), który będę tutaj reprezentował ^ T.

dir ^T echo foo
djdanlib
źródło
26
Przynajmniej do NT 4.
Joey
17
Działa również w systemach Win 8.0 i 8.1.
MEMark,
5
@Fallenreaper, który działa również w trybie cmdnatychmiastowym, więc przypuszczam, że nie jest to zły nawyk wchodzenia w to. :)
6
@Fallenreaper Upewnij się, że znasz praktyczną różnicę między nimi: Zobacz odpowiedź Raihan poniżej.
Moshe Katz
8
Mam cię. A i B, B będą działać tylko, jeśli A zakończy się powodzeniem, podczas gdy A i B uruchomią B po A, bez względu na wynik A. Dzięki za heads
upy
578

Cytat z dokumentacji:

Korzystanie z wielu poleceń i symboli przetwarzania warunkowego

Możesz uruchamiać wiele poleceń z jednego wiersza polecenia lub skryptu, używając symboli przetwarzania warunkowego. Po uruchomieniu wielu poleceń z symbolami przetwarzania warunkowego polecenia po prawej stronie symbolu przetwarzania warunkowego działają w oparciu o wyniki polecenia po lewej stronie symbolu przetwarzania warunkowego.

Na przykład możesz chcieć uruchomić polecenie tylko wtedy, gdy poprzednie polecenie nie powiedzie się. Lub możesz uruchomić polecenie tylko wtedy, gdy poprzednie polecenie zakończyło się powodzeniem.

Możesz użyć znaków specjalnych wymienionych w poniższej tabeli, aby przekazać wiele poleceń.

  • & [...]
    command1 & command2
    Służy do oddzielania wielu poleceń w jednym wierszu poleceń. Cmd.exe uruchamia pierwsze polecenie, a następnie drugie polecenie.

  • && [...]
    command1 && command2
    Służy do uruchamiania polecenia następującego po && tylko wtedy, gdy polecenie poprzedzające symbol zakończyło się powodzeniem. Cmd.exe uruchamia pierwsze polecenie, a następnie uruchamia drugie polecenie tylko wtedy, gdy pierwsze polecenie zakończy się pomyślnie.

  • || [...]
    command1 || command2
    Użyj, aby uruchomić polecenie następujące || tylko jeśli polecenie poprzedzające || zawodzi. Cmd.exe uruchamia pierwsze polecenie, a następnie uruchamia drugie polecenie tylko wtedy, gdy pierwsze polecenie nie zakończyło się pomyślnie (otrzymuje kod błędu większy niż zero).

  • ( ) [...]
    (command1 & command2)
    Służy do grupowania lub zagnieżdżania wielu poleceń.

  • ; or ,
    command1 parameter1;parameter2
    Służy do oddzielania parametrów poleceń.

Raihan
źródło
41
Spróbować cmd /c "echo foo & echo bar".
Raihan
2
vagrant up && vagrant sshdziałał bez cudzysłowów w systemie Windows 10.
furman87
Dzięki! Nie wiedziałem o singe &- czyni go asynchronicznym i działa równolegle. Utknąłem, ponieważ korzystałem &&z jest synchroniczne i kontynuuje tylko, jeśli pierwszy się powiedzie!
TetraDev
1
uszkodzony link do dokumentacji, nowa lokalizacja technet.microsoft.com/en-us/library/bb490954.aspx
nkef
7
@TetraDev &nie czyni poleceń asynchronicznymi ani równoległymi. command1 & command2uruchomi się command2 po command1 zakończeniu. Sukces lub porażka nie command1ma znaczenia.
bornfromanegg
74

&jest odpowiednikiem Bash dla ;(uruchom polecenia) i &&jest odpowiednikiem Bash &&(uruchom polecenia tylko wtedy, gdy poprzednie nie spowodowało błędu).

manojlds
źródło
1
dotyczy to również csh, tcsh i wielu innych powłok. Nigdy wcześniej nie widziałem ;w Linuksie
phuclv
10
@ LưuVĩnhPhúc w powłokach typu sh, ;oznacza uruchomienie pierwszego polecenia, poczekaj na jego zakończenie, a następnie uruchom drugie polecenie. &oznacza uruchomienie pierwszego polecenia, umieszczenie go w tle i uruchomienie drugiego polecenia. Oba programy uruchamiają się jednocześnie. Zauważ, że nie łączą one symboli, lecz kończą się symbolami do pierwszego polecenia; możesz uruchomić pojedyncze polecenie w tle progname &bez drugiego polecenia.
MM
25

Możesz używać & do uruchamiania poleceń jeden po drugim. Przykład:c:\dir & vim myFile.txt

złom
źródło
19

Jeśli chcesz utworzyć skrót cmd (na przykład na pulpicie) dodaj parametr / k (/ k oznacza zachowaj, / c zamknie okno):

cmd /k echo hello && cd c:\ && cd Windows
TroodoN-Mike
źródło
16

Możesz użyć wywołania, aby rozwiązać problem zbyt wczesnej oceny zmiennych środowiskowych - np

set A=Hello & call echo %A%
SSi
źródło
1
Działa to tylko wtedy, gdy zmienna nie jest jeszcze ustawiona, w którym to przypadku echowypisuje starą wartość, a nie nową. Przynajmniej to obserwuję na moim pudełku Windows 7.
Craig M. Brandenburg
Używam set A = najpierw, aby upewnić się, że zmienna nie jest ustawiona.
SSi
1
Lepszym sposobem jest użycie opóźnionego rozszerzenia ( setlocal EnableDelayedExpansionw skrypcie lub cmd /v). Na przykład: timeout 5 && cmd /v /c echo !TIME! && echo %TIME%.
Nick
5
Użyj ^ po pierwszym procencie, aby uzyskać nową wartość: ustaw A = Witaj i wywołaj echo% ^ A%
Nicolas
9

Szereg przetwarzania symboli może być używany podczas uruchamiania kilku poleceń na tej samej linii, co może prowadzić do przekierowania przetwarzania w niektórych przypadkach zmiany wyjście w innym przypadku, lub po prostu zawodzą. Jednym ważnym przypadkiem jest umieszczenie w tym samym poleceniu linii, które manipuluje zmiennymi.

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

0 1

Jak widać w powyższym przykładzie, gdy polecenia korzystające ze zmiennych są umieszczone w tym samym wierszu, należy użyć opóźnionego rozwinięcia, aby zaktualizować wartości zmiennych. Jeśli twoja zmienna jest indeksowana, użyj polecenia CALL z modyfikatorami %%, aby zaktualizować jej wartość w tym samym wierszu:

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

path5=C:\Users\UserName\AppData\Local\Temp\MyFile5
sambul35
źródło
podany przykład nie działał dla mnie, ale poniżej jeden cmd /V:ON /c "set i=5 & set arg!i!=MyFile!i! & echo path!i!=%temp%\%arg!i!%"
działał
8

cmd /c ipconfig /all & Output.txt

To polecenie wykonuje polecenie i otwiera Output.txtplik w jednym poleceniu

dpp.22525
źródło
8

Próbowałem więc włączyć określone zadanie uruchamiania RegAsm(rejestracja zestawu) z menu kontekstowego. Problem polegał na tym, że wynik migał i znikał, zanim mogłem go przeczytać. Więc próbowałem potokowania do Pause, który nie działa, gdy polecenie nie powiedzie się (jak wspomniano tutaj polecenie Wstrzymaj nie działa w skrypcie .bat i tutaj polecenie pliku wsadowego PAUSE nie działa ). Więc próbowałem, cmd /kale to pozostawia otwarte okno na więcej poleceń (chcę tylko przeczytać wynik). Dlatego dodaje się pausenastępnie exitdo sieci, co prowadzi do następujących:

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

Działa to jak urok - RegAsm uruchamia się na pliku i pokazuje jego wyniki, a następnie pojawia się monit „Naciśnij dowolny klawisz, aby kontynuować ...”, a okno wiersza polecenia zamyka się po naciśnięciu klawisza.

PS W przypadku innych osób, które mogą być zainteresowane, możesz użyć następujących wpisów pliku .reg, aby dodać skojarzenie pliku dll do plików .dll, a następnie rozszerzenie polecenia RegAsm (zwróć uwagę na cytowane znaki cudzysłowu i ukośniki odwrotne):

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

Teraz mam ładne menu prawym przyciskiem myszy, aby zarejestrować zespół.

SNAFUBAR
źródło
4

Aby wykonać dwa polecenia jednocześnie, musisz umieścić symbol & (ampersand) między tymi dwoma poleceniami. Tak jak:

color 0a & start chrome.exe

Twoje zdrowie!

PryroTech
źródło
4

Próbuję mieć dwa pingi w tym samym oknie i jest to polecenie szeregowe w tym samym wierszu. Po zakończeniu pierwszego uruchom drugie polecenie.

Rozwiązaniem było połączenie z start /bwierszem poleceń systemu Windows 7.

Zacznij jak zwykle bez /bi uruchom w osobnym oknie.

Polecenie użyte do uruchomienia w tym samym wierszu to:

start /b command1 parameters & command2 parameters

W każdym razie, jeśli chcesz przeanalizować dane wyjściowe, nie polecam tego używać. Zauważyłem, że dane wyjściowe są zakodowane między danymi wyjściowymi poleceń.

sdcxp
źródło
4

Masz dwie opcje: orurowanie lub po prostu &:

DIR /S & START FILE.TXT

Lub,

tasklist | find "notepad.exe"

Piping ( |) służy bardziej do pobierania danych wyjściowych jednego polecenia i umieszczania go w innym. I ( &) mówi tylko „uruchom to i tamto”.

PyDever
źródło
Czy możesz edytować swój post, aby zawierać pewne wyjaśnienie co robi &i |robić i jak różnią się one, jeśli w ogóle? W tej chwili ludzie niezaznajomieni z tymi pojęciami nie są w stanie samodzielnie zdecydować, które z nich należy zastosować w ich przypadkach.
Mirek Długosz
Jak ja byłem. Mój błąd. Natychmiast zmienię post. Doceniam to.
PyDever
Powinno być „findstr” zamiast po prostu „find”
Anu Shibin Joseph Raj
2

Nie cd / && tree && echo %time%. Czas echa jest w chwili wykonania pierwszego polecenia.

Rurociągi mają pewien problem, ale nie są krytyczne, dopóki ludzie wiedzą, jak to działa.

notarealname
źródło
1

Jeszcze jeden przykład: na przykład, gdy używamy gulpsystemu kompilacji zamiast

gulp - domyślnie> build

gulp build - build-build-folder

gulp watch - rozpocznij oglądanie plików

gulp dist - buduj folder dist

Możemy to zrobić za pomocą jednej linii:

cd c:\xampp\htdocs\project & gulp & gulp watch
Mile Mijatović
źródło
1

Kiedy próbujesz używać lub manipulować zmiennymi w jednym wierszu, strzeż się ich zawartości! Np. Zmienna taka jak poniżej

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

może powodować wiele nieprzyjemnych problemów, jeśli użyjesz go jako %PATH%

  1. Nawiasy zamykające kończą instrukcję grupy
  2. Podwójne cudzysłowy nie pozwalają %PATH%na obsługę problemu z nawiasami
  3. A co będzie %USERPROFILE%zawierać zmienna, do której istnieje odwołanie ?
V15I0N
źródło
2
Co to ma wspólnego z uruchamianiem dwóch poleceń w jednym wierszu w CMD systemu Windows?
Peter Mortensen,
0

Tak jest. Jest &.

&& wykona polecenie 2 po zakończeniu polecenia 1, pod warunkiem, że nie zakończyło się ono niepowodzeniem.

& wykona się niezależnie.

هادی کشاورز Hadi Keshavarz
źródło
0

Użyj &symbolu w systemie Windows, aby użyć polecenia w jednym wierszu

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

jak w Linuksie, którego używamy,

touch thisfile ; ls -lstrh
Arshdeep Kharbanda
źródło
-2

To proste: wystarczy odróżnić je &&znakami. Przykład:

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

„Goodbye World” zostanie wydrukowany po „Hello World”.

Rajan Dhanowa
źródło
6
Niezależnie od tego, że istnieją już stare odpowiedzi, które pokazują to samo, nadal nie jest całkiem poprawne. &&jest operatorem warunkowym , następne polecenie jest wykonywane tylko wtedy, gdy pierwsze polecenie powiodło się (poziom błędu = 0)
jeb
oczywiście. to oczywiste, że jeśli ktoś chce uruchomić dwa polecenia, te dwa będą poprawne, a zatem wszystko pójdzie dobrze
Rajan Dhanowa
1
Rajan: ma na myśli „następne polecenie jest wykonywane tylko wtedy, gdy pierwsze polecenie się powiedzie”.
Ivan
2
Goodbye World zostanie wydrukowany po Hello World ” pod warunkiem, że drukowanie Hello Worldnie zakończy się niepowodzeniem. jak powiedział @jeb, &&jest warunkowe. &uruchamia polecenia niezależnie od tego, czy poprzednie zakończyło się powodzeniem, czy nie.
Pranav A.