使用变量调用变量
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%
的名称经常变化,因为x
和y
总是在变化而x%x%y%y%
是依赖 x
和 y
.
现在我想使用 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
以防止有毒字符并且不在变量值中包含潜在的尾随空格。
说我设置了几个变量...
set x=1
set y=1
set x1y2=J
set x%x%y%y%=Y
在我使用cmd创建的游戏中,变量x%x%y%y%
的名称经常变化,因为x
和y
总是在变化而x%x%y%y%
是依赖 x
和 y
.
现在我想使用 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
以防止有毒字符并且不在变量值中包含潜在的尾随空格。