Unikaj nawiasów ostrych w wierszu polecenia systemu Windows


94

Muszę wywołać ciąg znaków zawierający nawiasy ostre (<i>) do pliku na komputerze z systemem Windows. Zasadniczo chcę zrobić następujące rzeczy:
echo some string < with angle > brackets >>myfile.txt

To nie działa, ponieważ interpreter poleceń jest mylony z nawiasami ostrymi. Mógłbym zacytować cały ciąg w ten sposób:
echo "some string < with angle > brackets" >>myfile.txt

Ale mam w pliku podwójne cudzysłowy, których nie chcę.

Unikanie nawiasów ala unix też nie działa:
echo some string \< with angle \> brackets >>myfile.txt

Pomysły?


6
Cytaty również zostaną powtórzone.
dalle

Odpowiedzi:


170

Z jakiegoś powodu znakiem ucieczki systemu Windows jest ^.

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

10
Cóż, odwrotny ukośnik jest używany do nazw ścieżek, a podwójne cudzysłowy to zawijanie nazwy pliku, która ma spacje, więc nie pozostało zbyt wiele znaków do wyboru.
James Curran

Działa to również w przypadku innych znaków, takich jak ampersand (&), dzięki.
tenfour

2
Działa świetnie! echo some string ^< with angle ^> brackets >>condaje w wyniku: kilka nawiasów łańcuchowych <z kątem>
Ross Bradbury,

1
Wszystko dlatego, że oryginalne PC-dos używały odwrotnego ukośnika do ścieżek i wstecznej kompatybilności.
Jahmic

Podejrzewam, że to nie było takie przypadkowe. Domyślam się, że chcieli użyć znaku, który raczej nie pojawiłby się w zwykłym tekście, aby nie powodował łatwych do uniknięcia, ale niechcianych ucieczek znaków.
David A. Gray

25

To prawda, oficjalna postać ucieczki to ^, ale bądź ostrożny, ponieważ czasami potrzebujesz trzech ^ postaci. To tylko czasami :

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

Jedną z sztuczek z tego nonsensu jest użycie innego polecenia niż echowykonanie wyniku i cytowanie z podwójnymi cudzysłowami:

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

Zauważ, że nie zachowa to początkowych spacji w tekście zachęty.


1
Zobacz drugą część mojej odpowiedzi, aby wyjaśnić, dlaczego rury wymagają wielu ucieczek.
dbenham,

1
Te trzy ^^^są również potrzebne do zmiany znaczenia poleceń w konsoli Azure DOS / Kudu.
lionello

Okazało się, że jest to rzeczywiście wymagane, gdy chcesz przechowywać wartość zawierającą spiczaste nawiasy w magazynie kluczy Azure za pośrednictwem interfejsu wiersza polecenia platformy Azure.
Jaap

8

Istnieją metody, które pozwalają uniknąć ^sekwencji ucieczki.

Możesz użyć zmiennych z opóźnionym rozwinięciem. Poniżej znajduje się mała demonstracja skryptu wsadowego

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

Lub możesz użyć pętli FOR / F. Z wiersza poleceń:

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

Lub ze skryptu wsadowego:

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

Powodem tych metod pracy jest opóźnione, ponieważ zarówno ekspansja i dla zmiennej ekspansji wystąpić po specjalnych, takich jak operatorzy <, >, &, |, &&, ||są analizowane. Zobacz Jak interpreter poleceń systemu Windows (CMD.EXE) analizuje skrypty? po więcej informacji.


sin3.14 wskazuje, że rury mogą wymagać wielu ucieczek . Na przykład:

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

Powodem, dla którego potoki wymagają wielu ucieczek, jest to, że każda strona potoku jest wykonywana w nowym procesie CMD, więc linia jest analizowana wiele razy. Zobacz Dlaczego opóźnione rozwijanie kończy się niepowodzeniem, gdy znajduje się wewnątrz bloku kodu potokowego? aby uzyskać wyjaśnienie wielu niewygodnych konsekwencji implementacji potoków Window.

Istnieje inna metoda uniknięcia wielokrotnych ucieczek podczas używania rur. Możesz jawnie utworzyć wystąpienie własnego procesu CMD i zabezpieczyć pojedyncze znaki ucieczki za pomocą cudzysłowów:

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

Jeśli chcesz użyć techniki opóźnionego rozszerzania, aby uniknąć ucieczek, jest jeszcze więcej niespodzianek (możesz nie być zaskoczony, jeśli jesteś ekspertem w projektowaniu CMD.EXE, ale nie ma oficjalnej dokumentacji MicroSoft, która wyjaśnia te rzeczy)

Pamiętaj, że każda strona potoku jest wykonywana we własnym procesie CMD.EXE, ale proces nie dziedziczy stanu opóźnionego rozwinięcia - domyślnie jest wyłączony. Musisz więc jawnie utworzyć instancję własnego procesu CMD.EXE i użyć opcji / V: ON, aby włączyć opóźnione rozszerzanie.

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

Należy zauważyć, że opóźnione rozwijanie jest WYŁĄCZONE w nadrzędnym skrypcie wsadowym.

Ale piekło się rozpada, jeśli opóźniona ekspansja jest włączona w skrypcie nadrzędnym. Poniższy sposób nie działa:

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

Problem polega na tym, że !test!jest on rozwijany w skrypcie nadrzędnym, więc nowy proces CMD próbuje przeanalizować niezabezpieczone pliki <i >.

Możesz uciec od !, ale to może być trudne, ponieważ zależy to od tego, czy !jest cytowany, czy nie.

Jeśli nie jest cytowany, wymagana jest podwójna ucieczka:

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

Jeśli jest cytowany, to używana jest pojedyncza ucieczka:

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

Ale jest zaskakująca sztuczka, która pozwala uniknąć wszystkich ucieczek - zamknięcie lewej strony potoku zapobiega !test!przedwczesnemu rozszerzaniu się skryptu nadrzędnego :

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

Ale przypuszczam, że nawet to nie jest darmowy obiad, ponieważ parser wsadowy wprowadza dodatkową (być może niechcianą) przestrzeń na końcu, gdy używane są nawiasy.

To nie zabawa ze skryptami wsadowymi ;-)


3

Aby użyć znaków specjalnych, takich jak „>” w systemie Windows z echo, należy umieścić przed nim specjalny znak zmiany znaczenia.

Na przykład

echo A->B

nie zadziała, ponieważ „>” musi być poprzedzone znakiem „^”:

 echo A-^>B

Zobacz także sekwencje ucieczki . wprowadź opis obrazu tutaj

Istnieje krótki plik wsadowy, który drukuje podstawowy zestaw znaków specjalnych i ich sekwencje ucieczki.


0

Unikanie nawiasów ala unix też nie działa:

echo jakiś łańcuch \ <z nawiasami ostrymi \> >> mojplik.txt

Ukośnik odwrotny byłby uważany za początek bezwzględnej nazwy ścieżki.


2
Bezwzględna nazwa ścieżki odnosząca się do aktualnej litery dysku ...;)
dalle

Odwrotny ukośnik nie jest uważany za początek bezwzględnej nazwy ścieżki w tekście dla polecenia echa - jest to zwykły tekst, który jest przesyłany potokiem, gdziekolwiek go wyślesz. - echo \ na przykład działa zgodnie z oczekiwaniami. - Ale tak, "\" byłby złym wyborem dla znaku zmiany znaczenia w wierszu poleceń, ponieważ każde polecenie / program wymagające ścieżki lub nazwy pliku musiałoby zamiast tego wpisać `\`.
BrainSlugs83

1
ta odpowiedź nie jest odpowiedzią na, wprawdzie niejasne, pytanie
G-.

-2

Możesz także użyć podwójnych cudzysłowów, aby zmienić znaczenie znaków specjalnych ...

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

4
To nie działa. echo some string "<" with angle ">" brackets >>condaje w wyniku: jakiś ciąg znaków "<" z kąt ">" nawiasami, ale OP chce jakiś ciąg znaków <z kątem> nawiasów
Ross Bradbury
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.