Чтение параметров с использованием переменных - PullRequest
1 голос
/ 21 сентября 2019

У меня проблема с чтением параметров, которые были добавлены в подпрограмму.Эти параметры, конечно, можно прочитать следующим образом.

call :test one two three

:test
    echo %1
    echo %2
    echo %3
exit /b

Но я бы хотел прочитать их в цикле, пока они заполнены.

Для этого я сделал следующее, но у меня это не работает должным образом.С моим ограниченным пониманием всего этого.Я бы обычно запрашивал переменную на 3 точки.Итак,% p%.

call :test one two three

:test
    set /a p=1

    :while
    if [%...] NEQ [] (
        echo %...
        set /a p=p+1
    goto :while
    )
exit /b

Может кто-нибудь сказать мне, как я это решаю?

Ответы [ 2 ]

0 голосов
/ 22 сентября 2019

Спасибо @Stephan.Это работает так, как я хочу:

:test
for %%A in (%*) do (
    echo %%A
)
exit /b
0 голосов
/ 21 сентября 2019
@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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...