Làm cách nào để thoát ampersands trong tệp bó?


146

Làm cách nào để thoát ký hiệu trong một tệp bó (hoặc từ dòng lệnh Windows) để sử dụng startlệnh để mở các trang web có ký hiệu trong URL?

Báo giá kép sẽ không hoạt động với start; điều này bắt đầu một cửa sổ dòng lệnh mới thay thế.

Cập nhật 1 : Giải pháp của Wael Dalloul hoạt động. Ngoài ra, nếu có các ký tự được mã hóa URL (ví dụ: không gian được mã hóa dưới dạng% 20) trong URL và nó nằm trong một tệp bó thì '%' phải được mã hóa thành '%%'. Đây không phải là trường hợp trong ví dụ.

Ví dụ, từ dòng lệnh ( CMD.EXE):

start http://www.google.com/search?client=opera&rls=en&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8

sẽ cho kết quả

http://www.google.com/search?client=opera 

đang được mở trong trình duyệt mặc định và những lỗi này trong cửa sổ dòng lệnh:

'rls' is not recognized as an internal or external command,
operable program or batch file.
'q' is not recognized as an internal or external command,
operable program or batch file.
'sourceid' is not recognized as an internal or external command,
operable program or batch file.
'ie' is not recognized as an internal or external command,
operable program or batch file.
'oe' is not recognized as an internal or external command,
operable program or batch file.

Nền tảng: Windows XP 64 bit SP2.


1
Tôi đã chỉnh sửa câu trả lời của belugabob để nó hoạt động ngay bây giờ. Đó chỉ là một sự châm biếm trong startđó khiến cho việc trích dẫn đối số thất bại nếu được áp dụng mà không cần suy nghĩ. Và nói chung, tôi nghĩ rằng việc bao gồm các đối số trong dấu ngoặc kép là dễ dàng hơn và ít xảy ra lỗi hơn là thoát khỏi mọi ký tự cần thoát trong đó.
Joey

Những gì về dấu cộng +tôi nên đặt ở phía trước để thoát khỏi nó?
william

Trong PowerShell start "http://www.google.com/search?client=opera&rls=en&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8"hoạt động vì PowerShell sẽ loại bỏ trích dẫn
phuclv

Câu trả lời:


91

Từ một cmd :

  • &được thoát như thế này: ^&(dựa trên câu trả lời của @Wael Dalloul )
  • % không cần phải trốn thoát

Một ví dụ:

start http://www.google.com/search?client=opera^&rls=en^&q=escape+ampersand%20and%20percentage+in+cmd^&sourceid=opera^&ie=utf-8^&oe=utf-8

Từ một tệp bó

  • &được thoát như thế này: ^&(dựa trên câu trả lời của @Wael Dalloul )
  • %được thoát như thế này: %%(dựa trên bản cập nhật OP)

Một ví dụ:

start http://www.google.com/search?client=opera^&rls=en^&q=escape+ampersand%%20and%%20percentage+in+batch+file^&sourceid=opera^&ie=utf-8^&oe=utf-8

Nó cũng có thể bao gồm một ví dụ về thoát "%" - sau đó tôi có thể xóa câu hỏi của mình.
Peter Mortensen

@PeterMortensen Chắc chắn - Tôi đã cập nhật câu trả lời của mình.
Lasse Christiansen

2
Những nhân vật nào tôi cũng nên thoát? Tôi nhận thấy rằng tôi phải thoát "|" bởi "^ |".
lỏng

Trong trường hợp %này không cần phải thoát, bởi vì ai sẽ đủ ngớ ngẩn để định nghĩa 20andlà một biến môi trường? Nếu bạn đã làm, start http://www.google.com/search?q=ampersand%20and%20percentagecó thể liên kết để http://www.google.com/search?q=ampersandsomething-silly20percentagethay thế. Sử dụng ^%để thoát trong cmd, ví dụ hoạt động như mong đợi.
TamaMcGlinn

145

&được sử dụng để tách các lệnh. Vì vậy, bạn có thể sử dụng ^để thoát khỏi &.


3
Những gì về dấu cộng +tôi nên đặt ở phía trước để thoát khỏi nó?
william

Đây là giải pháp áp dụng chung hơn. Nó cũng hoạt động nếu một tham số của chương trình dòng lệnh có một hoặc nhiều ký hiệu trong đó. Tôi vừa gặp phải điều này - tham số là CGW5COMM & 10C4 & 8301 .
Peter Mortensen

Trích dẫn một dấu và với ký tự dấu mũ ^ dường như không hoạt động trong mọi trường hợp. Ví dụ: cố gắng thực thi msdeploy.exe bằng / p: switch để chuyển mật khẩu bằng ký hiệu và dường như không hoạt động với bất kỳ hoán vị nào tôi đã thử (trích dẫn dấu ngoặc kép, trích dẫn kép, đối số đầu tiên giả).
Derek Greer

3
Một ví dụ về việc sử dụng ^sẽ là vô giá.
jpmc26

2
@ jpmc26 Tôi đã thêm một ví dụ trong câu trả lời này .
Lasse Christiansen

29

Bạn có thể đặt nó trong dấu ngoặc kép, nếu bạn cung cấp một đối số đầu tiên giả.

Lưu ý rằng bạn cần cung cấp một đối số đầu tiên giả trong trường hợp này, vì startsẽ coi đối số đầu tiên là một tiêu đề cho các cửa sổ giao diện điều khiển mới, nếu nó được trích dẫn. Vì vậy, những điều sau đây nên làm việc (và làm ở đây):

start "" "http://www.google.com/search?client=opera&rls=en&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8"

OK, tôi sẽ thừa nhận tiêu đề không hoàn toàn phù hợp với câu hỏi bên trong. (Bạn có nghĩ rằng tôi nên làm cho tiêu đề dài hơn không?)
Peter Mortensen

Không phải vậy, "Doh", sau tất cả - kèm theo dấu ngoặc kép là ý tưởng đúng - chỉ không biết về điều tiêu đề cửa sổ giao diện điều khiển. Cảm ơn anh!
belugabob

PowerShell sẽ loại bỏ các trích dẫn từ các đối số , vì vậy điều này sẽ thất bại. Bạn chỉ cần sử dụng start "http://www.google.com/search?client=opera&rls=en&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8"trên PowerShell
phuclv


12

Lệnh

echo this ^& that

hoạt động như mong đợi, đầu ra

this & that

Lệnh

echo this ^& that > tmp

cũng hoạt động, viết chuỗi vào tập tin "tmp". Tuy nhiên, trước một đường ống

echo this ^& that | clip

^ được diễn giải hoàn toàn khác nhau. Nó cố gắng viết đầu ra của hai lệnh "echo this" và "that" vào đường ống. Tiếng vang sẽ hoạt động sau đó "cái đó" sẽ báo lỗi. Nói

echo this ^& echo that | clip

sẽ đặt các chuỗi "này" và "đó" vào bảng tạm.

Không có ^:

echo this & echo that | clip

tiếng vang đầu tiên sẽ ghi vào bàn điều khiển và chỉ có đầu ra tiếng vang thứ hai sẽ được chuyển sang clip (tương tự như chuyển hướng "> tmp"). Vì vậy, khi đầu ra đang được chuyển hướng, ^ không trích dẫn & mà thay vào đó làm cho nó được áp dụng trước khi chuyển hướng thay vì sau.

Để đặt một &, bạn phải trích dẫn nó hai lần

echo this ^^^& that | clip

Nếu bạn đặt chuỗi trong một biến

set m=this ^& that

sau đó

set m

sẽ xuất

m=this & that

nhưng rõ ràng

echo %m%

thất bại bởi vì, sau khi Windows thay thế biến, dẫn đến

echo this & that

nó phân tích cú pháp này như một lệnh mới và cố gắng thực thi "cái đó".

Trong một tệp bó, bạn có thể sử dụng mở rộng bị trì hoãn :

setlocal enableDelayedExpansion
echo !m!

Để xuất ra một đường ống, chúng ta phải thay thế tất cả & s trong giá trị biến bằng ^ &, điều chúng ta có thể làm với cú pháp% VAR: FROM = TO%:

echo !m:^&=^^^&! | clip

Trên dòng lệnh, "cmd / v" cho phép mở rộng bị trì hoãn:

cmd /v /c echo !m!

Điều này hoạt động ngay cả khi viết vào một đường ống

cmd /v /c echo !m! | clip

Đơn giản.


Giải pháp của bạn cho các đường ống hoạt động, nhưng kết luận của bạn ít nhiều sai. Btw. một echo this ^^^& that | clipcông việc đơn giản quá. Để hiểu cách xử lý đường ống ma thuật, bạn có thể đọc SO: Tại sao việc mở rộng bị trì hoãn thất bại khi bên trong một khối mã được xử lý?
Jeb

1

Nếu bạn cần echomột chuỗi chứa ký hiệu, dấu ngoặc kép sẽ không hữu ích, vì bạn cũng sẽ thấy chúng trên đầu ra. Trong trường hợp như vậy, sử dụng for:

for %a in ("First & Last") do echo %~a

... trong một tập lệnh bó:

for %%a in ("First & Last") do echo %%~a

hoặc là

for %%a in ("%~1") do echo %%~a

0

Nếu bạn có khoảng trắng trong tên của tệp bạn có một ký tự bạn cần thoát:

Bạn có thể sử dụng dấu ngoặc đơn VÀ kép để tránh mọi từ sai trong lệnh.

scp ./'files name with spaces/internal folder with spaces/"text & files stored.txt"' .

Các ^nhân vật thoát khỏi các trích dẫn khác.

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.