Кутові дужки уникнути у командному рядку Windows


93

Мені потрібно повторити рядок, що містить кутові дужки (<і>), у файл на машині Windows. Я хочу зробити наступне:
echo some string < with angle > brackets >>myfile.txt

Це не працює, оскільки інтерпретатор команд плутається з кутовими дужками. Я можу процитувати цілий рядок так:
echo "some string < with angle > brackets" >>myfile.txt

Але тоді у мене у файлі є подвійні лапки, яких я не хочу.

Уникнення дужок ala unix також не працює:
echo some string \< with angle \> brackets >>myfile.txt

Ідеї?


6
Цитати також будуть перегукуватися.
Далле

Відповіді:


171

З якоїсь причини вхідний символ Windows - ^.

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

10
Ну, зворотна коса риса використовується для імен шляхів, а подвійні лапки - для обгортання імені файлу, у якому є пробіли, тому залишилося не так багато варіантів символів.
Джеймс Курран

Це також працює для інших символів, таких як амперсанд (&), дякую.
десять четвертого

2
Чудово працює! echo some string ^< with angle ^> brackets >>conрезультати в: кілька рядків <під кутом> дужки
Росс Бредбері

1
Все тому, що оригінальні ПК-dos використовували зворотну косу рису для проходження шляхів та зворотної сумісності.
Яхміч

Я підозрюю, що це було не все так випадково. Я здогадуюсь, що вони хотіли використовувати персонаж, який навряд чи з'явиться у звичайному тексті, так що це не спричинило легко уникнути, але небажано втекти символу.
Девід А. Грей

23

Щоправда, офіційний персонаж втечі є ^, але будьте обережні, бо іноді потрібні три ^ символи. Іноді це буває :

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

Один фокус із цієї нісенітниці полягає у використанні команди, відмінної від того, echoщоб робити вихідні та лапки з подвійними лапками:

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

Зауважте, що це не збереже пробіли в тексті підказки.


1
Дивіться 2-ю частину моєї відповіді для пояснення того, чому труби потребують декількох виходів.
dbenham

Ці три ^^^також потрібні для виходу з команд у консолі Azure DOS / Kudu.
Ліонелло

8

Існують методи, які уникають ^послідовностей виходу.

Ви можете використовувати змінні із затримкою розширення. Нижче представлена ​​невелика демонстрація пакетного сценарію

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

Або ви можете використовувати цикл FOR / F. З командного рядка:

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

Або з пакетного сценарію:

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

Причина цих методи робота , тому що обидва відстрочене розширення і для розширення змінного відбувається після спеціальних операторів , такі як <, >, &, |, &&, ||обробляється. Дивіться, як інтерпретатор команд Windows (CMD.EXE) аналізує сценарії? для отримання додаткової інформації.


sin3.14 вказує, що труби можуть потребувати декількох виходів . Наприклад:

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

Причиною того, що труби вимагають декількох екранів, є те, що кожна сторона труби виконується в новому процесі CMD, тому рядок аналізується кілька разів. Див. Чому затримка розширення не вдається, коли знаходиться всередині трубного блоку коду? для пояснення багатьох незручних наслідків реалізації системи Window.

Існує ще один спосіб уникнути багаторазових втеч при використанні труб. Ви можете явно інстанціювати свій власний процес CMD та захистити єдиний вхід за допомогою лапок:

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

Якщо ви хочете використовувати техніку відкладеного розширення, щоб уникнути втечі, то сюрпризів ще більше (Ви можете не здивуватися, якщо ви експерт по дизайну CMD.EXE, але офіційної документації MicroSoft, яка б пояснювала цю інформацію, немає)

Пам'ятайте, що кожна сторона труби виконується у своєму власному процесі CMD.EXE, але процес не успадковує стан затримки розширення - за замовчуванням він вимкнений. Тому ви повинні явно створити екземпляр власного процесу CMD.EXE та використовувати параметр / V: ON, щоб увімкнути відкладене розширення.

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

Зверніть увагу, що затримка розширення вимкнена у батьківському пакетному сценарії.

Але все пекло виходить з ладу, якщо затримка розширення включена у батьківському сценарії. Наступне не працює:

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

Проблема полягає в тому, що !test!розширено в батьківському сценарії, тому новий процес CMD намагається розібрати незахищений <і >.

Ви можете врятуватися !, але це може бути складним завданням, оскільки це залежить від того, чи !вказано в цитатах чи ні.

Якщо це не вказано, потрібно подвійне втечу:

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

Якщо цитується, то використовується один похід:

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

Але є дивовижна хитрість, що дозволяє уникнути всіх втеч - закриття лівої частини труби запобігає !test!передчасному розширенню батьківського сценарію :

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

Але я вважаю, що навіть це не безкоштовний обід, тому що пакетний аналізатор вносить додатковий (можливо, небажаний) простір наприкінці, коли використовуються дужки.

Aint партії сценарії весело ;-)


3

Для використання спеціальних символів, таких як ">" в Windows з відлунням, перед цим потрібно поставити спеціальний символ втечі.

Наприклад

echo A->B

не буде працювати, оскільки ">" має бути уникнути "^":

 echo A-^>B

Див. Також послідовності втечі . введіть тут опис зображення

Існує короткий пакетний файл, який друкує основний набір спеціального символу та їх послідовності втечі.


0

Уникнення дужок ala unix також не працює:

відлуння ряду \ <з кутом \> дужки >> myfile.txt

Зворотна косою рисою вважатиметься початком абсолютної назви шляху.


2
Абсолютна назва траєкторії відносно поточної літери диска ...;)
dalle

Зворотна косою рисою не вважається початком імені абсолютного шляху всередині тексту для команди ехо - це просто звичайний текст, який потрапляє туди, куди ви його надіслали. - echo \ наприклад, працює, як очікувалося. - Але так, "\" буде невдалим вибором символу втечі командного рядка, оскільки кожна команда / програма, для якої потрібен шлях або ім'я файлу, вам слід буде набрати `\` замість цього.
BrainSlugs83

1
ця відповідь не пропонує вирішення, мабуть, розпливчастого питання
G-.

-2

Ви також можете використовувати подвійні лапки, щоб уникнути спеціальних символів ...

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

4
Це не працює. echo some string "<" with angle ">" brackets >>conпризводить до: деякий рядок "<" з кутом ">" дужки, але ОП хоче якийсь рядок <з кутом> дужки
Росс Бредбері
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.