Подтвердить что ты не робот

Escape амперсанды в переменных - выигрышная партия

У меня есть переменная, содержащая амперсанды, и мне нужно создать другую переменную, которая содержит первую. Я знаю "&". символ может быть экранирован с помощью carret (^), но я не знаю, как избежать текста внутри переменной.

set Name1 = Red ^& Green
set Name2 = %Name1% ^& Blue

"Зеленый" не распознается как внутренняя или внешняя команда, операционная программа или командный файл.

Я даже не могу "эхо" переменных, содержащих амперсанды, - я получаю ту же ошибку.

Мне нужно использовать переменные, чтобы ввести их содержимое в вывод или манипулировать файлами, названными переменными типа

type "%Name1%.txt"
type "%Name2%.txt"
4b9b3361

Ответ 1

Самое простое решение - использовать кавычки для назначения и замедленное расширение. Это устраняет необходимость в экранировании.

@echo off
setlocal enableDelayedExpansion
set "Name1=Red & Green"
set "Name2=!Name1! & Blue"
echo !Name2!

Если у вас есть смесь цитируемого и некотируемого текста, вы иногда должны избегать некоторых символов. Но это необходимо только для первоначального назначения. Содержимое переменной никогда не должно быть экранировано при использовании отложенного расширения.

@echo off
setlocal enableDelayedExpansion
set var="This & that" ^& the other thing.
echo !var!

Ответ 2

К сожалению, вам придется удвоить выход из амперсандов, так как он дважды оценивается или помещает значение переменной в цитаты.

set Name1=Red ^^^& Green
set Name2=%Name1% ^& Blue

Но вам также нужно будет добавить еще один набор экранов для использования Name2. Что становится серьезной болью.

set Name1=Red ^^^^^& Green
set Name2=%Name1% ^^^& Blue

Или использовать цитаты (рекомендуется)

set "Name1=Red ^& Green"
set "Name2=%Name1% ^& Blue"

Ответ 3

Приходят на ум два решения, ни одно из которых не является достаточно общим, но они оба "работают":

  • Всегда сохраняйте вещи в кавычках и удаляйте их, когда вам нужно, как указано в предыдущем решении.
  • Повторите запрос & s: set name2 =% name1: & = ^ &% & Синий

Ответ 4

Простейшим решением могло бы быть следующее:

for /f "delims= usebackq" %a in (`echo "First & ? * Last"`) do echo # %~a

... в пакете script:

for /f "delims= usebackq" %%a in (`echo "First & ? * Last"`) do echo # %%~a

или

for /f "delims= usebackq" %%a in (`echo "%~1"`) do echo # %%~a