2011-09-05 27 views
48

Điều này có thể thực sự dễ dàng nhưng không có câu trả lời cho nó qua mạng. Tôi muốn lặp lại một dòng XML thông qua hàng loạt vào một tệp nhưng nó hiểu sai thẻ đóng XML để chuyển hướng ">". Dòng như sau:sử dụng lặp lại hàng loạt với các ký tự đặc biệt

echo <?xml version="1.0" encoding="utf-8" ?> > myfile.xml 

có cách nào để đưa ra gợi ý cho trình phân tích cú pháp theo lô không giải thích chuỗi đặc biệt không? Tôi đã sử dụng dấu ngoặc kép nhưng nó cũng ghi chúng vào tệp! Các tập tin sẽ trông như thế này sau khi vang:

<?xml version="1.0" encoding="utf-8" ?> 
+1

thể trùng lặp của [Thoát dấu ngoặc nhọn trong một dấu nhắc lệnh Windows] (http://stackoverflow.com/questions/251557/escape-angle-brackets-in-a- Windows-command-prompt) – Helen

+1

Bản sao có thể có của [Thoát ký tự hàng loạt] (http://stackoverflow.com/questions/6828751/batch-character-escaping) –

Trả lời

67

Bạn có thể thoát metacharacters vỏ với ^:

echo ^<?xml version="1.0" encoding="utf-8" ?^> > myfile.xml 

Lưu ý rằng kể từ khi echo là một vỏ tích hợp nó không làm theo những quy ước thông thường liên quan đến trích dẫn, do đó, chỉ trích dẫn đối số sẽ xuất báo giá thay vì xóa chúng.

+1

@ Joey..Nếu có nhiều hơn một thẻ được sử dụng, ví dụ như trong một tệp XML lớn .. –

+3

@Nevin: Bạn vẫn phải thoát khỏi mỗi và mọi '<' and '>'. Không có gì đặc biệt ở đó. Điều đó đang được nói, tôi khuyên bạn nên chống lại 'echo'ing các tệp XML lớn trên một dòng duy nhất cho ... một lý do rõ ràng. – Joey

+0

@ Joey..Got điểm của bạn bây giờ ... Cảm ơn –

14

Một giải pháp dễ dàng là sử dụng mở rộng trễ, vì điều này không thay đổi bất kỳ ký tự đặc biệt nào.

set "line=<?xml version="1.0" encoding="utf-8" ?>" 
setlocal EnableDelayedExpansion 
(
    echo !line! 
) > myfile.xml 

EDIT: Một giải pháp khác là sử dụng một báo biến mất.

technic này sử dụng một dấu ngoặc kép để trích dẫn các nhân vật đặc biệt

@echo off 
setlocal EnableDelayedExpansion 
set ""=" 
echo !"!<?xml version="1.0" encoding="utf-8" ?> 

Các công trình lừa, như trong những nhân vật đặc biệt giai đoạn dấu ngoặc kép hàng đầu trong !"! sẽ gìn giữ phần còn lại của dòng (nếu có aren không trích dẫn khác).
Và trong giai đoạn mở rộng bị trì hoãn, !"! sẽ được thay thế bằng nội dung của biến số " (một trích dẫn đơn là tên hợp pháp!).

Nếu bạn đang làm việc với việc mở rộng bị trễ bị vô hiệu hóa, bạn có thể sử dụng vòng lặp FOR /F thay thế.

for /f %%^" in ("""") do echo(%%~" <?xml version="1.0" encoding="utf-8" ?>

Nhưng khi có vẻ là một chút khó chịu, bạn cũng có thể xây dựng một macro.

set "print=for /f %%^" in ("""") do echo(%%~"" 

%print%<?xml version="1.0" encoding="utf-8" ?> 
%print% Special characters like &|<>^ works now without escaping 
+1

' echo! Line! 'Sẽ hoạt động miễn là không có'! 'Trong biến' dòng'. Bất kỳ biện pháp khắc phục cho điều đó? –

+1

Không, nếu 'dòng' chứa một'! 'Thì nó sẽ hoạt động mà không có bất kỳ vấn đề gì, nhưng không phải lúc nào cũng rõ ràng làm thế nào để có được dấu chấm than vào biến. Hãy thử 'set 'line = Hello ^!" & echo! line! ' – jeb

+0

bạn chính xác 100%. Tôi phải nhìn qua một cái gì đó! –

16

phương pháp khác:

@echo off 

for /f "useback delims=" %%_ in (%0) do (
    if "%%_"=="___ATAD___" set $= 
    if defined $ echo(%%_ 
    if "%%_"=="___DATA___" set $=1 
) 
pause 
goto :eof 

___DATA___ 
<?xml version="1.0" encoding="utf-8" ?> 
<root> 
    <data id="1"> 
     hello world 
    </data> 
</root> 
___ATAD___ 


rem # 
rem # 
10

Cách để đầu ra > nhân vật là để thêm vào trước nó với nhân vật ^ thoát:

echo ^> 

sẽ in đơn giản

> 
2

Câu trả lời từ Joey không làm việc cho tôi. Sau khi thực hiện

echo ^<?xml version="1.0" encoding="utf-8" ?^> > myfile.xml 

Tôi đã nhận lỗi này bash: lỗi cú pháp gần dấu hiệu bất ngờ `>'

Giải pháp này làm việc cho tôi:

echo "<?xml version=\"1.0\" encoding=\"utf-8\">" > myfile.txt 

Xem thêm http://www.robvanderwoude.com/escapechars.php

+1

Lưu ý rằng điều này bảo tồn các dấu ngoặc kép trong đầu ra –

11

Trong để sử dụng các ký tự đặc biệt, chẳng hạn như '>' trên Windows với tiếng vọng, bạn cần đặt một ký tự thoát đặc biệt lại nó.

Ví dụ

echo A->B 

sẽ không làm việc kể từ khi '>' phải được thoát bởi '^':

echo A-^>B 

Xem thêm escape sequences. enter image description here

Có một tệp hàng loạt ngắn, in một bộ ký tự đặc biệt cơ bản và chuỗi thoát của chúng.

+1

Nhưng đối với dấu ngoặc kép, dấu mũ là ký tự thoát, sử dụng hai dấu nháy là sai, vì nó chỉ đơn giản là trích dẫn thứ hai. 'echo Line1" "& echo line2' vs' echo Line1^"& dòng echo2' – jeb

+0

@jeb: Cảm ơn bạn, tôi đã cập nhật ảnh chụp màn hình và tập lệnh. – orbitcowboy

0

Tại sao không sử dụng dấu nháy đơn?

echo '<?xml version="1.0" encoding="utf-8" ?>' 

đầu ra

<?xml version="1.0" encoding="utf-8" ?> 
Các vấn đề liên quan