批处理文件。变量中的变量

批处理文件。变量中的变量

如何在变量中使用变量?这段代码:

set newvar=%var%var2%%

不起作用。那么该怎么办?没有它,我无法编写程序。

答案1

我同意 AFH 的观点;您需要让 CMD “双重解析”该set语句。但我找到了一个可以做到这一点的临时方法,它不需要临时批处理文件(或查看每个变量以找到所需的变量)。它使用一个子例程和一个称为延迟变量扩展的技巧。通过添加

setlocal enabledelayedexpansion

批处理文件开头附近的某个位置。延迟变量扩展的目的有些复杂 – 有关详细信息,请参阅SET /?SETLOCAL /?– 但重要的是要知道,除了之外,它还允许您使用 引用变量。!variable_name!%variable_name%

因此我们开始吧:

@echo off
setlocal enabledelayedexpansion
set var1=red
set var2=orange
set var3=yellow
set A=2
call :kludge var%A%
echo Newvar is %newvar%.
goto :eof

:kludge
set newvar=!%1!
exit /b

当我们跳转到 时:kludge,语句首先转换为set newvar=!var2! (因为 %1,子程序的第一个参数是var2),然后set newvar=orange(就像语句是 一样set newvar=%var2%)。因此newvar设置为orange

顺便说一句,goto :eofexit /b是可以互换的。如果从子程序中调用(即,通过语句到达的某个地方call),它们会导致返回到调用者。否则,它们就像跳转到批处理文件的末尾,导致批处理作业终止,而不会破坏父级交互式命令提示符。

答案2

相对较慢的方法。CALL 命令提供了额外的变量扩展级别。外部变量名周围的百分比被加倍,以延迟扩展,直到内部变量扩展完毕。

@echo off
setlocal
set "var1=value"
set "var2=1"
call set "newvar=%%var%var2%%%"

更好的方法是使用延迟扩展。必须先使用 SETLOCAL ENABLEDELAYEDEXPANSION 启用它。百分比内的变量在解析行时扩展。感叹号内的变量在解析之后、执行行之前扩展。

@echo off
setlocal enableDelayedExpansion
set "var1=value"
set "var2=1"
set "newvar=!var%var2%!"

答案3

一般来说,我会尽量避免这种情况。虽然有可能,但性能不佳,而且也不太容易阅读——基本上你必须解析命令的输出set

set index=9
set var9=Goal

echo %var9%
for /F "usebackq tokens=1* delims==" %I in (`set`) do if "%I" == "var%index%" set result=%J
echo %result%

相关内容