Batch file 如何在批处理文件中使用%%inside%%?我知道';It’有点困惑,点击进入

Batch file 如何在批处理文件中使用%%inside%%?我知道';It’有点困惑,点击进入,batch-file,command-line,command-prompt,Batch File,Command Line,Command Prompt,我知道这个问题有点让人困惑。 这是我的剧本。(简易版) 我已经设置了这些变量 p1 = 1 p2 = 0 p3 = 1 而且还继续下去。 我想显示所有这些P值的列表。那么, 我设置了一个变量“I” 但后来我意识到%p%I%%不起作用了。。。 它不会转到%p1%并显示“1”, 它只显示了%p1%。在我的完整剧本中,它向我展示了一些疯狂的东西。。。有人能帮我吗??非常感谢 两个简单的方法。 第一种是使用延迟扩展。 首先用%i%展开i,然后再展开表达式!p1 或者使用CALL再次解析一行。 第一次解

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

我已经设置了这些变量

p1 = 1
p2 = 0
p3 = 1
而且还继续下去。 我想显示所有这些P值的列表。那么, 我设置了一个变量“I”

但后来我意识到%p%I%%不起作用了。。。 它不会转到%p1%并显示“1”, 它只显示了%p1%。在我的完整剧本中,它向我展示了一些疯狂的东西。。。有人能帮我吗??非常感谢

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

或者使用
CALL
再次解析一行。
第一次解析后的行
调用echo P%i%%=%%P%i%%
如下所示
呼叫回显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!
)

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

@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
该输出是为逐行处理的,它将每一行分成两个子字符串,因为
delims==,第一个子字符串是分配给循环变量
I
的环境变量的名称,以及分配给下一个循环变量
J
由于
tokens=1*
,因此根据该值是环境变量的值

环境变量的名称及其值是通过计算以
MyP
开头的变量数量来输出的,该变量也是在FOR循环之后输出的

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

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

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

关于的答案可能有助于理解此处使用的环境变量使用技术

要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读为每个命令显示的所有帮助页面

  • echo/?
  • endlocal/?
  • 获取/?
  • goto/?
  • 如果/?
  • 暂停/?
  • setlocal/?

另请参见
运算符在命令行上使用的说明,以避免使用命令块。

使用powershell并使您的生活更轻松?您是如何设置变量的
set p1=1
无法按预期工作,也无法创建名为
%p1%
的变量我很想尝试powershell,但我不知道如何在其中编写脚本。。也许我会试试someday@LưuVĩnhPhúc但听起来很不寻常,
set/a p1=1
不会包含空格。不,我只需要一个名为“p1”的变量。这个“call”功能很好,但很抱歉我不理解“!p1!”。我知道如何表示“call echo”,但我还需要将这个变量与另一个变量进行比较。比如“IF%p%I%%eq 0”
MyP1=1
MyP2=0
MyP3=5