1

我希望能够获得下一个参数以与当前参数进行比较。因此,当 argVec 等于“--define”时,我想回显下一个参数。我得到的结果是“y”而不是“delivery”。

我的输入是: Cmd version version1 --define delivery

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" (
    @echo !argVec[!y!]!
  )
)
endlocal
4

2 回答 2

1

当我添加@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
于 2015-08-11T21:49:05.490 回答
0

您不能以这种方式“嵌套”延迟扩展:

@echo !argVec[!y!]!

有几种方法可以解决这个问题,这里描述了这些方法;最有效的是:

for %%y in (!y!) do @echo !argVec[%%y]!

编辑评论中说明的附加请求已解决

您可以使用相同的方法来获取值argVec[!y!]并以任何您希望的方式使用它。例如:

for %%y in (!y!) do if "!argVec[%%y]!"=="delivery" echo true1
于 2015-08-11T22:25:36.030 回答