В графическом интерфейсе:

WORK_HOME=D:\work
LOG_HOME=%WORK_HOME%\logs
FOO_LOG_HOME=%LOG_HOME%\foo

В командной строке:

echo %LOG_HOME%
D:\work\logs

но

echo %FOO_LOG_HOME%
%LOG_HOME%\foo

Единственное отличие состоит в том, что переменная, используемая в% FOO_LOG_HOME%, использует другую переменную (% LOG_HOME%), которая также использует другую переменную (% WORK_HOME%), тогда как% LOG_HOME% использует переменную, для которой установлено буквальное значение (% WORK_HOME%).

Есть ли способ преодолеть это ограничение?

1 ответ1

2

Обычно Windows обрабатывает переменные среды при входе в алфавитный порядок. Любые переменные, вложенные в правую часть, будут расширены, если они уже установлены. Если не установлено, ссылка на вложенную переменную, скорее всего, будет сохранена "как есть", дополненной знаками процента.

Так как %WORK_HOME% довольно далеко вниз по алфавиту, он не определяется, когда обрабатываются эти другие переменные.

Единственный известный мне обходной путь - использовать имена переменных в алфавитном порядке в порядке их расширения.

В Windows 7, похоже, есть некоторая попытка улучшить это, но она не настолько надежна, чтобы доверять:

>REG QUERY HKEY_CURRENT_USER\Environment | FINDSTR AUSR
    AUSRA    REG_SZ    alpha
    AUSRB    REG_EXPAND_SZ    bravo %AUSRA%
    AUSRC    REG_EXPAND_SZ    charlie %AUSRB%
    AUSRD    REG_EXPAND_SZ    delta %AUSRC%
    AUSRI    REG_EXPAND_SZ    india %AUSRJ%
    AUSRJ    REG_EXPAND_SZ    juliet %AUSRK%
    AUSRK    REG_EXPAND_SZ    kilo %AUSRL%
    AUSRL    REG_SZ    lima

>SET AU
AUSRA=alpha
AUSRB=bravo alpha
AUSRC=charlie bravo alpha
AUSRD=delta charlie bravo alpha
AUSRI=india %AUSRJ%
AUSRJ=juliet %AUSRK%
AUSRK=kilo lima
AUSRL=lima

>ver

Microsoft Windows [Version 6.1.7601]

>

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .