我试图在3个类别中设置2个变量,总共6个变量,将类别复制三次似乎是一个不好的选择,特别是因为我的真实代码比这大得多,几乎有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
答案 0 :(得分:1)
我玩了一下,你遇到的问题是,在批处理文件中,转义%
的方法是另一种方法。因此,您的代码最终看起来像echo %const%_varA%
,而%var_A%
为空/不存在,您唯一应该得到的是%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!
,将(!
)改为 !
随意提问:)