是否可以批量从字符串中获取变量?

时间:2016-03-14 01:37:03

标签: batch-file

我最近开始学习批处理,以便为我一直在玩的游戏编写批量模拟游戏。我想知道是否有可能以某种方式迭代像命名变量(因为我似乎无法找到关于列表的任何内容?)。此外,我不确定我是否可以将标签作为传递的变量调用。

代码示例:

:: Enemy Fortress level.
SET EFORTLVL=4

:: Don't mess with anything below here only the variables above.

:: Enemy Fortress that will be simmmed against. Note this batch sim is  only built to run against one tower, as this is what you should be doing.
SET EFORTRESS1="Foreboding Archway-%EFORTLVL%"
SET EFORTRESS2="Illuminary Blockade-%EFORTLVL%"
SET EFORTRESS3="Tesla Coil-%EFORTLVL%"
SET EFORTRESS4="Minefield-%EFORTLVL%"
SET EFORTRESS5="Forcefield-%EFORTLVL%"

call :sim 1

:sim
SET /a "COUNTER=1"
SETLOCAL enabledelayedexpansion
SET times=!ITERATIONS%1!
ENDLOCAL & SET TIMES=%times%
:whilesim
SETLOCAL enabledelayedexpansion
SET fort=!EFORTRESS%COUNTER%!
ENDLOCAL & SET FORT=%fort%
tuo.exe %DECK0% %ENEMY% surge random -v efort %FORT% yfort %YFORTRESSES% climb %TIMES% >> %PATH%\WarDefClimbData%DECK0%.txt
SET /a "COUNTER=COUNTER+1"
if %COUNTER% leq 5 GOTO :whilesim else GOTO :eof

我在控制台上获得该行的结果:

解决: 我想要做的是从一个变量中获取一个值,该变量包含与所讨论的变量相关的字符串名称。 (例如,当for循环通过1时我想获得EFORTRESS1值,2我想要EFORTRESS2值等)。

E:\Programs\Tyrant Unleashed Optimizer>tuo.exe oconzer "VetDecks" surge random -v efort EFORTRESS1 yfort "Inspiring Altar #2" climb ITERATIONS1  1>>"e:\Programs\Tyrant Unleashed Optimizer\BatchSimResults"WarDefClimbDataoconzer.txt
Error: unrecognized fortress EFORTRESS1

现在我理解为什么它说错误,我不明白为什么它没有从FORT中包含的字符串中获取值。

分辨 得到一个无限循环,迭代变量没有更新。

1 个答案:

答案 0 :(得分:0)

:sim
SETLOCAL ENABLEDELAYEDEXPANSION
SET "FORT=!EFORTRESS%1!"
ENDLOCAL&SET "fort=%fort%"
SET TIMES=ITERATIONS%2
SET LABEL=%3

问题是获取(变量的内容)的内容,通常称为“间接”。

这可能是最简单的方法。它使用setlocal enabledelayedexpansioncmd置于delayedexpansion模式,其中<{1}}在其内容之后被评估

缺点是使用!var!调用必须,这会建立一个本地环境。 loacl环境最终必须关闭(你不能继续打开更多),那时,对环境的所有更改都将被丢弃,并在执行setlocal时恢复到其状态。

setlocal使用解析技巧将更改传输出endlocal&...括号。

至于其他问题 - 是的,你可以setlocal/endlocal一个变量(并且变量的内容不需要有前导冒号)。例如,很有可能使用goto,并提供goto somewhere%1作为参数。文本%1将简单地添加到值somewhere

BTW - 您似乎正在更改%1。这是一个好主意。 path是包含path - 分隔的目录列表的变量,如果在当前目录中调用该可执行文件,则会搜索可执行文件。最好独自留下。 ;tmp(指向临时目录)和temp以及datetime以及random(当前日期)也是如此,时间,随机数和当前目录)