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ó?
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:
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
echo
ed.
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
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).
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"
.
(Đ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à ^
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 ^
là 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 đó .
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 if
điều kiện thích chúng chỉ tuân theo nếu có một khoảng trắng :
if exist ^
cmd1.bat && cmd2.bat
này khác với dạng parens: thực thi cmd2.bat
iff được cmd1.bat
thự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.
( echo <line break here> hello )
kết quả trong một dòng trống.
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.
for
cú 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.
do
một phần chứa nhiều if-else
câu lệnh / lồng nhau thì sao?
^
và sau văn bản lệnh của bạn.