使用变量调用变量

Calling a variable using a varible

说我设置了几个变量...

set x=1
set y=1
set x1y2=J
set x%x%y%y%=Y

在我使用cmd创建的游戏中,变量x%x%y%y%的名称经常变化,因为xy总是在变化而x%x%y%y%是依赖 xy.

现在我想使用 if 语句来检查 x2y2 的值。

if %x%x%y%y%%=J echo Yay

开头和结尾的两个百分号是调用变量,但是里面的百分号也是调用变量

用这个来帮助形象化(我知道,这很混乱)

  This is all one big variable
 ______________|______________
|                             |
%    x   % x %   y   % y %    %
     |   |___|   |   |___|
A letter   |  A letter |
These two are smaller variabels set previously

但显然语法是正确的,因为没有名为'1x1y'的变量并且多了一个%。请记住,我不能只输入变量名,因为有些变量总是在变化。我该怎么办..?

如果您感到困惑,请提出问题,如果缺少任何内容,请随时 post 在评论中补充。

提前致谢。

尝试延迟扩展:

@echo off
set x=1
set y=1
set x1y2=J
set x%x%y%y%=Y

setlocal enableDelayedExpansion

if "!x%x%y%y%!" equ "Y" echo yep

作为 delayed expansion illustrated by 的替代方案,您可以使用 call,同时将 "outer" 变量的 % 符号加倍;您将需要一个临时变量 (cmp) 然后:

set "x=1"
set "y=1"
set "x1y2=J"
set "x%x%y%y%=Y"

call set "cmp=%%x%x%y%y%%%"

if "%cmp%"=="J" echo Yay

发生了什么,它是如何工作的?
好吧,call引入了命令解释器的另一个解析阶段,所以...:[=​​26=]

call set "cmp=%%x%x%y%y%%%"

...,在第一个解析阶段之后,变为...:

call set "cmp=%x1y1%"

...,因为两个连续的%%变成了一个字面值%%x%%y% 也在该阶段扩展;最后,在第二个解析阶段之后,"outer" 变量被扩展,因此,命令行变为:

set "cmp=Y"

请注意,如果 "outer" 变量包含 " and/or 其他特殊字符,此方法可能会失败,其中使用延迟扩展的方法对所有这些字符都很稳健。


顺便说一下,我建议通常使用语法 set "VAR=Value" 而不是 set VR=Value 以防止有毒字符并且不在变量值中包含潜在的尾随空格。