Làm cách nào để chạy hai lệnh trong một dòng trong Windows CMD?


962

Tôi muốn chạy hai lệnh trong bảng điều khiển Windows CMD.

Trong Linux tôi sẽ làm như thế này

touch thisfile ; ls -lstrh

Làm thế nào nó được thực hiện trên Windows?

Câu trả lời:


1321

Giống như điều này trên tất cả các hệ điều hành Microsoft từ năm 2000, và vẫn còn tốt cho đến ngày nay:

dir & echo foo

Nếu bạn muốn lệnh thứ hai chỉ thực thi nếu lệnh đầu tiên thoát thành công:

dir && echo foo

Cú pháp ký hiệu đơn (&) để thực thi nhiều lệnh trên một dòng sẽ quay trở lại Windows XP, Windows 2000 và một số phiên bản NT trước đó. (Ít nhất 4.0, theo một người bình luận ở đây.)

Có khá nhiều điểm khác về điều này mà bạn sẽ thấy khi cuộn xuống trang này.

Dữ liệu lịch sử sau đây, cho những người có thể tìm thấy nó mang tính giáo dục.

Trước đó, cú pháp && chỉ là một tính năng của 4DOS thay thế shell trước khi tính năng đó được thêm vào trình thông dịch lệnh của Microsoft.

Trong Windows 95, 98 và ME, bạn sẽ sử dụng ký tự ống thay thế:

dir | echo foo

Trong MS-DOS 5.0 trở lên, thông qua một số phiên bản Windows và NT trước đó của trình thông dịch lệnh, dấu tách lệnh (không có tài liệu) là ký tự 20 (Ctrl + T) mà tôi sẽ đại diện cho ^ T ở đây.

dir ^T echo foo

26
Ít nhất là xuống NT 4.
Joey

17
Hoạt động trên Win 8.0 và 8.1 là tốt.
MEMark

5
@Fallenreaper, cũng hoạt động theo cmddấu nhắc thẳng , vì vậy tôi cho rằng đó không phải là một thói quen xấu. :)

6
@Fallenreaper Hãy chắc chắn rằng bạn biết về sự khác biệt thực tế giữa hai điều này: Xem câu trả lời của Raihan bên dưới.
Moshe Katz

8
Có ya. A && B, B sẽ chỉ chạy nếu A thành công, trong khi A & B sẽ chạy B sau A, bất kể kết quả của A là gì. Cảm ơn vì đã ngẩng cao đầu
Fallenreaper

579

Một trích dẫn từ các tài liệu:

Sử dụng nhiều lệnh và ký hiệu xử lý có điều kiện

Bạn có thể chạy nhiều lệnh từ một dòng lệnh hoặc tập lệnh bằng các ký hiệu xử lý có điều kiện. Khi bạn chạy nhiều lệnh với các ký hiệu xử lý có điều kiện, các lệnh ở bên phải của ký hiệu xử lý có điều kiện hoạt động dựa trên kết quả của lệnh ở bên trái của ký hiệu xử lý có điều kiện.

Ví dụ, bạn có thể chỉ muốn chạy một lệnh nếu lệnh trước đó không thành công. Hoặc, bạn có thể muốn chạy lệnh chỉ khi lệnh trước thành công.

Bạn có thể sử dụng các ký tự đặc biệt được liệt kê trong bảng sau để truyền nhiều lệnh.

  • & [...]
    command1 & command2
    Sử dụng để phân tách nhiều lệnh trên một dòng lệnh. Cmd.exe chạy lệnh đầu tiên và sau đó là lệnh thứ hai.

  • && [...]
    command1 && command2
    Sử dụng để chạy lệnh sau && chỉ khi lệnh trước biểu tượng thành công. Cmd.exe chạy lệnh đầu tiên, và sau đó chỉ chạy lệnh thứ hai nếu lệnh đầu tiên hoàn thành thành công.

  • || [...]
    command1 || command2
    Sử dụng để chạy lệnh sau | | chỉ khi lệnh trước | | thất bại Cmd.exe chạy lệnh đầu tiên và sau đó chỉ chạy lệnh thứ hai nếu lệnh đầu tiên không hoàn thành thành công (nhận được mã lỗi lớn hơn 0).

  • ( ) [...]
    (command1 & command2)
    Sử dụng để nhóm hoặc lồng nhiều lệnh.

  • ; or ,
    command1 parameter1;parameter2
    Sử dụng để tách các tham số lệnh.


41
Hãy thử cmd /c "echo foo & echo bar".
Raihan

2
vagrant up && vagrant sshlàm việc mà không có dấu ngoặc kép trên Windows 10.
furman87

Cảm ơn! Tôi không biết về singe &- làm cho nó không đồng bộ và chạy cả hai song song. Tôi đã bị mắc kẹt bởi vì tôi đang sử dụng &&với đồng bộ và chỉ tiếp tục nếu lần đầu tiên thành công!
TetraDev

1
liên kết tài liệu bị hỏng, vị trí mới technet.microsoft.com/en-us/l
Library / bb490954.aspx

7
@TetraDev &không làm cho các lệnh không đồng bộ hoặc song song. command1 & command2sẽ chạy command2 sau khi command1 đã hoàn thành. Thành công hay thất bại command1là không liên quan.
sinhfromanegg

74

&là Bash tương đương với ;(các lệnh chạy) và &&tương đương với Bash &&(chỉ chạy các lệnh trước đó khi chưa gây ra lỗi).


1
Điều này cũng đúng với csh, tcsh và nhiều shell khác. Tôi chưa từng thấy ;trước đây trong Linux
phuclv

10
@ LưuViênPhúc trong shell kiểu sh, ;nghĩa là chạy lệnh đầu tiên, đợi cho nó kết thúc, sau đó chạy lệnh thứ hai. &nghĩa là chạy lệnh đầu tiên, đặt nó vào nền và chạy lệnh thứ hai. Thế là cả hai chương trình ra mắt cùng lúc. Lưu ý rằng đây không phải là biểu tượng kết hợp, chúng là biểu tượng kéo theo lệnh đầu tiên; bạn có thể khởi chạy một lệnh đơn trong nền progname &mà không cần lệnh thứ hai.
MM

25

Bạn có thể sử dụng & để chạy từng lệnh một. Thí dụ:c:\dir & vim myFile.txt


19

Nếu bạn muốn tạo một phím tắt cmd (ví dụ trên máy tính để bàn của bạn), tham số add / k (/ k có nghĩa là giữ, / c sẽ đóng cửa sổ):

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

16

Bạn có thể sử dụng lệnh gọi để khắc phục vấn đề biến môi trường được đánh giá quá sớm - ví dụ:

set A=Hello & call echo %A%

1
Điều này chỉ hoạt động nếu biến chưa được đặt, trong trường hợp đó, echoin ra giá trị , không phải giá trị mới. Ít nhất, đây là những gì tôi quan sát được trên hộp Windows 7 của mình.
Craig M. Brandenburg

Tôi sử dụng tập A = đầu tiên để đảm bảo biến không được đặt.
SSi

1
Một phương pháp tốt hơn là sử dụng mở rộng bị trì hoãn ( setlocal EnableDelayedExpansiontrong một tập lệnh hoặc cmd /v). Ví dụ : timeout 5 && cmd /v /c echo !TIME! && echo %TIME%.
Nick

5
Sử dụng ^ sau phần trăm đầu tiên để nhận giá trị mới: đặt A = Xin chào và gọi echo% ^ A%
Nicolas

9

Một số ký hiệu xử lý có thể được sử dụng khi chạy một số lệnh trên cùng một dòng và có thể dẫn đến chuyển hướng xử lý trong một số trường hợp, thay đổi đầu ra trong trường hợp khác hoặc chỉ bị lỗi. Một trường hợp quan trọng là đặt trên cùng một dòng lệnh thao tác các biến.

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

0 1

Như bạn thấy trong ví dụ trên, khi các lệnh sử dụng biến được đặt trên cùng một dòng, bạn phải sử dụng mở rộng trễ để cập nhật giá trị biến của mình. Nếu biến của bạn được lập chỉ mục, hãy sử dụng lệnh CALL với công cụ sửa đổi %% để cập nhật giá trị của nó trên cùng một dòng:

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

path5=C:\Users\UserName\AppData\Local\Temp\MyFile5

ví dụ đã không làm việc cho tôi nhưng dưới đây đã làm:cmd /V:ON /c "set i=5 & set arg!i!=MyFile!i! & echo path!i!=%temp%\%arg!i!%"
sactiw

8

cmd /c ipconfig /all & Output.txt

Lệnh này thực thi lệnh và mở Output.txttệp trong một lệnh duy nhất


8

Vì vậy, tôi đã cố gắng kích hoạt tác vụ cụ thể là chạy RegAsm(đăng ký lắp ráp) từ menu ngữ cảnh. Vấn đề tôi có là kết quả sẽ sáng lên và biến mất trước khi tôi có thể đọc nó. Vì vậy, tôi đã thử đường ống đến Pause, không hoạt động khi lệnh thất bại (như đã đề cập ở đây Lệnh tạm dừng không hoạt động trong tập lệnh .bat và ở đây lệnh Batch tệp PAUSE không hoạt động ). Vì vậy, tôi đã cố gắng cmd /knhưng điều đó khiến cửa sổ mở cho nhiều lệnh hơn (tôi chỉ muốn đọc kết quả). Vì vậy, tôi đã thêm một chuỗi pausetheo sau exitvào chuỗi, kết quả như sau:

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

Điều này hoạt động giống như một bùa mê - RegAsm chạy trên tệp và hiển thị kết quả của nó, sau đó lời nhắc "Nhấn phím bất kỳ để tiếp tục ..." được hiển thị, sau đó cửa sổ nhắc lệnh đóng khi nhấn phím.

PS Đối với những người khác có thể quan tâm, bạn có thể sử dụng các mục nhập tệp .reg sau đây để thêm liên kết dllfile vào các tệp dll và sau đó là phần mở rộng lệnh RegAsm cho điều đó (chú ý dấu ngoặc kép thoát và dấu gạch chéo ngược):

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

Bây giờ tôi có một menu chuột phải đẹp để đăng ký một hội đồng.



4

Để thực thi hai lệnh cùng một lúc, bạn phải đặt ký hiệu & (dấu và) giữa hai lệnh. Thích như vậy:

color 0a & start chrome.exe

Chúc mừng!


4

Tôi cố gắng có hai ping trong cùng một cửa sổ và đó là một lệnh nối tiếp trên cùng một dòng. Sau khi hoàn thành cái đầu tiên, chạy lệnh thứ hai.

Giải pháp là kết hợp với start /btrên dấu nhắc lệnh của Windows 7.

Bắt đầu như bình thường, không có /b, và khởi chạy trong một cửa sổ riêng biệt.

Lệnh được sử dụng để khởi chạy trong cùng một dòng là:

start /b command1 parameters & command2 parameters

Dù sao đi nữa, nếu bạn muốn phân tích đầu ra, tôi không khuyên bạn nên sử dụng cái này. Tôi nhận thấy đầu ra được xáo trộn giữa đầu ra của các lệnh.


4

Chà, bạn có hai lựa chọn: Đường ống, hoặc chỉ &:

DIR /S & START FILE.TXT

Hoặc là,

tasklist | find "notepad.exe"

Piping ( |) là nhiều hơn để lấy đầu ra của một lệnh và đặt nó vào một lệnh khác. Và ( &) chỉ nói chạy cái này, và cái kia.


Bạn có thể chỉnh sửa bài đăng của mình để bao gồm một số giải thích về việc làm &|làm gì và chúng khác nhau như thế nào không? Ngay bây giờ những người không quen thuộc với các khái niệm này không thể tự quyết định cái nào nên được sử dụng trong trường hợp của họ.
Mirek Długosz

Như tôi đã từng. Lỗi của tôi. Tôi sẽ chỉnh sửa bài viết ngay lập tức. Cảm kích điều đó.
PyDever

Nên là "findstr" thay vì chỉ "find"
Anu Shibin Joseph Raj

2

Không, cd / && tree && echo %time% . Thời gian lặp lại là lúc lệnh đầu tiên được thực thi.

Đường ống có một số vấn đề, nhưng nó không quan trọng miễn là mọi người biết nó hoạt động như thế nào.


1

Thêm một ví dụ: Ví dụ: khi chúng tôi sử dụng gulp hệ thống xây dựng, thay vì

gulp - mặc định> xây dựng

gulp build - xây dựng thư mục xây dựng

gulp watch - bắt đầu xem tập tin

gulp dist - xây dựng thư mục dist

Chúng tôi có thể làm điều đó với một dòng:

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

1

Khi bạn cố gắng sử dụng hoặc thao tác các biến trong một dòng hãy cẩn thận với nội dung của chúng! Ví dụ: một biến như sau

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

có thể dẫn đến nhiều rắc rối không thể khắc phục nếu bạn sử dụng nó như %PATH%

  1. Các dấu ngoặc đơn kết thúc chấm dứt tuyên bố nhóm của bạn
  2. Dấu ngoặc kép không cho phép bạn sử dụng %PATH% để xử lý vấn đề dấu ngoặc đơn
  3. Và một biến tham chiếu như %USERPROFILE%chứa gì?

2
Điều này có liên quan gì đến việc chạy hai lệnh trong một dòng trong Windows CMD?
Peter Mortensen

1

Sử dụng &biểu tượng trong các cửa sổ để sử dụng lệnh trong một dòng

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

Giống như trong linux, chúng tôi sử dụng,

touch thisfile ; ls -lstrh


-2

Thật đơn giản: chỉ cần phân biệt chúng với &&các dấu hiệu. Thí dụ:

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

"Goodbye World" sẽ được in sau "Hello World".


6
Không phụ thuộc vào thực tế, rằng đã có những câu trả lời cũ cho thấy điều tương tự, nó vẫn không hoàn toàn chính xác. &&là một toán tử có điều kiện , lệnh tiếp theo chỉ được thực thi khi lệnh đầu tiên bị hủy (errorlevel = 0)
jeb

tất nhiên. điều đó là hiển nhiên nếu người đó muốn chạy hai mệnh lệnh thì hai lệnh đó sẽ đúng và do đó mọi thứ sẽ tốt
Rajan Dhanowa

1
Rajan: anh ta có nghĩa là "lệnh tiếp theo chỉ được thực hiện nếu lệnh đầu tiên thành công".
Ivan

2
" Goodbye World sẽ được in sau Hello World " với điều kiện in Hello Worldkhông thất bại. như @jeb đã nói, &&là có điều kiện. &chạy các lệnh bất kể trước đó có thành công hay không.
Pranav A.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.