Как использовать переменную среды в качестве имени переменной среды - PullRequest
4 голосов
/ 12 апреля 2010

В поисках решения другой проблемы, связанной с переменными среды / пакетным файлом, я снова столкнулся с проблемой, с которой сталкивался ранее (но не могу вспомнить, как, или даже , если Я решил это).

Допустим, у вас есть два BAT-файла (или один командный файл и командная строка). Как можно передать имя переменной среды другому, чтобы он мог прочитать переменную? Следующий пример не работает:

A.BAT:
  @call b.bat path

B.BAT:
  @echo %%1%

> A.BAT
> %1
> B.BAT path
> %1

Достаточно легко передать имя переменной окружения, но вызываемый объект не может его использовать. (Я не помню, решал ли я или как с этим справлялся в прошлый раз, но я подозреваю, что для этого требовалось неидеальное использование перенаправления временных файлов BAT и их вызова и т.

Есть идеи? Благодаря.

Ответы [ 2 ]

4 голосов
/ 18 апреля 2010

Вы можете использовать маленький трюк, который, к сожалению, нигде не задокументирован:

call echo %%%1%%

Тогда вы можете использовать отложенное расширение:

setlocal enabledelayedexpansion
echo !%1!

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

Другим способом переусердствовать является подпрограмма:

call :meh "echo %%%1%%"

...

:meh
%~1
goto :eof

Все примеры, включая другой ответ, имеют здесь одну общую черту: все они вынуждают cmd дважды оценивать переменные / параметры . В противном случае это не сработает, поскольку первая оценка должна привести к %VariableName%, тогда как второй расширит это до содержимого переменной.

Вы можете найти код также на мой SVN .

2 голосов
/ 13 апреля 2010

B.BAT:

FOR /F "delims=" %%a IN ('echo.%%%1%%') DO set inputvar=%%a
echo %inputvar%

Это один из способов сделать это.

Если все, что вы хотите сделать, это повторить его, вы можете сделать: echo.%%%1%%|more или echo %%%1%%|find /v ""

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...