Как передать более 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