【发布时间】:2016-07-02 13:42:29
【问题描述】:
::Compare with available valid arguments
FOR /L %%i IN (1,1,!avArgc!) DO (
FOR /L %%j IN (1,1,!argc!) DO (
IF !avArgv[%%i]!==!argv[%%j]! (
echo Match: !avArgv[%%i]!
::Check the next option
SET /A nextArg=%%j
SET /A nextArg+=1
FOR /L %%n IN (!nextArg!,1,!nextArg!) DO (
IF !nextArg! LEQ !argc! (
echo next arg: !argv[%%n]!
call :CheckSubOption
)
)
)
)
)
在我上面的代码示例中 - 我如何获取像 %%j 这样的 for 循环变量并在像这样 %%j++ 这样的 for 循环内自增?我目前的解决方案(这很混乱,我不喜欢它)是创建一个新变量并将其设置为 %%j 的值,然后递增该变量并开始使用该变量,如下所示:
::Check the next option
SET /A nextArg=%%j
SET /A nextArg+=1
【问题讨论】:
-
%%j使用for循环解析。这意味着,在循环内部它已经被解析,所以它是一个固定值,而不是你可以改变的变量。恐怕,你必须忍受那个乱七八糟的新变量。 -
SET /A nextArg=%%j,不需要/a。它不应该受到伤害,但应该避免。另外,我怀疑这是为了我们的缘故而放入的,但是对于::Check the next option,永远不要在代码块中放入::命令,只是rem。可能有一些方法可以让您通过使用引用变量调用外部标签来更改它,但老实说,它甚至比添加新变量更混乱。 -
感谢斯蒂芬回答了我的问题。 @Arescet
::和rem是可互换的,因此可以在代码块中使用它们。代码可以正常工作,我的::添加 cmets 的方式加上::更容易发现。 -
@ShadyProgrammer no,
rem是实际命令,::是具有无效起始字符的标签。 robvanderwoude.com/comments.php、ss64.com/nt/rem.html 和 stackoverflow.com/questions/12407800/… 显示了::的问题,尽管它更快,但将它放在代码块中可能非常不可预测。
标签: batch-file scripting