2011-01-10 29 views
23

Lệnh dài trong tệp lô Windows có thể được chia thành nhiều dòng bằng cách sử dụng ^ như được đề cập trong Long commands split over multiple lines in Windows Vista batch (.bat) file.Làm cách nào để tách dòng được trích dẫn kép thành nhiều dòng trong tệp batch của Windows?

Tuy nhiên, nếu dấu mũ nằm bên trong chuỗi được trích dẫn kép, chuỗi đó sẽ không hoạt động. Ví dụ:

echo "A very long line I want to^
split into two lines" 

Điều này sẽ in "A very long line I want to ^ và cho tôi biết split là một lệnh không xác định.

Có cách nào để giải quyết vấn đề này không?

Trả lời

18

Tôi thấy ba cách giải quyết có thể xảy ra.

1) Tạo đường kết hợp nhiều tham số.

@echo off 
SETLOCAL EnableDelayedExpansion 

set "line=" 
for %%a in ("line1" 
"line2" 
"line3" 
"line4" 
) do set line=!line!%%~a 
echo !line! 

2) Rời bỏ "quote" vào cuối mỗi dòng

@echo on 
SETLOCAL EnableDelayedExpansion 

set "line=line1 & x#"^ 
"line2 & a#"^ 
"line3 & b #"^ 
"line4 & c " 

set "line=!line:#" "=!" 
echo !line! 

Không gian đầu tiên trong mỗi dòng là rất quan trọng, bởi vì caret làm việc nhân vật như nhiều dòng nhưng nó cũng thoát ký tự đầu tiên, do đó, một báo giá sẽ được thoát.
Vì vậy, tôi thay thế "#" unnessary sau khi tạo đường.

EDIT Added: 3) Biến mất trích

setlocal EnableDelayedExpansion 
echo "A very long line I want to !"=!^ 
split into two lines" 

Theo tôi đây là tốt nhất cách, nó hoạt động như phân tích cú pháp đầu tiên nhìn thấy có dấu ngoặc kép và do đó caret cuối cùng sẽ làm việc, vì nó dường như nằm ngoài dấu ngoặc kép.
Nhưng biểu thức !"=! này sẽ mở rộng biến có tên là "=, nhưng một tên biến không thể tồn tại (dấu bằng chỉ có thể xảy ra dưới dạng ký tự đầu tiên) để mở rộng thành không có gì.

Bạn cũng có thể tạo các biểu thức an toàn an toàn, chúng sẽ luôn thoát khỏi dấu ngoặc kép, độc lập nếu có báo giá hoặc không nằm trong dòng.
!"^"=!

echo This multiline works !"^"=!^ 
as expected 
echo "This multiline works !"^"=!^ 
too" 

Nếu bạn muốn tránh mở rộng chậm, bạn cũng có thể sử dụng một -để-Vòng như

for %%^" in ("") do (
echo "This multiline works %%~"^ 
too" 
) 
+0

Câu trả lời không đơn giản, nhưng đây là một số thủ thuật thú vị! Tôi muốn tôi có thể có nhiều upvotes. Cảm ơn! –

+0

Tôi thực sự thực sự thích phương pháp # 1. Có bất kỳ của gotcha trên phương pháp đó? – djangofan

+0

Không thành công với các ký tự như '*?' Và, vì vòng lặp for cố gắng sử dụng chúng làm ký tự đại diện. Nhưng sau đó bạn có thể chuyển sang một vòng lặp FOR/F – jeb

7

Câu trả lời thẳng về phía trước nhất là để thoát khỏi dấu ngoặc kép. Chúng sẽ được in, nhưng chúng sẽ không có chức năng trích dẫn nội dung theo như CMD.EXE có liên quan.

@echo off 
echo ^"A very long line I want to^
split into two lines^" 

Bất kỳ ký tự đặc biệt nào xuất hiện trong dòng cũng phải được thoát vì chúng không còn được trích dẫn chức năng nữa.

@echo off 
echo ^"A very long line I want to^
split into two lines^
that also contains special characters ^^ ^& ^| ^> ^< ^" 

Như đã nói, dòng tiếp tục thoát ký tự đầu tiên của dòng tiếp theo. Vì vậy, nếu ký tự đầu tiên của dòng tiếp theo xảy ra là một ký tự đặc biệt, nó không nên được thoát ra lần thứ hai.Mã dưới đây sẽ cho kết quả chính xác giống như ví dụ trước.

@echo off 
echo ^"A very long line I want to^
split into two lines^
that also contains special characters ^^^
& ^| ^> ^< ^" 
+1

+1, nhưng tôi đã biến mất dấu ngoặc kép, vì bạn không cần phải thoát khỏi các ký tự đặc biệt – jeb

+0

Tôi thích báo giá biến mất tốt hơn :-) – dbenham

+0

Miễn là bạn biết dấu mũ là ký tự thoát, tôi nghĩ kỹ thuật này là dễ nhớ hơn nhiều. Không cần phải hiểu/cho phép mở rộng trễ, cũng không hiểu/ghi nhớ việc mở rộng bị trì hoãn * hack *. Nhưng để mỗi riêng của mình. –

Các vấn đề liên quan