@ECHO OFF
SETLOCAL
call :test one two three
call :test four five
call :test seven eight nine ten
CALL :test
goto :eof
:test
rem for /f "delims==" %%a in ('set parm 2^>nul') do set "%%a="
set /a parmcnt=0
:testlp
set /a parmcnt+=1
SET "parm%parmcnt%=%1"
SHIFT
IF DEFINED parm%parmcnt% GOTO testlp
SET /a parmcnt-=1
ECHO %parmcnt% parameters
IF %parmcnt% gtr 0 FOR /L %%a IN (1,1,%parmcnt%) DO CALL ECHO %%parm%%a%%
ECHO -------------------
SET parm
ECHO ===================
GOTO :EOF
Мясо здесь - это петля :testlp
.Счетчик параметров parmcnt
увеличивается, а переменная parm...
устанавливается на %1
- первый параметр, затем список параметров - SHIFT
ed, который просто удаляет первый параметр из видимого списка.
если parm...
имеет значение, то попробуйте еще раз, пока все параметры не будут назначены параметру *
уменьшить счетчик параметров (с момента последней попытки присвоения значение ничего не присвоило), поскольку %1
не существует) и отобразить результаты.
Отображение результатов состоит из двух частей.Первый использует трюк разбора (чтобы избежать delayed expansion
, который представляет собой совершенно новую игру с мячом).Сначала синтаксический анализатор заменяет метавариабельную %%a
, поэтому выполняется call echo %%parm1%%
и т. Д. Для 1
до %parmcnt%
.call
в echo
выполняет echo %parm1%
в подоболочке.
Вторая просто показывает все переменные set
, которые начинаются parm
.Обратите внимание, что parm% parmcnt + 1% всегда будет пустым, но могут быть заданы отклонения parm
s от предыдущих вызовов :test
Отсюда и строка remmed-out for ... set parm
, которая очищает все переменные, начиная сparm
.Удаление rem
из этой строки избавит от проблемы случайных переменных, но обратите внимание, что это также очистило бы любое имя переменной, начинающееся с parm
- например, parmlimit
было установлено parmlimit
.