我不确定我是否理解脚本示例最后一行中的评估顺序,即使您的口头解释也是如此。但是,我想我至少可以通过简单的示例向您展示如何实现您想要的,并且您将弄清楚如何在您的情况下应用该技术。
基本上,您需要在这里使用两种扩展:立即(或%
扩展)和延迟。
批处理文件中存在适当的延迟扩展,必须首先启用(通常使用 command SETLOCAL EnableDelayedExpansion
),然后使用!
而不是%
用于变量评估。考虑以下示例:
SET ind=1
SET line%ind%=ABC
SETLOCAL EnableDelayedExpansion
ECHO !line%ind%!
ENDLOCAL
在上面的示例中,创建了两个变量,ind
并且line1
. 第二个名称部分是使用第一个变量构造的。当您将值设置为此类变量时,不需要延迟扩展,因为不需要评估名称,即赋值的左侧部分。但是当它确实需要评估时,您需要使用延迟扩展。ECHO
上面脚本中的命令是这样工作的:
虽然这种延迟扩展通常是首选,但在上面的示例中,您也可以使用CALL
-expansion 实现相同的效果。这是使用CALL
-expansion 重写的相同示例脚本:
SET ind=1
SET line%ind%=ABC
CALL ECHO %%line%ind%%%
基本上,%
一路都有扩展,但不同的部分在不同的时间进行评估。以下是第二个示例的延迟评估的工作原理:
扩展速度较慢,这CALL
可能特别体现在循环中。!
另一方面,扩展具有一些含义,特别是由于该命令SETLOCAL
用于启用语法这一事实。在我对另一个问题的回答中有更多关于这个主题的内容。