当我添加@echo off
到脚本顶部并运行它时,我得到以下输出:
1- version1
2- --define
3- delivery
2
version1
3
--define
y
4
delivery
如果我理解正确,问题出y
在倒数第三行。
你得到的原因y
是因为@echo !argVec[!y!]!
. 这标记为@echo
, !argVec[!
, y
, !]!
,这意味着“回显!argVec[!
变量的内容,然后回y
显,然后回显]
变量的内容。由于您没有!argVec[!
变量或]
变量,因此这简化为“回显y
”。
为了解决这个问题,这个 SO answer有很多很好的信息。出于您的目的,该帖子的重要部分是:
要在 FOR/IF 内的索引更改时获取元素的值,请将元素括在双百分比中,并在命令前加上call
.
这是您的脚本的一个版本,我认为它可以满足您的要求:
@echo off
set inputArg=%*
setlocal enabledelayedexpansion
set Count=0
for %%x in (%inputArg%) do (
set /A Count+=1
set "argVec[!Count!]=%%~x"
)
for /L %%i in (1,1,%Count%) do echo %%i- !argVec[%%i]!
for /L %%x in (1,1,%Count%) do (
set /A y=%%x+1
@echo !y!
@echo !argVec[%%x]!
if "!argVec[%%x]!"=="--define" (
@call echo %%argVec[!y!]%%
)
)
endlocal
打印:
1- version1
2- --define
3- delivery
2
version1
3
--define
delivery
4
delivery
我意识到回显到屏幕可能不是您的最终目标,因此当您修改脚本以执行您真正想要的操作时,请记住在整个“数组”周围使用双百分比,在索引周围使用感叹号,并在前面你的命令与call
.
例如,如果要添加比较条件,则将 的内容设置argVec[y]
为 a 中的临时变量call
,然后在 中使用临时变量if
,如下所示:
@echo off
set inputArg=%*
setlocal enabledelayedexpansion
set Count=0
for %%x in (%inputArg%) do (
set /A Count+=1
set "argVec[!Count!]=%%~x"
)
for /L %%i in (1,1,%Count%) do echo %%i- !argVec[%%i]!
for /L %%x in (1,1,%Count%) do (
set /A y=%%x+1
@echo !y!
@echo !argVec[%%x]!
@call set tmpvar=%%argVec[!y!]%%
if "!tmpvar!"=="--define" (
echo "found it"
)
)
endlocal
最新输出:
1- version1
2- --define
3- delivery
2
version1
"found it"
3
--define
4
delivery