^
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 ;-)