Интересный вопрос (мне нравится этот синтаксис базовых вопросов).
Очевидно, вы знаете, как проверить это с отложенным расширением, а также работает FOR-параметры.
@echo off
setlocal
set "AAA BBB=value"
set ""AAA BBB"="
set "AAA="
for %%a in ("AAA BBB") do if defined %%~a echo FOR: This works
setlocal EnableDelayedExpansion
set "varname=AAA BBB"
if defined !varname! echo Delayed: This works
if defined %varname% ( echo percent: Never comes here
) ELSE ( echo percent: Never comes here ? )
if defined AAA^ BBB ( echo escape1: Never comes here
) ELSE ( echo escape1: fails )
set AAA=Hello
if defined AAA^ BBB (
echo escape2: It only test for AAA the BBB will be "removed"
) ELSE ( echo escape2: fails )
set "space= "
if defined AAA!space!BBB echo inject space: This works
if defined "AAA BBB" (echo Quote1: Never comes here
) ELSE ( echo Quote1: Fails )
set ""AAA BBB"=value"
if defined "AAA BBB" echo Quote2: This works, it checks for "AAA BBB" with quotes
В моем мнении, в примере escape2 синтаксический анализатор сначала разбивает строку на токены следующим образом:
<if> <defined> <AAA BBB> <echo ....
Но во время выполнения если он определен , он повторно сканирует токен <AAA BBB>
, поэтому он получает только AAA
.
Вы не можете ввести второй escape, например AAA^^^ BBB
, так как он ищет только переменную с именем AAA^
Я не вижу решения без задержки / FOR, так как выход из пространства всегда терпит неудачу.
EDIT: Это также можно решить с помощью SET <varname>
Решение ijprest использует команду SET для проверки переменной без необходимости экранирования имени переменной.
Но оно также демонстрирует интересное поведение с пробелами внутри и в конце имени переменной.
Кажется, что следуют этим правилам:
SET varname
ищет все переменные, начинающиеся с varname, но сначала он удаляет все символы после последнего пробела символа varname и удаляет все начальные пробелы.
Таким образом, вы не можете искать переменные, начинающиеся с пробела (но также довольно сложно создать такое имя).
Такое же поведение также активно, если имя переменной заключено в кавычки, но затем существует еще одно правило.
Сначала удалите все символы после последней кавычки, если есть хотя бы две кавычки.Используйте текст внутри кавычек и используйте "пробел" -rule.
Sample.
set " abc def ghi" junk junk
*** 1. removes the junk
set " abc def ghi"
*** 2. removes the quotes
set abc def ghi
*** 3. removes all after the last space, and the trailing spaces
set abc def
*** Search all variables beginning with abc def