Toplu iş dosyalarındaki ve işaretlerinden nasıl kaçabilirim?


148

startURL'de "ve" işaretli web sayfalarını açmak için komutu kullanmak için bir toplu iş dosyasında (veya Windows komut satırından) "ve" işaretlerinden nasıl kaçabilirim ?

Çift tırnaklar ile çalışmaz start; bunun yerine yeni bir komut satırı penceresi başlatır.

Güncelleme 1 : Wael Dalloul'un çözümü çalışıyor. Buna ek olarak, URL'de URL kodlu karakterler varsa (örneğin boşluk% 20 olarak kodlanmışsa) ve bir toplu iş dosyasındaysa, '%' '%%' olarak kodlanmalıdır. Örnekte durum bu değildir.

Örnek, komut satırından ( CMD.EXE):

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

sonuçlanacak

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

varsayılan tarayıcıda açılıyor ve komut satırı penceresinde şu hatalar:

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


1
Belugabob'un cevabını düzenledim, bu yüzden şimdi çalışmalı. Düşünmeden startuygulandığında argümandan alıntı yapmanın başarısız olmasına neden olan bir tuhaflık . Ve genel olarak, argümanı tırnak içine almanın, oradan kaçması gereken her karakterden kaçmaktan daha kolay ve daha az hataya açık olduğunu düşünüyorum.
Joey

Artı işaretinden +kaçmak için önüne ne koymalıyım?
william

PowerShell'de start "http://www.google.com/search?client=opera&rls=en&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8"çalışır çünkü PowerShell teklifleri
kaldıracaktır

Yanıtlar:


99

Bir cmd'den :

  • &şu şekilde kaçtı: ^&(@Wael Dalloul'un cevabına göre )
  • % kaçılmasına gerek yok

Bir örnek:

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

Bir toplu iş dosyasından

  • &şu şekilde kaçtı: ^&(@Wael Dalloul'un cevabına göre )
  • %şu şekilde kaçtı: %%(OPs güncellemesine göre)

Bir örnek:

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

Ayrıca "%" kaçan bir örnek de içerebilir - sonra sorumu temizleyebilirim.
Peter Mortensen

@PeterMortensen Kesinlikle - Cevabımı güncelledim.
Lasse Christiansen

2
Hangi karakterlerden de kaçmalıyım? "|" Den kaçmam gerektiğini fark ettim. "^ |" tarafından.
likit

1
Bu durumda %kaçılmasına gerek yoktur, çünkü kim 20andbir ortam değişkeni olarak tanımlamak için yeterince aptal olabilir ? Yaptıysanız, bunun yerine ile start http://www.google.com/search?q=ampersand%20and%20percentagebağlantı kurabilirsiniz http://www.google.com/search?q=ampersandsomething-silly20percentage. Cmd'de ^%kaçmak için kullanıldığında, örnek beklendiği gibi çalışır.
TamaMcGlinn

148

&komutları ayırmak için kullanılır. Bu nedenle kullanabilirsiniz ^kaçmak için &.


3
Artı işaretinden +kaçmak için önüne ne koymalıyım?
william

Bu, daha genel uygulanabilir çözümdür. Ayrıca, bir komut satırı programının parametresinde bir veya daha fazla ve işareti varsa da çalışır. Bununla yeni karşılaştım - parametre CGW5COMM & 10C4 & 8301 idi .
Peter Mortensen

Düzeltme karakteri ^ ile bir ve işaretinden alıntı yapmak her koşulda işe yaramıyor gibi görünüyor. Örneğin, msdeploy.exe'yi / p: anahtarıyla çalıştırarak bir parolayı ampersan ile geçirmeye çalışmak, denediğim herhangi bir permütasyonla (düzeltme işareti, çift tırnak, kukla ilk bağımsız değişken) işe yaramıyor gibi görünüyor.
Derek Greer

3
Kullanmanın bir örneği ^çok değerli olacaktır.
jpmc26

2
@ jpmc26 Bu yanıta bir örnek ekledim .
Lasse Christiansen

30

Kukla bir ilk argüman sağlarsanız, bunu tırnak içine alabilirsiniz.

Bu durumda startilk bağımsız değişkeni, alıntı yapılmışsa yeni konsol pencereleri için bir başlık olarak ele alacağı gibi , bu durumda bir ilk bağımsız değişken sağlamanız gerektiğini unutmayın . Öyleyse aşağıdakiler çalışmalıdır (ve burada):

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

Tamam, itiraf edeyim başlığın içindeki soruyla tam olarak uyuşmuyor. (Başlığı
uzatmam

Öyle değil, sonuçta - tırnak içine almak doğru fikirdi - konsol penceresinin başlığı hakkında bir şey bilmiyordu. Teşekkürler Johannes!
belugabob

PowerShell bağımsız değişkenlerden alıntıları çıkarır , bu nedenle bu başarısız olur. Yalnızca start "http://www.google.com/search?client=opera&rls=en&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8"PowerShell'de kullanmanız gerekir
phuclv

20
explorer "http://www.google.com/search?client=opera&rls=...."

15

Komuta

echo this ^& that

beklendiği gibi çalışıyor, çıktı

this & that

Komuta

echo this ^& that > tmp

dizeyi "tmp" dosyasına yazarak da çalışır. Ancak pipodan önce

echo this ^& that | clip

^ tamamen farklı yorumlanır. Boruya "bunu yankıla" ve "o" komutlarının çıktısını yazmaya çalışır. Yankı çalışacak ve "o" bir hata verecektir. Söyleyen

echo this ^& echo that | clip

panoya "bu" ve "o" dizelerini koyacaktır.

^ Olmadan:

echo this & echo that | clip

ilk yankı konsola yazacak ve yalnızca ikinci yankının çıkışı klibe aktarılacaktır ("> tmp" yeniden yönlendirmesi için benzer şekilde). Dolayısıyla, çıktı yeniden yönlendirildiğinde, ^ & işaretini alıntı yapmaz, bunun yerine yeniden yönlendirmeden önce uygulanmasına neden olur.

& Şeklinde boru oluşturmak için, iki kez alıntı yapmanız gerekir

echo this ^^^& that | clip

Dizeyi bir değişkene koyarsanız

set m=this ^& that

sonra

set m

çıktı verecek

m=this & that

ama apaçık

echo %m%

başarısız olur çünkü Windows değişkeni değiştirdikten sonra

echo this & that

bunu yeni bir komut olarak ayrıştırır ve "o" yu çalıştırmaya çalışır.

Bir toplu iş dosyasında, gecikmeli genişletmeyi kullanabilirsiniz :

setlocal enableDelayedExpansion
echo !m!

Bir boruya çıktı vermek için, değişken değerindeki tüm & s'leri ^ & ile değiştirmeliyiz, bunu% VAR: FROM = TO% sözdizimi ile yapabiliriz:

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

Komut satırında "cmd / v", gecikmeli genişletmeyi etkinleştirir:

cmd /v /c echo !m!

Bu, bir boruya yazarken bile çalışır

cmd /v /c echo !m! | clip

Basit.


Borular için çözümünüz işe yarıyor, ancak sonuçlarınız aşağı yukarı yanlış. Btw. basit bir echo this ^^^& that | clipiş de. Sihirli boru kullanımını anlamak için SO: Borulu bir kod bloğu içindeyken neden gecikmeli genişletme başarısız oluyor?
jeb

1

Ve echoişareti içeren bir dizeye ihtiyacınız varsa , tırnak işaretleri yardımcı olmaz çünkü bunları çıktıda da görürsünüz. Böyle bir durumda forşunları kullanın :

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

... toplu komut dosyasında:

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

veya

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

0

Dosya adında boşluklar varsa ve bir karakteriniz varsa, kaçmanız gerekir:

Komutta yanlış adlandırmaları önlemek için tek VE çift tırnak kullanabilirsiniz.

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

^Karakter aksi tırnak kaçar.


-1

'&' Gibi özel karakterler için tüm ifadeyi tırnak işaretleri arasına alabilirsiniz

set "url=https://url?retry=true&w=majority"

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.