Batch file 如何在不知道变量名称的情况下批量查找变量的值

Batch file 如何在不知道变量名称的情况下批量查找变量的值,batch-file,Batch File,我正在做一个简单的批处理游戏,我试图找出如何使用一个未知名称的变量的值。示例: 我不知道var1变量的名称或值,因为它是在游戏的早期自动生成的。 我只知道第三行:set var3=var2 我需要我的游戏在if语句中使用“var1”的值,如最后一行所示。 我该怎么做 set var1=5 set var2=var1 set var3=var2 if ??? EQU something something... 经过几次修改,我终于想出了一个真正的防弹方案(方法5) 在方法5中,如果var3被一

我正在做一个简单的批处理游戏,我试图找出如何使用一个未知名称的变量的值。示例:
我不知道
var1
变量的名称或值,因为它是在游戏的早期自动生成的。
我只知道第三行:
set var3=var2

我需要我的游戏在if语句中使用“var1”的值,如最后一行所示。
我该怎么做

set var1=5
set var2=var1
set var3=var2
if ??? EQU something something...

经过几次修改,我终于想出了一个真正的防弹方案(方法5)

在方法5中,如果var3被一个包含
的变量名替换,那么您将不得不转义一些引号。但是,如果您足够成熟,能够在变量名中加引号,那么您已经知道如何做:-)


如果您不知道变量名,如何检查
var1
?不,没有什么意义。请记住,程序使用变量名只是作为区分变量的一种方式。它只关心名称是否相同或不同。如果您对变量名一无所知,则无法查找变量名。您是是的,我不知道“var1”的名字,但我知道“var3”的值与“var1”的名称相同,所以我的问题是:有什么“技巧”可以达到“var1”的值吗“从那里开始?OP想知道如何串行取消引用变量值,从已知的var3开始,到var1结束。有点像C中的双指针,以一种非常松散的方式。var2指向var1,var3指向var2。您知道需要多少解引用吗?对于
var3
它总是两个,还是会有所不同?
@echo off
setlocal

set var1=5
set var2=var1
set var3=var2

::method 1 - Without using delayed expansion. (this is relatively slow and unsafe)
::           the initial expansion uses 1 % and no CALL
::           the 2nd expansion uses CALL and 2 %%
::           the 3rd expansion uses CALL and 4 %%%%
::           each additional expansion would require another CALL and doubled percents
call call set "test=%%%%%%%var3%%%%%%%
if "%test%"=="5" echo Method 1 works: Value of "unknown var"=%test%

::The remaining methods use delayed expansion. They are safer and faster.
setlocal enableDelayedExpansion

::method 2 - Using normal and delayed expansion and a temp variable.
::           Almost always works, but can fail in rare cases where variable
::           name contains "
set "test=!%var3%!"
if "!%test%!"=="5" echo Method 2 works: Value of "unknown var"=!%test%!

::method 3 - Using normal and delayed expansion without using any temp variable.
::           This works for sensible variable names, but fails if name contains
::           * or ?. Also can fail if variable name contains "
for %%A in ("!%var3%!") do if "!%%~A!"=="5" echo Method 3 works: Value of "unknown var"=!%%~A!

::method 4 - Using normal and delayed expansion without using any temp variable.
::           This almost always works, but can fail in rare cases where variable
::           name contains "
for /f "eol==delims=" %%A in ("!%var3%!") do if "!%%A!"=="5" echo Method 4 works: Value of "unknown var"=!%%A!

::method 5 - Using delayed expansion without using any temp variable.
::           This always works!
for /f "eol==delims=" %%A in ("!var3!") do for /f "eol==delims=" %%B in ("!%%A!") do if "!%%B!"=="5" echo Method 5 works: Value of "unknown var"=!%%B!