Câu trả lời:
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
cmd
dấ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. :)
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.
cmd /c "echo foo & echo bar"
.
vagrant up && vagrant ssh
làm việc mà không có dấu ngoặc kép trên Windows 10.
&
- 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!
&
không làm cho các lệnh không đồng bộ hoặc song song. command1 & command2
sẽ chạy command2
sau khi command1
đã hoàn thành. Thành công hay thất bại command1
là không liên quan.
&
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).
;
trước đây trong Linux
;
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.
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
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%
echo
in ra giá trị cũ , 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.
setlocal EnableDelayedExpansion
trong một tập lệnh hoặc cmd /v
). Ví dụ : timeout 5 && cmd /v /c echo !TIME! && echo %TIME%
.
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
cmd /V:ON /c "set i=5 & set arg!i!=MyFile!i! & echo path!i!=%temp%\%arg!i!%"
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 /k
như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 pause
theo sau exit
và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.
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 /b
trê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.
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.
&
và |
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ọ.
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.
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
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%
%PATH%
để xử lý vấn đề dấu ngoặc đơn%USERPROFILE%
chứa gì?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
Có, có. Đó là &
.
&&
sẽ thực thi lệnh 2 khi lệnh 1 hoàn thành với điều kiện nó không bị lỗi.
&
sẽ thực hiện bất kể.
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".
&&
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)
Hello World
khô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.