Windows komut isteminde kaçış açısı parantezleri


94

Açılı parantezler (<ve>) içeren bir dizeyi Windows makinedeki bir dosyaya yansıtmam gerekiyor. Temel olarak yapmak istediğim şey şudur:
echo some string < with angle > brackets >>myfile.txt

Komut yorumlayıcısı açılı parantezlerle karıştırıldığı için bu işe yaramaz. Tüm dizeyi şöyle aktarabilirim:
echo "some string < with angle > brackets" >>myfile.txt

Ama dosyamda istemediğim çift tırnak var.

Parantezlerden kaçmak ala unix de çalışmaz:
echo some string \< with angle \> brackets >>myfile.txt

Fikirler?


6
Alıntılar da yankılanacaktır.
dalle

Yanıtlar:


170

Windows çıkış karakteri, bazı nedenlerden dolayı ^ şeklindedir.

echo some string ^< with angle ^> brackets >>myfile.txt

10
Ters eğik çizgi, yol adları için kullanılır ve çift tırnak, boşlukları olan dosya adını kaydırmak içindir, dolayısıyla çok fazla karakter seçeneği kalmaz.
James Curran

Bu ayrıca ve işareti (&) gibi diğer karakterler için de işe yarar, teşekkürler.
tenfour

2
Harika çalışıyor! echo some string ^< with angle ^> brackets >>consonuç: bir dizi <açılı> parantez
Ross Bradbury

1
Bunun nedeni, orijinal PC-dos'nun yollar ve geriye dönük uyumluluk için ters eğik çizgi kullanmasıdır.
Jahmic

O kadar rastgele olmadığından şüpheleniyorum. Tahminim, normal metinde görünmesi pek olası olmayan bir karakteri kullanmak istediler, böylece kolayca önlenebilir, ancak istenmeyen karakter kaçışlarına neden oldu.
David A. Gray

25

Doğru, resmi kaçış karakteri ^, ancak dikkatli olun çünkü bazen üç ^ karaktere ihtiyacınız var . Bu sadece bazen :

C:\WINDOWS> echo ^<html^>
<html>

C:\WINDOWS> echo ^<html^> | sort
The syntax of the command is incorrect.

C:\WINDOWS> echo ^^^<html^^^> | sort
<html>

C:\WINDOWS> echo ^^^<html^^^>
^<html^>

Bu saçmalıklardan bir numara echo, çıktıyı yapmak ve çift tırnakla alıntı yapmak dışında bir komut kullanmaktır :

C:\WINDOWS> set/p _="<html>" <nul
<html>
C:\WINDOWS> set/p _="<html>" <nul | sort
<html>

Bunun, bilgi istemi metnindeki baştaki boşlukları korumayacağını unutmayın.


1
Boruların neden birden fazla kaçış gerektirdiğinin açıklaması için cevabımın 2. bölümüne bakın .
dbenham

1
Üçü ^^^, Azure DOS / Kudu konsolundaki komutlardan çıkış yapmak için de gereklidir.
lionello

Azure CLI aracılığıyla Azure keyvault'da sivri parantez içeren bir değer depolamak istediğinizde bunun gerçekten gerekli olduğunu buldum.
Jaap

8

^Kaçış dizilerinden kaçınan yöntemler vardır .

Gecikmeli genişlemeye sahip değişkenler kullanabilirsiniz. Aşağıda küçük bir toplu komut dosyası gösterimi var

@echo off
setlocal enableDelayedExpansion
set "line=<html>"
echo !line!

Veya bir FOR / F döngüsü kullanabilirsiniz. Komut satırından:

for /f "delims=" %A in ("<html>") do @echo %~A

Veya bir toplu komut dosyasından:

@echo off
for /f "delims=" %%A in ("<html>") do echo %%~A

Özel operatörler sever sonra gecikmeli genişleme ve değişken genişleme İÇİN ikisi gelmesi nedeniyle sebebi bu yöntemler iştir <, >, &, |, &&, ||çözümlenir. Windows Komut Yorumlayıcısı (CMD.EXE) komut dosyalarını nasıl ayrıştırır? Konusuna bakın. daha fazla bilgi için.


sin3.14, boruların birden fazla kaçış gerektirebileceğine işaret eder . Örneğin:

echo ^^^<html^^^>|findstr .

Boru hatlarının birden çok kaçış gerektirmesinin nedeni, borunun her iki tarafının yeni bir CMD işleminde yürütülmesi ve dolayısıyla satırın birden çok kez ayrıştırılmasıdır. Bkz. Borulu bir kod bloğu içindeyken gecikmeli genişletme neden başarısız oluyor? Window'un boru uygulamasının birçok garip sonucunun açıklaması için.

Borular kullanılırken birden çok kaçıştan kaçınmanın başka bir yöntemi vardır. Kendi CMD sürecinizi açık bir şekilde başlatabilir ve tek çıkışı alıntılarla koruyabilirsiniz:

cmd /c "echo ^<html^>"|findstr .

Kaçışlardan kaçınmak için gecikmeli genişletme tekniğini kullanmak istiyorsanız, o zaman daha da fazla sürpriz var (CMD.EXE'nin tasarımı konusunda uzmansanız şaşırmayabilirsiniz, ancak bunu açıklayan resmi bir MicroSoft dokümantasyonu yoktur)

Borunun taraflarının kendi CMD.EXE'yi sürecinde çalıştırılmaktadır, ancak sürecin gelmediğini unutmayın değil gecikmeli genişleme durumu devralır - KAPALI varsayılan olarak. Bu nedenle, kendi CMD.EXE işleminizi açıkça başlatmalı ve gecikmeli genişletmeyi etkinleştirmek için / V: ON seçeneğini kullanmalısınız.

@echo off
setlocal disableDelayedExpansion
set "line=<html>"
cmd /v:on /c echo !test!|findstr .

Üst toplu komut dosyasında gecikmeli genişletmenin KAPALI olduğunu unutmayın.

Ancak, ana komut dosyasında gecikmeli genişletme etkinleştirilirse tüm cehennem kopar. Aşağıdaki gelmez değil çalışır:

@echo off
setlocal enableDelayedExpansion
set "line=<html>"
REM - the following command fails
cmd /v:on /c echo !test!|findstr .

Sorun, !test!üst komut dosyasında genişletilmesidir, bu nedenle yeni CMD işlemi korumasız <ve >.

'Dan kaçabilirsiniz !, ancak bu biraz yanıltıcı olabilir, çünkü !alıntı yapılıp yapılmadığına bağlıdır .

Alıntı yapılmadıysa, çift kaçış gereklidir:

@echo off
setlocal enableDelayedExpansion
set "line=<html>"
cmd /v:on /c echo ^^!test^^!|findstr .

Alıntı yapılmışsa, tek bir çıkış kullanılır:

@echo off
setlocal enableDelayedExpansion
set "line=<html>"
cmd /v:on /c "echo ^!test^!"|findstr .

Ancak, tüm çıkışları engelleyen şaşırtıcı bir numara vardır - borunun sol tarafını kapatmak, ana komut dosyasının !test!zamanından önce genişlemesini engeller :

@echo off
setlocal enableDelayedExpansion
set "line=<html>"
(cmd /v:on /c echo !test!)|findstr .

Ama sanırım bu bile bedava bir öğle yemeği değil, çünkü parti ayrıştırıcı, parantez kullanıldığında sonunda fazladan (belki de istenmeyen) bir boşluk getiriyor.

Toplu komut dosyası yazmak eğlenceli değil ;-)


3

Yankılı Windows'ta '>' gibi özel karakterler kullanmak için önüne özel bir kaçış karakteri koymanız gerekir.

Örneğin

echo A->B

'>' '^' tarafından atlatılması gerektiğinden hiçbir şey çalışmayacak:

 echo A-^>B

Ayrıca kaçış dizilerine bakın . görüntü açıklamasını buraya girin

Temel bir özel karakter kümesini ve bunların kaçış dizilerini yazdıran kısa bir toplu iş dosyası vardır.


0

Parantezlerden kaçmak ala unix de çalışmaz:

bazı dizeleri echo \ <açılı \> parantezler >> dosyam.txt

Ters eğik çizgi, mutlak bir yol adının başlangıcı olarak kabul edilir.


2
Mevcut sürücü harfine göre mutlak yol adı ...;)
dalle

Ters eğik çizgi, bir yankı komutu için metnin içindeki mutlak yol adının başlangıcı olarak kabul edilmez - yalnızca gönderdiğiniz her yerde borulanan düz metindir. - echo \ örneğin beklendiği gibi çalışır. - Ama evet, bir yol veya dosya adına ihtiyaç duyan her komut / program yerine "\" yazmanız gerektiğinden, "\" bir komut satırı çıkış karakteri için kötü bir seçim olacaktır.
BrainSlugs83

1
Bu cevap, kuşkusuz belirsiz, meselenin çözümü sunmuyor
G-.

-2

Özel karakterlerden kaçınmak için çift tırnak da kullanabilirsiniz ...

echo some string "<" with angle ">" brackets >>myfile.txt

4
Bu çalışmıyor. echo some string "<" with angle ">" brackets >>consonuçları: Bazı dize "<" açı ile ">" parantez ama OP istediği parantez <açı ile> birkaç ip
Ross Bradbury
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.