变量共享?批量命令

variable sharing? Batch CMD

我正在尝试在 3 个类别中设置 2 个变量,总共 6 个变量,将类别复制 3 次似乎是一个糟糕的选择,尤其是因为我的实际代码比这大得多,几乎有 10 个类别,每个类别有 30 个变量.

首先我问要设置哪个类别的变量(常量),然后要求设置该类别中的两个变量。

很好,直到我想对组合变量做些什么。

@echo off
cls

:start

cls
echo which variable do you want to set?
echo (1),(2),(3)
choice /c 123 /n
if ERRORLEVEL 3 goto :3
if ERRORLEVEL 2 goto :2
if ERRORLEVEL 1 goto :1

:1
set const=one
goto :wizard

:2
set const=two
goto :wizard

:3
set const=three
goto :wizard

:wizard
set /p %const%_varA= set %const% variableA: 
set /p %const%_varB= set %const% variableB: 

:: this line is the problem
echo %%const%_varA%
echo %%const%_varB%
:: 
echo.
pause
goto :filewrite

echo.

:filewrite
echo one varA %one_varA%
echo one varB %one_varB%
echo two varA %two_varA%
echo two varB %two_varB%
echo three varA %three_varA%
echo three varB %three_varB%

pause
goto :start

我试了一下,你遇到的问题是在批处理文件中转义 % 的方法是另一种方法。所以你的代码最终看起来像 echo %const%_varA% 并且 %var_A% 是 empty/does 不存在,你唯一应该得到的是 %const 作为输出。

幸运的是,有一种方法可以让另一个角色进入游戏来防止这种情况发生。在第一行下添加 setlocal EnableDelayedExpansion 将使变量可以使用感叹号访问。这通常用于访问封闭括号中的变量,但对于这个非常有用:

@echo off
setlocal EnableDelayedExpansion
set const=three
set %const%_varA=foo
echo Without exclamationmarks: %%const%_varA%
echo With exclamationmarks   : !%const%_varA!
pause

是一个说明问题的小例子。
上面一行是您当前拥有但未使用的内容。然而,较低的使用上面解释的延迟扩展。
意思:首先(%)计算出%const%的值,换行到echo [...] !three_varA!after(!)来整件事!

欢迎提问:)