Как передать более 9 параметров в пакетный файл

Как я могу передать более девяти параметров в файл Бах.
Я попробовал еще один вопрос SO как использовать более 9 аргументов при вызове метки в пакетном сценарии CMD? но не работает на меня.

Я пытаюсь дать значения времени выполнения url, хранящиеся внутри пакета.
Моя партия:

start iexplore http://example.com?firstName=%1^&middleName=%2^&lastName=%3^&country=%4^&address=%5^&address2=%6^&address3=%7^&mobileNo=%8^&landlineNo=%9SHIFT SHIFT SHIFT SHIFT SHIFT SHIFT SHIFT SHIFT ^&emailAddress=%1^&hobby1=%2^&hobby2=%3^&hobby3=%4^&hobby4=%5^&hobby5=%6

при использовании это принимая предыдущие значения %1, %2, %3,.....etc и значения 10th,11th, 12th.... параметры

пожалуйста, помогите !

8 ответов


сохраните первые девять args в переменной. Затем вызовите shift несколько раз и только затем используйте остальные:

set "v=http://example.com?firstName=%1&middleName=%2&lastName=%3&country=%4&address=%5&address2=%6&address3=%7&mobileNo=%8&landlineNo=%9"
shift
shift
shift
shift
shift
shift
shift
shift
shift
start iexplore %v%&emailAddress=%1&hobby1=%2&hobby2=%3&hobby3=%4&hobby4=%5&hobby5=%6

вот простой ответ: shift-это ключ, а затем значения цикла и назначают их переменным. Setup counter, чтобы указать, какая переменная является каждым параметром.

пример получает алфавиты в пакетный файл и устанавливает их в переменные arg1, arg2 и т. д.

тест batchfile.bat пример:

@echo off

set /a counter=1
:ARGLBEG
if "%1"=="" goto ARGLEND
set arg%counter%=%1
goto ARGNEXT 

:ARGNEXT
shift
set /a counter=%counter%+1
goto ARGLBEG

:ARGLEND
echo "List values."
set arg

echo "Just one value, arg9."
echo %arg9%
goto end

:end

как использовать тест.летучая мышь и как результаты выглядят:

test.bat A B c d e F G H i J k L M N O P Q R S t u v x y z

результаты.

"List values."
arg1=A
arg10=J
arg11=k
arg12=L
arg13=M
arg14=N
arg15=O
arg16=P
arg17=Q
arg18=R
arg19=S
arg2=B
arg20=t
arg21=u
arg22=v
arg23=x
arg24=y
arg25=z
arg3=c
arg4=d
arg5=e
arg6=F
arg7=G
arg8=H
arg9=i
"Just one value, arg9."
i

:: set PARAMn and count parameters
SET /a paramcount=1
:paramloop
SET "param%paramcount%=%~1"
IF DEFINED param%paramcount% SET /a paramcount+=1&shift&GOTO paramloop
SET /a paramcount -=1

эта процедура должна установить param1..paramn для вас с графом.

к сожалению, Ваш опубликованный код кажется неразборчивым, поэтому на самом деле использование значений - это зависит от вас.


вот еще более простое решение, которое предполагает, что вы просто хотите передать значения другой программе. Этот пример позволяет передавать до 27 параметров в zip...

@echo OFF
set ZipArgs=%1 %2 %3 %4 %5 %6 %7 %8 %9
for /L %%i in (0,1,8) do @shift
set ZipArgs=%ZipArgs% %1 %2 %3 %4 %5 %6 %7 %8 %9
for /L %%i in (0,1,8) do @shift
set ZipArgs=%ZipArgs% %1 %2 %3 %4 %5 %6 %7 %8 %9
"C:\Program Files\WinZip\wzzip.exe" %ZipArgs%

первая строка просто отключает Эхо каждой строки на экране. Строки, которые начинаются с set ZipArgs создайте переменную окружения ZipArgs со следующими 9 параметрами из командной строки. Строки " для "используют команду SHIFT, чтобы отбросить первые 9 параметров, выводя следующие 9"вперед". Последний строка выполняет zip, передавая ей собранные значения параметров.

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


вы можете сделать его менее подверженным ошибкам, добавляя по одному параметру за раз. Таким образом, если вам нужно добавить новый в середине или вынуть один параметр, вам не нужно перенумеровать остальные: это будет просто изменение двух строк. Надеюсь, в ваших параметрах нет пробелов, но это другая история.

set v=http://example.com
rem first parameter is ?: subsequent ones are &
set sep=?
call :add firstName %1
shift
call :add middleName %1
shift
call :add lastName %1
shift
...
start iexplore "%v%"
goto :eof
:add
    rem add a parameter
    set v=%v%%sep%%1=%2
    set sep=&
    goto :eof

решение тазиком должно работать. Чтобы решить проблему с кодом в вопросе: вы не можете просто поместить несколько команд в одну строку, и вы не можете использовать команду shift в середине аргументов другой команды. В основном вы должны разделить все, как показано в другом ответе. Чтобы сделать его более лаконичным и читаемым, я бы сделал это так:

set "ieargs=http://example.com?firstName=%1^&middleName=%2^&lastName=%3^&country=%4^&address=%5^&address2=%6^&address3=%7^&mobileNo=%8^&landlineNo=%9"

@for /L %%i in (0,1,8) do shift
set "ieargs=%ieargs%^&emailAddress=%1^&hobby1=%2^&hobby2=%3^&hobby3=%4^&hobby4=%5^&hobby5=%6"

start iexplore %ieargs%

первые девять аргументов сохраняются в строке. Затем он делает петли и сдвигается девять раз, так что %1 будет аргумент thenth.

Если вам нужно еще больше аргументов, вы можете просто повторить это так часто, как вам нужно:

set "ieargs=http://example.com?firstName=%1^&middleName=%2^&lastName=%3^&country=%4^&address=%5^&address2=%6^&address3=%7^&mobileNo=%8^&landlineNo=%9"

@for /L %%i in (0,1,8) do shift
set "ieargs=%ieargs%^&emailAddress=%1^&hobby1=%2^&hobby2=%3^&hobby3=%4^&hobby4=%5^&hobby5=%6^&hobby6=%7^&hobby7=%8^&hobby8=%9"

@for /L %%i in (0,1,8) do shift
set "ieargs=%ieargs%^&hobby9=%1^&hobby10=%2^&hobby11=%3^&hobby12=%4"

start iexplore %ieargs%

@echo off
set /a a=0
:9
set CustomVar%a%=%1
@shift
set /a a=%a%+1
if %a%==300 goto :8
goto :9
:8
@echo on

Моя альтернатива позволяет пропустить любое количество аргументов и не требует сдвига

SETLOCAL
  SET /a SKIP=3
  CALL :SkipAndExec SKIP THESE VARS echo numbers: 1 2 3 4 5 6 7 8 9 0 11 12 13 14
ENDLOCAL
GOTO:eof

:SkipAndExec
SETLOCAL
SET /a n=0
FOR %arg IN (%*) DO (
  SET /a n=n+1
  IF %n% GT %SKIP% (
    :: here you could compose a string to use later
    SET _CMD_=%_CMD_% %arg%
  )
)
:: here you could call another function and pass in %_CMD_%
CALL %_CMD_%
GOTO:eof

Если вы выполните этот скрипт, он напечатает:

numbers: 1 2 3 4 5 6 7 8 9 0 11 12 13 14