如何在批处理文件中的%%中使用%%?我知道这有点困惑,点击进入



我知道这个问题有点令人困惑。 这是我的剧本。(简易版(

我已经设置了这些变量

p1 = 1
p2 = 0
p3 = 1

它一直在继续。 我想显示所有这些 P 值的列表。然后 我设置了一个变量"i">

set /a i = 0
:loop
set /a i = %i% + 1
echo P%i% = %p%i%%
goto loop

但后来我意识到 %p%i%% 不起作用... 它不会转到 %p1% 并显示"1", 它只是向我显示 %p1%。在我的完整剧本中,它向我展示了一些疯狂的东西......那么谁能在这里帮助我??多谢!!

两种简单的方法。 首先是使用延迟扩展。 首先用%i%展开 i,然后用表达式展开!p1!

或者使用CALL再次解析一行。
第一次解析后call echo P%i% = %%p%i%%%行如下所示call echo P1 = %p1%第二个分析将%p1%扩展到内容。

setlocal EnableDelayedExpansion
set p1=1
set p2=0
set p3=1
set /a i = 0
:loop
set /a i = %i% + 1
echo P%i% = !p%i%!
call echo P%i% = %%p%i%%%
if %i% == 3 exit /b
goto loop

或使用 for 循环的另一种解决方案

for /L %%i in (1 1 3) do (
echo P%%i = !p%%i!
)

除了回答 jeb 不使用延迟扩展的解决方案之外,我还提供了另外两种解决方案:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "MyP1=1"
set "MyP2=0"
set "MyP3=5"
set "Count=0"
for /F "tokens=1* delims==" %%I in ('set MyP 2^>nul') do echo Variable %%I has value %%J & set /A Count+=1
echo Variables count is: %Count%
echo/
set "Index=1"
:Loop
if not defined MyP%Index% goto ExitLoop
set /A Value=MyP%Index%
echo Variable MyP%Index% has value %Value%
set /A Index+=1
goto Loop
:ExitLoop
set /A Index-=1
echo Variables count is: %Count%
endlocal
echo/
pause

数字不确定的环境变量全部以字符串MyP开头。第一种方法在后台的单独命令进程中运行set MyP,该进程输出所有以MyP开头的环境变量,其值按字母顺序排序,即输出针对此批处理代码:

MyP1=1
MyP2=0
MyP3=5

此输出由FOR逐行处理,将每行拆分为两个子字符串,因为delims==第一个子字符串是分配给循环变量I的环境变量的名称,而分配给下一个循环变量的行中第一个等号之后的所有内容J根据 ASCII 表,这是环境变量的值,因为tokens=1*

输出环境变量的名称及其值时,计算以MyP开头的变量数,这也在FOR循环之后输出。

对于第一个解决方案,环境变量的数量不得连续增加。

第二种解决方案使用不带FOR的循环。此循环要求环境变量的名称中有一个递增的数字。如果名称中不再有当前索引号的环境变量,则循环退出。

当前环境变量的值Value使用算术表达式分配给环境变量,因为在这种情况下,算术表达式中的字符串(如MyP1(被解释为环境变量的名称,其值应转换为整数以计算表达式。算术表达式的整数结果将转换回字符串,并分配给留给等号的环境变量。

关于为什么在命令行上使用"set var = text"后没有带有"echo %var%"的字符串输出的答案?可能有助于理解此处使用的环境变量使用技术。

要了解使用的命令及其工作原理,请打开命令提示符窗口,在那里执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。

  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • if /?
  • pause /?
  • setlocal /?

另请参阅使用 Windows 批处理文件的单行包含多个命令&了解FOR命令行上使用的运算符,以避免需要命令块。

相关内容

最新更新