Batch- Script - Итерация через аргументы
У меня есть пакетный script с несколькими аргументами. Я читаю общее количество их, а затем запускаю цикл for следующим образом:
@echo off
setlocal enabledelayedexpansion
set argCount=0
for %%x in (%*) do set /A argCount+=1
echo Number of processed arguments: %argCount%
set /a counter=0
for /l %%x in (1, 1, %argCount%) do (
set /a counter=!counter!+1 )
Теперь я хочу использовать текущую переменную (x
или counter
) для доступа к входным аргументам. Я думаю aobut что-то вроде этого:
REM Access to %1
echo %(!counter!)
В идеальном мире эта строка должна распечатать мой первый аргумент командной строки, но, очевидно, это не так. Я знаю, что я делаю что-то не так с оператором %
, но есть ли у меня доступ к таким аргументам?
//edit: просто чтобы все было ясно - проблема в том, что %(!counter!)
предоставляет мне значение переменной counter
. Значение для counter=2
дает мне 2
, а не содержание %2
.
Ответы
Ответ 1
здесь один из способов доступа ко второму (например,) аргументу (это может быть введено для цикла /l ):
@echo off
setlocal enableDelayedExpansion
set /a counter=2
call echo %%!counter!
endlocal
так:
setlocal enableDelayedExpansion
set /a counter=0
for /l %%x in (1, 1, %argCount%) do (
set /a counter=!counter!+1
call echo %%!counter!
)
endlocal
Ответ 2
@echo off
setlocal enabledelayedexpansion
set argCount=0
for %%x in (%*) do (
set /A argCount+=1
set "argVec[!argCount!]=%%~x"
)
echo Number of processed arguments: %argCount%
for /L %%i in (1,1,%argCount%) do echo %%i- "!argVec[%%i]!"
Например:
C:> test One "This is | the & second one" Third
Number of processed arguments: 3
1- "One"
2- "This is | the & second one"
3- "Third"
Другой:
C:> test One Two Three Four Five Six Seven Eight Nine Ten Eleven Twelve etc...
Number of processed arguments: 13
1- "One"
2- "Two"
3- "Three"
4- "Four"
5- "Five"
6- "Six"
7- "Seven"
8- "Eight"
9- "Nine"
10- "Ten"
11- "Eleven"
12- "Twelve"
13- "etc..."
Ответ 3
:loop
@echo %1
shift
if not "%~1"=="" goto loop
Ответ 4
@ECHO OFF
SETLOCAL
SET nparms=0
FOR /l %%i IN (1,1,20) DO (
SET myparm=%%i
CALL :setparm %*
IF DEFINED myparm SET nparms=%%i&CALL ECHO Parameter %%i=%%myparm%%
)
ECHO there were %nparms% parameters in %*
GOTO :EOF
:setparm
IF %myparm%==1 SET myparm=%1&GOTO :EOF
shift&SET /a myparm -=1&GOTO setparm
GOTO :eof
Это должно показать, как извлекать случайные параметры по положению.
Ответ 5
Для простой итерации мы не можем просто проверить дополнительные аргументы со значением "shift/1" в конце кода и вернуться назад? Это будет обрабатывать более 10 аргументов, верхний предел не проверен.
:loop
:: Your code using %1
echo %1
:: Check for further batch arguments.
shift /1
IF [%1]==[] (
goto end
) ELSE (
goto loop
)
:end
pause
Ответ 6
Если держать код коротким, а не мудрым, то
for %%x in (%*) do (
echo Hey %%~x
)