ฉันจะหลีกเลี่ยงเครื่องหมายในไฟล์แบตช์ได้อย่างไร


146

ฉันจะหลีกเลี่ยงเครื่องหมายแอมเปอร์แซนด์ในไฟล์แบตช์ (หรือจากบรรทัดคำสั่ง Windows) เพื่อใช้startคำสั่งเพื่อเปิดหน้าเว็บที่มีแอมเปอร์แซนด์ใน URL ได้อย่างไร

ราคาคู่จะไม่ทำงานกับstart; สิ่งนี้จะเริ่มหน้าต่างบรรทัดคำสั่งใหม่แทน

อัปเดต 1 : โซลูชันของ Wael Dalloul ใช้งานได้ นอกจากนี้หากมีอักขระที่เข้ารหัส URL (เช่นพื้นที่มีการเข้ารหัสเป็น% 20) ใน URL และอยู่ในไฟล์แบตช์ดังนั้น '%' จะต้องเข้ารหัสเป็น '%%' นี่ไม่ใช่กรณีในตัวอย่าง

ตัวอย่างจากบรรทัดคำสั่ง ( CMD.EXE):

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

จะส่งผลให้

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

ถูกเปิดในเบราว์เซอร์เริ่มต้นและข้อผิดพลาดเหล่านี้ในหน้าต่างบรรทัดคำสั่ง:

'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.

แพลตฟอร์ม: Windows XP 64 บิต SP2


1
ฉันแก้ไขคำตอบของ belugabob แล้วจึงควรใช้งานได้ในขณะนี้ มันเป็นเพียงการเล่นโวหารstartที่ทำให้การอ้างถึงข้อโต้แย้งล้มเหลวหากนำไปใช้โดยไม่คิด และโดยรวมแล้วฉันคิดว่าการใส่อาร์กิวเมนต์ในเครื่องหมายคำพูดนั้นง่ายกว่าและมีข้อผิดพลาดน้อยกว่าการหลบหนีตัวละครทุกตัวที่ต้องหลบหนี
Joey

แล้วเครื่องหมายบวก+อะไรที่ฉันควรใส่ไว้ด้านหน้าเพื่อหลบหนี
william

ใน PowerShell start "http://www.google.com/search?client=opera&rls=en&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8"งานเพราะPowerShell จะตัดคำพูดออก
phuclv

คำตอบ:


91

จาก cmd :

  • &ถูกหลบหนีเช่นนี้: ^&(ขึ้นอยู่กับคำตอบของ @Wael Dalloul )
  • % ไม่จำเป็นต้องหลบหนี

ตัวอย่าง:

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

จากแบตช์ไฟล์

  • &ถูกหลบหนีเช่นนี้: ^&(ขึ้นอยู่กับคำตอบของ @Wael Dalloul )
  • %ถูกหลบหนีเช่นนี้: %%(อิงตามการอัปเดต OPs)

ตัวอย่าง:

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

นอกจากนี้ยังอาจมีตัวอย่างของการหลบหนี "%" - จากนั้นฉันสามารถล้างคำถามของฉัน
Peter Mortensen

@PeterMortensen อย่างแน่นอน - ฉันได้อัปเดตคำตอบของฉันแล้ว
Lasse Christiansen

2
ฉันควรหนีตัวละครตัวไหนด้วย ฉันสังเกตเห็นว่าฉันต้องหลบหนี "|" โดย "^ |"
ลิควิด

ในกรณี%นี้ไม่จำเป็นต้องหลบหนีเพราะใครจะโง่พอที่จะกำหนด20andเป็นตัวแปรสภาพแวดล้อม? หากคุณstart http://www.google.com/search?q=ampersand%20and%20percentageสามารถเชื่อมโยงไปยังhttp://www.google.com/search?q=ampersandsomething-silly20percentageแทน ใช้^%เพื่อหลบหนีใน cmd ตัวอย่างทำงานตามที่คาดไว้
TamaMcGlinn

145

&ใช้เพื่อแยกคำสั่ง ดังนั้นคุณสามารถใช้ที่จะหลบหนี^&


3
แล้วเครื่องหมายบวก+อะไรที่ฉันควรใส่ไว้ด้านหน้าเพื่อหลบหนี
william

นี่เป็นโซลูชันที่ใช้งานได้ทั่วไปมากกว่า นอกจากนี้ยังใช้งานได้หากพารามิเตอร์ของโปรแกรมบรรทัดคำสั่งมีแอมป์แซนด์หนึ่งอันขึ้นไป ฉันเพิ่งพบนี้ - พารามิเตอร์เป็นCGW5COMM & 10C4 และ 8301
Peter Mortensen

การอ้างถึงเครื่องหมายและเครื่องหมายด้วยอักขระคาเร็ต ^ ดูเหมือนว่าจะไม่ทำงานในทุกสถานการณ์ ตัวอย่างเช่นการพยายามดำเนินการ msdeploy.exe ด้วยสวิตช์ / p: ส่งผ่านรหัสผ่านที่มีเครื่องหมายและดูเหมือนจะไม่ทำงานกับการเปลี่ยนแปลงใด ๆ ที่ฉันได้ลอง (คำพูด caret, คำพูดสองครั้งอาร์กิวเมนต์แรกจำลอง
Derek Greer

3
ตัวอย่างของการใช้^จะมีค่ามาก
jpmc26

2
@ jpmc26 ฉันได้เพิ่มตัวอย่างในคำตอบนี้
Lasse Christiansen

29

คุณสามารถใส่ไว้ในเครื่องหมายคำพูดหากคุณระบุอาร์กิวเมนต์ตัวแรก

โปรดทราบว่าคุณต้องระบุอาร์กิวเมนต์ตัวแรกในตัวอย่างเช่นstartจะถือว่าอาร์กิวเมนต์แรกเป็นชื่อสำหรับหน้าต่างคอนโซลใหม่หากมีการเสนอราคา ดังนั้นต่อไปนี้ควรใช้งานได้ (และทำงานที่นี่):

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

ตกลงฉันจะยอมรับชื่อไม่ตรงกับคำถามภายใน (คุณคิดว่าฉันควรจะทำให้ชื่ออีกต่อไป?)
ปีเตอร์มอร์เทน

ไม่ใช่ 'Doh' หลังจากทั้งหมด - การใส่เครื่องหมายคำพูดเป็นความคิดที่ถูกต้อง - ไม่รู้เพียงแค่ชื่อหน้าต่างคอนโซล ขอบคุณโจฮัน!
belugabob

PowerShell จะตัดเครื่องหมายคำพูดจากอาร์กิวเมนต์ดังนั้นสิ่งนี้จะล้มเหลว คุณต้องใช้เฉพาะstart "http://www.google.com/search?client=opera&rls=en&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8"ใน PowerShell
phuclv


12

คำสั่ง

echo this ^& that

ทำงานตามที่คาดหวังเอาท์พุท

this & that

คำสั่ง

echo this ^& that > tmp

ยังใช้งานได้เขียนสตริงเป็นไฟล์ "tmp" อย่างไรก็ตามก่อนที่จะมีท่อ

echo this ^& that | clip

^ ถูกตีความแตกต่างอย่างสิ้นเชิง พยายามเขียนเอาต์พุตของคำสั่งสองคำสั่ง "echo this" และ "that" ไปยังไพพ์ เสียงสะท้อนจะทำงานหลังจากนั้น "ว่า" จะให้ข้อผิดพลาด คำพูด

echo this ^& echo that | clip

จะวางสตริง "this" และ "that" ไว้บนคลิปบอร์ด

ไม่มี ^:

echo this & echo that | clip

echo แรกจะเขียนไปยังคอนโซลและเฉพาะเอาต์พุต echo ที่สองเท่านั้นที่จะถูกไพพ์ไปที่คลิป (ในทำนองเดียวกันสำหรับการเปลี่ยนเส้นทาง "> tmp") ดังนั้นเมื่อมีการเปลี่ยนเส้นทางเอาต์พุต ^ จะไม่อ้างถึง & แต่แทนที่จะเป็นสาเหตุให้นำไปใช้ก่อนการเปลี่ยนเส้นทางแทนที่จะเป็นหลังจากนั้น

หากต้องการไพพ์ & คุณต้องพูดสองครั้ง

echo this ^^^& that | clip

ถ้าคุณใส่สตริงในตัวแปร

set m=this ^& that

แล้วก็

set m

จะส่งออก

m=this & that

แต่ชัดเจน

echo %m%

ล้มเหลวเพราะหลังจาก Windows แทนที่ตัวแปรแล้วจะส่งผลให้

echo this & that

มันแยกวิเคราะห์นี้เป็นคำสั่งใหม่และพยายามที่จะดำเนินการ "ว่า"

ในไฟล์แบตช์คุณสามารถใช้การขยายที่ล่าช้าได้ :

setlocal enableDelayedExpansion
echo !m!

หากต้องการส่งออกไปยังไพพ์เราต้องแทนที่ & s ทั้งหมดในค่าตัวแปรด้วย ^ & ซึ่งเราสามารถทำได้ด้วยไวยากรณ์% VAR: FROM = TO%:

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

บนบรรทัดคำสั่ง "cmd / v" เปิดใช้งานการขยายล่าช้า:

cmd /v /c echo !m!

สิ่งนี้ใช้ได้แม้ในขณะที่เขียนไปยังไปป์

cmd /v /c echo !m! | clip

ง่าย


วิธีแก้ปัญหาสำหรับท่อใช้งานได้ แต่ข้อสรุปของคุณผิดไปมากหรือน้อย Btw echo this ^^^& that | clipงานง่ายเกินไป เพื่อทำความเข้าใจเกี่ยวกับการจัดการเวทมนต์คุณสามารถอ่านSO: เหตุใดการขยายที่ล่าช้าจึงล้มเหลวเมื่ออยู่ในบล็อกของ piped code
jeb

1

หากคุณต้องการechoสตริงที่มีเครื่องหมายและเครื่องหมายคำพูดจะไม่ช่วยเพราะคุณจะเห็นพวกเขาในการส่งออกเช่นกัน ในกรณีเช่นนี้ให้ใช้for:

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

... ในชุดสคริปต์:

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

หรือ

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

0

หากคุณมีช่องว่างในชื่อของไฟล์และคุณมีตัวละครที่คุณต้องหลบหนี:

คุณสามารถใช้อัญประกาศเดียวและสองครั้งเพื่อหลีกเลี่ยง misnomers ใด ๆ ในคำสั่ง

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

^ตัวละครหนีคำพูดเป็นอย่างอื่น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.