4

在寻求另一个与环境变量/批处理文件相关的问题的解决方案时,我再次遇到了我之前访问过的问题(但我一生都不记得是如何解决的,或者即使解决了它)。

假设您有两个 BAT 文件(或一个批处理文件和命令行)。如何将环境变量名称传递给另一个,以便它可以读取变量?以下示例不起作用:

A.BAT:
  @call b.bat path

B.BAT:
  @echo %%1%

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

传递环境变量名称很容易,但被调用者似乎无法使用它。(我不记得上次出现时我是否或如何处理这个问题,但我怀疑它需要重定向临时 BAT 文件并调用它们等不太理想的用途。)

有任何想法吗?谢谢。

4

2 回答 2

4

您可以使用一个小技巧,不幸的是没有记录:

call echo %%%1%%

然后你可以使用延迟扩展:

setlocal enabledelayedexpansion
echo !%1!

延迟扩展在这里有帮助,主要是因为它对变量使用其他分隔符并在运行命令之前直接评估它们,而通常评估可能与正常参数扩展发生冲突。

另一种过度的方法是子程序:

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

...

:meh
%~1
goto :eof

所有示例,包括另一个答案,在这里都有一个共同点:它们都强制cmd对变量/参数进行两次评估。否则它将不起作用,因为第一次评估必须产生%VariableName%,而第二次评估会将其扩展到变量的内容。

您也可以在我的 SVN上找到代码。

于 2010-04-18T08:58:21.313 回答
2

B.BAT:

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

这是一种方法。

如果您只想回显它,您可以执行以下操作:echo.%%%1%%|moreecho %%%1%%|find /v ""

于 2010-04-12T22:11:37.643 回答