あなたの質問には2つの答えがあります:
1-最初の問題は、IF %i% ...
コマンドでi変数の値が変更されないことです(set /a i+=1
コマンドは変数を正しくインクリメントしますが)。これを解決する方法はsetlocal EnableDelayedExpansion
、最初にコマンドを含め、次のようにパーセント記号でiを囲むことですIF !i! ...
:(以前の回答)。ただし、Batch の配列変数は同じ名前の単純な変数とは異なることに注意する必要があります(両方が同時に存在する可能性があります)。そのため、配列要素は常に添字で記述する必要があり、配列全体を処理する方法はありません。単一の操作。詳細については、このトピックを参照してください。
プログラムでは、配列の要素を単純な変数に転送する必要があります。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%
アントニオ