Tách các lệnh dài trong nhiều dòng thông qua tệp bó Windows


735

Làm cách nào tôi có thể phân chia các lệnh dài trên nhiều dòng trong một tệp bó?

Câu trả lời:


919

Bạn có thể chia dòng dài với dấu mũ ^miễn là bạn nhớ rằng dấu mũ và dòng mới theo sau nó đã bị xóa hoàn toàn. Vì vậy, nếu cần có một khoảng trống nơi bạn ngắt dòng, hãy bao gồm một khoảng trắng. ( Thêm vào đó bên dưới. )

Thí dụ:

copy file1.txt file2.txt

sẽ được viết là:

copy file1.txt^
 file2.txt

95
Bạn có thể bắt đầu dòng tiếp theo mà không có khoảng trắng nếu bạn thêm khoảng trắng ngay trước ^và sau văn bản lệnh của bạn.
Joseph Daigle

4
@SebaIllingworth - Không, bạn luôn có thể thêm [SPACE] + [^] và hai dòng trống để tạo tổng cộng 2 nguồn cấp dữ liệu khi có echoed.
James K

12
Để đảm bảo an toàn luôn kết thúc bằng dòng trống khi sử dụng carets, hãy xem Simple carat trong tệp bó tiêu tốn tất cả bộ nhớ
matt wilkie

4
@GavinMiller: "caret ^ sau khi sao chép và file1.txt trên một dòng mới sẽ không hoạt động" Điều đó không đúng. Bạn có thể chia dòng ở bất cứ đâu, kể cả ở giữa một từ, như thế nào co^␍py ^␍file1 ^␍file2. Tôi khuyên bạn nên xóa bình luận của mình để tránh nhầm lẫn, đặc biệt là vì nhiệm vụ này là một câu hỏi phổ biến
Borodin

3
Một điều đáng chú ý ở đây là ^ phải là nhân vật cuối cùng trên dòng - tức là không có khoảng trắng sau. Tôi đã gặp rắc rối với điều này và hóa ra tôi có một loạt các khoảng trắng sau dấu mũ - không dễ thấy trong trình chỉnh sửa tôi đang sử dụng.
GregHNZ

266

Quy tắc cho dấu mũ là:

Một dấu mũ ở cuối dòng, nối thêm dòng tiếp theo, ký tự đầu tiên của dòng được nối sẽ được thoát.

Bạn có thể sử dụng dấu mũ nhiều lần, nhưng dòng hoàn chỉnh không được vượt quá độ dài dòng tối đa ~ 8192 ký tự (Windows XP, Windows Vista và Windows 7).

echo Test1
echo one ^
two ^
three ^
four^
*
--- Output ---
Test1
one two three four*

echo Test2
echo one & echo two
--- Output ---
Test2
one
two

echo Test3
echo one & ^
echo two
--- Output ---
Test3
one
two

echo Test4
echo one ^
& echo two
--- Output ---
Test4
one & echo two

Để chặn lối thoát của nhân vật tiếp theo, bạn có thể sử dụng chuyển hướng.

Việc chuyển hướng phải ở ngay trước dấu mũ. Nhưng tồn tại một sự tò mò với chuyển hướng trước khi chăm sóc.

Nếu bạn đặt mã thông báo tại dấu mũ, mã thông báo sẽ bị xóa.

echo Test5
echo one <nul ^
& echo two
--- Output ---
Test5
one
two


echo Test6
echo one <nul ThisTokenIsLost^
& echo two
--- Output ---
Test6
one
two

Và cũng có thể nhúng các nguồn cấp dữ liệu vào chuỗi:

setlocal EnableDelayedExpansion
set text=This creates ^

a line feed
echo Test7: %text%
echo Test8: !text!
--- Output ---
Test7: This creates
Test8: This creates
a line feed

Dòng trống rất quan trọng cho sự thành công. Điều này chỉ hoạt động với việc mở rộng bị trì hoãn, phần còn lại của dòng bị bỏ qua sau nguồn cấp dữ liệu.

Nó hoạt động, bởi vì dấu mũ ở đầu dòng bỏ qua nguồn cấp tiếp theo và thoát khỏi ký tự tiếp theo, ngay cả khi ký tự tiếp theo cũng là nguồn cấp dữ liệu (trả về vận chuyển luôn bị bỏ qua trong giai đoạn này).


Khối mã cuối cùng với ví dụ về nguồn cấp dữ liệu không hiển thị dòng trống, mặc dù nó ở đó. (Ít nhất là nó không hiển thị trong IE7) Thay vào đó, hãy thử định dạng lại bằng cách sử dụng blockquote.
dbenham

5
Câu hỏi là, chúng ta có nên hỗ trợ một công cụ tồi không tuân theo các quy tắc (ai đó gọi nó là trình duyệt, nhưng không phải vậy) hay bạn nên chuyển sang trình duyệt?
Jeb

1
tôi đã có hai dấu ngoặc kép xung quanh các giá trị của mình, như trong tập var = "text here ^" nhưng nó không hoạt động. Hủy bỏ các trích dẫn đôi và nó là tốt.
rjt

1
@jeb, đã viết lên một ví dụ về kịch bản lệnh cmd không thành công, nhưng sau đó tìm thấy câu hỏi này: stackoverflow.com/questions/4643376/ chủ
rjt

Điều này không hoạt động nếu dòng tiếp theo bắt đầu bằng dấu ngoặc kép: copy ^[newline]"file1.txt" ^[newline]"file2.txt"không hoạt động! Tôi đã phải thêm một không gian : copy ^[newline] "file1.txt" ^[newline] "file2.txt".
Alexander Gelbukh

70

(Điều này về cơ bản là một viết lại của câu trả lời của Wayne nhưng với những rắc rối xung quanh các caret xoá sổ. Vì vậy, tôi đã đăng nó như là một CW. Tôi không né về chỉnh sửa câu trả lời, nhưng hoàn toàn viết lại cho họ dường như không thích hợp.)

Bạn có thể chia dòng dài bằng dấu mũ ( ^), chỉ cần nhớ rằng dấu mũ và dòng mới theo sau nó sẽ bị xóa hoàn toàn khỏi lệnh, vì vậy nếu bạn đặt nó ở nơi cần một khoảng trắng (chẳng hạn như giữa các tham số), hãy chắc chắn để bao gồm cả không gian (trước ^hoặc ở đầu dòng tiếp theo - lựa chọn sau có thể giúp làm cho nó rõ ràng hơn đó là sự tiếp nối).

Ví dụ: (tất cả được thử nghiệm trên Windows XP và Windows 7)

xcopy file1.txt file2.txt

có thể được viết như:

xcopy^
 file1.txt^
 file2.txt

hoặc là

xcopy ^
file1.txt ^
file2.txt

hoặc thậm chí

xc^
opy ^
file1.txt ^
file2.txt

(Điều đó hoạt động cuối cùng vì không có khoảng trắng nào xen giữa xc^và không có khoảng trắng ở đầu dòng tiếp theo. Vì vậy, khi bạn xóa ^và dòng mới, bạn sẽ nhận được .... xcopy)

Để dễ đọc và hợp lý, có lẽ tốt nhất chỉ nên ngắt giữa các tham số (đảm bảo bao gồm khoảng trắng).

Hãy chắc chắn rằng ^không điều cuối cùng trong một tập tin thực thi, như có dường như là một vấn đề lớn với điều đó .


18

Nhiều lệnh có thể được đặt trong ngoặc đơn và trải rộng trên nhiều dòng; vì vậy một cái gì đó như echo hi && echo hellocó thể được đặt như thế này:

( echo hi
  echo hello )

Ngoài ra các biến có thể giúp:

set AFILEPATH="C:\SOME\LONG\PATH\TO\A\FILE"
if exist %AFILEPATH% (
  start "" /b %AFILEPATH% -option C:\PATH\TO\SETTING...
) else (
...

Ngoài ra tôi nhận thấy với các dấu mũ ( ^) rằng các ifđiều kiện thích chúng chỉ tuân theo nếu có một khoảng trắng :

if exist ^

1
Dòng cmd1.bat && cmd2.batnày khác với dạng parens: thực thi cmd2.batiff được cmd1.batthực hiện thành công (cài đặt không có %errorcode%). Các hình thức sau thực hiện vô điều kiện. Một điều bất ngờ (ít nhất là đối với tôi) là, rõ ràng, bạn không thể sử dụng kết hợp cả hai + tức là thêm &&trước khi ngắt dòng.
Paul Michalik

( echo <line break here> hello )kết quả trong một dòng trống.
Karl Morrison

câu trả lời tốt nhất và sạch nhất! dấu vết là xấu xí và có vấn đề trong regex
neoscribe

9

Tuy nhiên, dường như việc phân tách ở giữa các giá trị của vòng lặp for không cần một dấu mũ (và thực sự cố gắng sử dụng nó sẽ được coi là một lỗi cú pháp). Ví dụ,

for %n in (hello
bye) do echo %n

Lưu ý rằng không có không gian thậm chí là cần thiết sau khi chào hoặc trước khi tạm biệt.


Tất nhiên, đây là một phần của forcú pháp: dấu phân cách của các phần tử trong "for-set" là dấu cách, dấu phẩy, dấu chấm phẩy, dấu bằng, ký tự TAB và dòng mới.
Aacini

Nhưng nếu domột phần chứa nhiều if-elsecâu lệnh / lồng nhau thì sao?
Vicky Dev

Sau đó, bạn có thể chỉ cần sử dụng dấu ngoặc đơn để gửi các câu lệnh như cho% n in (hello bye) do (echo% n echo% n)
Mohammed Safwat
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.