it-swarm-vi.tech

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

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

637
Dan

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
801
Wayne

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 sự 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 nguồn cấp dữ liệ 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 là 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òng trả về luôn luôn bị bỏ qua trong giai đoạn này).

240
jeb

(Về cơ bản, đây là bản viết lại của Câu trả lời của Wayne nhưng với sự nhầm lẫn xung quanh dấu mũ đã được xóa. Vì vậy, tôi đã đăng nó dưới dạng CW. Tôi không ngại chỉnh sửa câu trả lời, nhưng viết lại hoàn toàn chúng có vẻ không phù 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ó ở vị trí a không gian sẽ được yêu cầu (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 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 khi tiếp tục).

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 tạo ra 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à tỉnh táo, 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 phải điều cuối cùng trong một tệp bó, vì ở đó dường như là một vấn đề lớn với điều đó .

59
T.J. Crowder

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 hello có 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 điều kiện if chỉ thích chúng theo sau nếu có khoảng trắng:

if exist ^
14
Todd Partridge

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 dấu mũ (và thực sự cố gắng sử dụng một vòng sẽ được coi là 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.

8
Mohammed Safwat