使用varible调用变量

时间:2016-08-22 09:30:40

标签: batch-file cmd syntax-error

说我设置了一些变量......

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%依赖{ {1}}和x

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

x2y2

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

使用它来帮助可视化它(我知道,它令人困惑)

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

但显然语法是正确的,因为没有名为' 1x1y' 还有一个额外的 This is all one big variable ______________|______________ | | % x % x % y % y % % | |___| | |___| A letter | A letter | These two are smaller variabels set previously 。请记住,我不能只输入变量名称,因为一些变量总是在变化。我该怎么做..?

如果您感到困惑,请提出问题,如果没有问题,请随时在评论中发帖。

提前致谢。

2 个答案:

答案 0 :(得分:2)

尝试延迟扩展:

@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

答案 1 :(得分:1)

作为delayed expansion所示的this answer的替代方案,您可以使用call,同时将&{34;外部"}的%符号加倍。变量;你需要一个临时变量(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引入了命令解释器的另一个解析阶段,所以......:

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

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

call set "cmp=%x1y1%"

...,因为两个连续%%成为单个文字%;在此阶段,%x%%y%也会得到扩展;最后,在第二个解析阶段之后,"外部"变量变得扩大,因此,命令行变为:

set "cmp=Y"

请注意,如果"外部"变量包含"和/或其他特殊字符,其中使用延迟扩展的方法对所有字符都是健壮的。

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