String 批处理文件:如何获取变量';使用变量';的名称已存储在字符串中

String 批处理文件:如何获取变量';使用变量';的名称已存储在字符串中,string,variables,batch-file,command-prompt,String,Variables,Batch File,Command Prompt,1) 快速示例: set a="Hello" set d="a" 现在,如何使用变量d的值来获取“a”的值?例如,变量名可能由用户使用提示输入,或者变量名可能已发送到函数 这些想法都不管用: set e=%%d%% set e=%%%d%%% set e=set e=%%d%% %e% 经过一个小时的头脑风暴和谷歌搜索,我终于想出了这个主意,但它似乎太复杂和笨拙了——真的没有其他/更简单的方法吗 set a="Hello" set b="Good day" set c="Good nig

1) 快速示例:

set a="Hello"
set d="a"
现在,如何使用变量
d
的值来获取“a”的值?例如,变量名可能由用户使用提示输入,或者变量名可能已发送到函数

这些想法都不管用:

set e=%%d%%

set e=%%%d%%%

set e=set e=%%d%%
%e%
经过一个小时的头脑风暴和谷歌搜索,我终于想出了这个主意,但它似乎太复杂和笨拙了——真的没有其他/更简单的方法吗

set a="Hello"
set b="Good day"
set c="Good night"

set /p d="Give me a variable name"

call :GetVarVal %%%d%%% "e"

REM This now gives the correct value:
echo %e%

goto :eof

:GetVarVal
  set "%~2=%~1"
goto :eof
2) 同样,类似的,有没有更好的方法来实现这一点(理想情况下没有自定义函数):


谢谢

如果我没弄错的话,这个叫做“延迟扩展”的技巧应该会奏效:

SETLOCAL ENABLEDELAYEDEXPANSION
SET a=Hello
SET b=a
ECHO This is the value of a: !%b%!
SETLOCAL DISABLEDELAYEDEXPANSION

检查它的工作方式,例如不使用延迟扩展(保留感叹号):


输出:

Hello!
第二部分

这很简单: 当你打字时

SET VarName=VarValue
然后,SET函数会得到一个类似“VarName=VarValue”的字符串-无论您是否在其中使用标记,以下命令都会执行相同的操作:

SET VarName=VarValue
SET "VarName=VarValue"
因此,现在思考一下,我们必须使用什么工具来构建字符串,我们想出了使用以下方法的想法:

SET "Name=VarName"
SET "%VarName%=VarValue"
Echo %Varname%

迟到总比不迟到好-玩得开心

谢谢!我同意恩多罗的回答,因为这更符合我的要求,而且显然会保留感叹号——我确实需要它来应对。但是知道延迟展开法也很好。谢谢。没想到,;避免子例程:)谢谢!我认为这是最接近我所希望的答案。批处理脚本很奇怪。这是我以前使用过的方法。通常作为
调用set myvar=%%%othervar%%%%
按名称获取值
SET VarName=VarValue
SET VarName=VarValue
SET "VarName=VarValue"
SET "Name=VarName"
SET "%VarName%=VarValue"
Echo %Varname%