对于你的问题,我有两个答案:
1-第一个问题是在IF %i% ...
命令中 i 变量的值不会改变(尽管set /a i+=1
命令会正确地增加变量),解决它的方法是setlocal EnableDelayedExpansion
在开头包含命令并将 i 括在百分号中:(IF !i! ...
如在以前的答案)。但是,您必须注意,批处理中的数组变量与同名的简单变量不同(它们都可以同时存在),因此数组元素必须始终使用下标编写,并且无法在批处理中处理整个数组一次操作。有关详细信息,请参阅此主题。
在您的程序中,您必须将candidates
数组的元素转换为一个简单的变量,在下面的示例中具有相同的名称(只是为了说明我的观点):
@echo off
setlocal EnableDelayedExpansion
SET subject=%1
set count=%2
set candidates=""
set /a i=0
set /a c=0
FOR %%A IN (%*) DO (
ECHO %%A
set /a i+=1
IF !i! geq 2 (
set /a c+=1
set candidates[!c!]=%%A
)
)
SET /a count_actual=(%i%-3)
SET /a count_expected=%count%
echo %count_expected%
echo %count_actual%
echo %subject%
REM Transfer "candidates" array elements into "candidates" simple variable:
set candidates=
FOR /L %%i IN (1,1,%c%) do (
set candidates=!candidates! !candidates[%%i]!
)
REM Show "candidates" simple variable:
echo %candidates%
请注意,在批处理文件中,您可以在大多数命令中插入逗号、分号和等号作为分隔符,而不是空格。但是,SET /A
命令在这方面有其他规则,因此必须省略分号。
2-独立于上面解释的数组管理,这是我使用列表而不是数组来解决您的问题的方法:
@echo off
SET subject=%1
shift
set count=%1
set candidates=
set lastArg=
set i=0
:nextArg
shift
if "%1" equ "" goto endArgv
set /a i+=1
set candidates=!candidates! !lastArg!
set lastArg=%1
goto nextArg
:endArgv
SET /a count_actual=i-3, count_expected=count
echo %count_expected%
echo %count_actual%
echo %subject%
echo %candidates%
安东尼奥