Існують методи, які уникають ^
послідовностей виходу.
Ви можете використовувати змінні із затримкою розширення. Нижче представлена невелика демонстрація пакетного сценарію
@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 партії сценарії весело ;-)