Batch file 如何将环境变量用作环境变量名称

Batch file 如何将环境变量用作环境变量名称,batch-file,environment-variables,argument-passing,Batch File,Environment Variables,Argument Passing,在我寻求另一个环境变量/批处理文件相关问题的解决方案时,我再次遇到了一个我以前遇到过的问题(但我一辈子都记不起是如何解决的,甚至记不起是否解决了) 假设您有两个BAT文件(或一个批处理文件和命令行)。一个如何将环境变量名传递给另一个,以便它可以读取该变量?以下示例不起作用: A.BAT: @call b.bat path B.BAT: @echo %%1% > A.BAT > %1 > B.BAT path > %1 传递环境变量名很容易,但被调用方似乎无法

在我寻求另一个环境变量/批处理文件相关问题的解决方案时,我再次遇到了一个我以前遇到过的问题(但我一辈子都记不起是如何解决的,甚至记不起是否解决了)

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

A.BAT:
  @call b.bat path

B.BAT:
  @echo %%1%

> A.BAT
> %1
> B.BAT path
> %1
传递环境变量名很容易,但被调用方似乎无法使用它。(我不记得上一次它出现时我是否或如何处理它,但我怀疑它需要重定向临时BAT文件并调用它们之类的不太理想的用途。)

有什么想法吗?谢谢。

B.BAT:

FOR /F "delims=" %%a IN ('echo.%%%1%%') DO set inputvar=%%a
echo %inputvar%
这是一种方法


如果您只想回显它,您可以这样做:
echo.%%%1%%|更多
echo%%%1%%| find/v”“

您可以使用一个小技巧,但遗憾的是,这个技巧没有任何文档记录:

call echo %%%1%%
然后可以使用延迟扩展:

setlocal enabledelayedexpansion
echo !%1!
延迟展开在这里很有帮助,因为它对变量使用其他分隔符,并在运行命令之前直接对其求值,而通常求值可能与正常的参数展开冲突

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

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

...

:meh
%~1
goto :eof
所有示例,包括另一个答案,在这里都有一个共同点:它们都强制
cmd
对变量/参数求值两次。否则它将不起作用,因为第一次求值必须生成
%VariableName%
,而第二次求值将扩展到变量的内容


你也可以在上面找到代码。

我试过了,但它所做的只是打印一个双百分比:
%%
。什么是打印%%?Windows版本?FOR/F将仅在NT(2000?)上工作。
FOR/F
自Windows NT 4起可用。此外,该方法在变量内容中使用空格时失败。我自由地编辑它以使其正常工作。是的,使用DELIMS标志修复了它。谢谢。啊,我忘了启用延迟扩展。因为我们不知道版本要求,所以我试着把更多的精力放在老派的东西上。很好,两种方法都有效。事实上,你给了我一个想法,希望在旧的DOS模式下也能工作。我现在就测试一下。@Syn:你在DOS中需要这个吗?到现在为止,我已经有好几年没有接触DOS了,我怀疑还有很多解决方案需要在那里运行。我现在使用的不是DOS,但我很确定我最后一次遇到这个问题是在DOS中。不管怎样,它都不起作用。我试图让批处理文件调用它自己(因为DOS不能调用标签),但它只是打印了一个带有百分比符号的变量;它没有扩张。哦,好吧。(现在,如果我能记住我正在做的哪个项目需要这个…)对,我相信使用临时文件可能会奏效。(虽然我尽量避免使用临时文件。)我想如果我找到需要这个的DOS,我会咬紧牙关使用临时文件。谢谢