Bagaimana cara saya melepaskan ampersand dalam file batch?

146

Bagaimana cara saya melepaskan ampersand dalam file batch (atau dari baris perintah Windows) agar dapat menggunakan startperintah untuk membuka halaman web dengan ampersand di URL?

Kutipan ganda tidak akan bekerja dengan start; ini memulai jendela baris perintah baru sebagai gantinya.

Pembaruan 1 : Solusi Wael Dalloul bekerja. Selain itu, jika ada karakter yang dikodekan URL (mis. Spasi dikodekan sebagai% 20) di URL dan itu dalam file batch maka '%' harus dikodekan sebagai '%%'. Ini tidak terjadi dalam contoh.

Contoh, dari baris perintah ( CMD.EXE):

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

akan menghasilkan

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

dibuka di browser default dan kesalahan ini di jendela baris perintah:

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

Platform: Windows XP 64 bit SP2.

Peter Mortensen
sumber
1
Saya sudah mengedit jawaban belugabob jadi itu seharusnya berfungsi sekarang. Itu hanya kekhasan di startmana menyebabkan mengutip argumen gagal jika diterapkan tanpa berpikir. Dan secara keseluruhan saya pikir menyertakan argumen dalam tanda kutip lebih mudah dan lebih rentan kesalahan daripada untuk melarikan diri setiap karakter yang perlu melarikan diri di sana.
Joey
Bagaimana dengan tanda tambah +apa yang harus saya letakkan di depan untuk menghindarinya?
william
Dalam PowerShell start "http://www.google.com/search?client=opera&rls=en&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8"berfungsi karena PowerShell akan menghapus tanda kutip
phuclv

Jawaban:

91

Dari cmd :

  • &lolos seperti ini: ^&(berdasarkan jawaban @Wael Dalloul )
  • % tidak perlu melarikan diri

Sebuah contoh:

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

Dari file batch

  • &lolos seperti ini: ^&(berdasarkan jawaban @Wael Dalloul )
  • %lolos seperti ini: %%(berdasarkan pada pembaruan OPs)

Sebuah contoh:

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
Lasse Christiansen
sumber
Itu juga bisa termasuk contoh melarikan diri "%" - maka saya dapat membersihkan pertanyaan saya.
Peter Mortensen
@PeterMortensen Pasti - Saya telah memperbarui jawaban saya.
Lasse Christiansen
2
Karakter mana yang harus saya hindari? Saya perhatikan bahwa saya harus melarikan diri "|" oleh "^ |".
cairkan
Dalam hal %ini tidak perlu melarikan diri, karena siapa yang akan cukup konyol untuk didefinisikan 20andsebagai variabel lingkungan? Jika ya, start http://www.google.com/search?q=ampersand%20and%20percentagebisa tautkan ke http://www.google.com/search?q=ampersandsomething-silly20percentagegantinya. Menggunakan ^%untuk melarikan diri dalam cmd, contoh berfungsi seperti yang diharapkan.
TamaMcGlinn
145

&digunakan untuk memisahkan perintah. Karena itu Anda dapat menggunakan ^untuk melarikan diri &.

Wael Dalloul
sumber
3
Bagaimana dengan tanda tambah +apa yang harus saya letakkan di depan untuk menghindarinya?
william
Ini adalah solusi yang lebih umum berlaku. Ini juga berfungsi jika parameter dari program baris perintah memiliki satu atau lebih ampersand di dalamnya. Saya baru saja menjumpai ini - parameternya adalah CGW5COMM & 10C4 & 8301 .
Peter Mortensen
Mengutip ampersand dengan karakter tanda sisipan ^ tampaknya tidak berfungsi dalam semua keadaan. Misalnya, mencoba untuk mengeksekusi msdeploy.exe dengan / p: switch untuk meneruskan kata sandi dengan ampersand tampaknya tidak berfungsi dengan permutasi yang saya coba (tanda kutip, tanda kutip ganda, argumen dummy pertama).
Derek Greer
3
Contoh penggunaan ^akan sangat berharga.
jpmc26
2
@ jpmc26 Saya telah menambahkan contoh dalam jawaban ini .
Lasse Christiansen
29

Anda bisa menyertakannya dalam tanda kutip, jika Anda memberikan argumen dummy pertama.

Perhatikan bahwa Anda perlu memberikan argumen dummy pertama dalam kasus ini, karena startakan memperlakukan argumen pertama sebagai judul untuk jendela konsol baru, jika dikutip. Jadi yang berikut ini harus bekerja (dan lakukan di sini):

start "" "http://www.google.com/search?client=opera&rls=en&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8"
belugabob
sumber
OK, saya akui judulnya tidak sepenuhnya cocok dengan pertanyaan di dalamnya. (Apakah Anda pikir saya harus membuat judul lebih lama?)
Peter Mortensen
Tidak demikian 'Doh', setelah semua - menyertakan tanda kutip adalah ide yang tepat - hanya tidak tahu tentang hal judul jendela konsol. Johannes terima kasih!
belugabob
PowerShell akan menghapus tanda kutip dari argumen , jadi ini akan gagal. Anda hanya perlu menggunakan start "http://www.google.com/search?client=opera&rls=en&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8"PowerShell
phuclv
20
explorer "http://www.google.com/search?client=opera&rls=...."
adatapost
sumber
12

Perintah

echo this ^& that

berfungsi seperti yang diharapkan, menghasilkan

this & that

Perintah

echo this ^& that > tmp

juga berfungsi, menulis string ke file "tmp". Namun, sebelum ada pipa

echo this ^& that | clip

^ ditafsirkan sepenuhnya berbeda. Mencoba menulis output dari dua perintah "echo this" dan "that" ke pipa. Gema akan bekerja maka "itu" akan memberikan kesalahan. Pepatah

echo this ^& echo that | clip

akan meletakkan string "ini" dan "itu" di clipboard.

Tanpa ^:

echo this & echo that | clip

gema pertama akan menulis ke konsol dan hanya output gema kedua akan disalurkan ke klip (sama untuk pengalihan "> tmp"). Jadi, ketika output sedang diarahkan, ^ tidak mengutip & melainkan menyebabkannya diterapkan sebelum redirection daripada after.

Untuk menyalurkan &, Anda harus mengutipnya dua kali

echo this ^^^& that | clip

Jika Anda memasukkan string ke dalam variabel

set m=this ^& that

kemudian

set m

akan menampilkan

m=this & that

tapi yang jelas

echo %m%

gagal karena, setelah Windows mengganti variabel, menghasilkan

echo this & that

itu mem-parsing ini sebagai perintah baru dan mencoba mengeksekusi "itu".

Dalam file batch, Anda dapat menggunakan ekspansi yang tertunda :

setlocal enableDelayedExpansion
echo !m!

Untuk menghasilkan sebuah pipa, kita harus mengganti semua & s dalam nilai variabel dengan ^ &, yang bisa kita lakukan dengan% VAR: FROM = TO% sintaks:

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

Di baris perintah, "cmd / v" memungkinkan ekspansi tertunda:

cmd /v /c echo !m!

Ini berfungsi bahkan saat menulis ke sebuah pipa

cmd /v /c echo !m! | clip

Sederhana.

Denis Howe
sumber
Solusi Anda untuk pipa berhasil, tetapi kesimpulan Anda kurang lebih salah. Btw. sebuah echo this ^^^& that | clipkarya sederhana juga. Untuk memahami penanganan pipa ajaib Anda bisa membaca SO: Mengapa ekspansi tertunda gagal ketika di dalam blok kode pipa?
jeb
1

Jika Anda perlu echostring yang berisi ampersand, tanda kutip tidak akan membantu, karena Anda akan melihatnya di output juga. Dalam kasus seperti itu, gunakan for:

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

... dalam skrip kumpulan:

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

atau

for %%a in ("%~1") do echo %%~a
Jaroslav Záruba
sumber
0

Jika Anda memiliki spasi dalam nama file dan Anda memiliki karakter, Anda perlu melarikan diri:

Anda dapat menggunakan tanda kutip tunggal DAN ganda untuk menghindari misnomers dalam perintah.

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

The ^karakter lolos tanda kutip sebaliknya.

jadilah
sumber