如何将9个以上的参数传递给批处理文件

时间:2014-02-11 06:37:34

标签: batch-file

如何将超过9个参数传递给bach文件 我尝试了另一个问题 How do you utilize more than 9 arguments when calling a label in a CMD batch-script? 但不适合我。

我试图在批处理中保留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,.....等值以及第10,11,12号......参数值

请帮忙!

11 个答案:

答案 0 :(得分:11)

将前九个参数保存在一个变量中。然后调用多次调用,然后使用其余部分:

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

答案 1 :(得分:3)

这是一个简单的答案: shift是键,然后循环值并将它们分配给变量。 设置计数器以指示每个参数是哪个变量。

示例将字母表添加到批处理文件中,并将它们设置为arg1,arg2等变量。

batchfile test.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以及结果如何:

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

答案 2 :(得分:1)

:: 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,并计算一次。

不幸的是,您发布的代码似乎难以理解,因此实际使用这些值 - 这取决于您。

答案 3 :(得分:1)

这是一个更简单的解决方案,假设您只想将值传递给另一个程序。此示例允许最多传递27个参数以压缩...

@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开头的行使用命令行中的后9个参数构建环境变量ZipArgs。 “for”行使用SHIFT命令丢弃前9个参数,使下一个9“前置”。最后一行执行zip传递给它的汇编参数值。

你可以通过添加代码来检查命令行上的参数数量并采取适当的行动来使问题复杂化,但这对我来说就好了。

答案 4 :(得分:0)

您可以通过一次添加一个参数来减少错误。这样,如果您必须在中间添加一个新参数或者取出一个参数,则不需要对其余参数重新编号:它只是两行更改。希望您的参数中没有空格,但这是另一个故事。

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

答案 5 :(得分:0)

盆地解决方案应该有效。要解决问题中的代码问题:您不能只将多个命令放在一行中,并且不能在另一个命令的参数中使用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将成为第七个参数。

如果您需要更多参数,可以根据需要重复此操作:

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%

答案 6 :(得分:0)

@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

答案 7 :(得分:0)

我的替代方案允许您跳过任意数量的参数并且不需要转移

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

答案 8 :(得分:0)

使用%*。请记住,参数的最大数量为255。Command Line arguments (Parameters)

正在寻找如何将任意数量的参数传递给可执行文件的人:

@ECHO OFF
SET "EXECUTABLE=C:\PATH\TO\MY\EXECUTABLE.EXE"
CALL %EXECUTABLE% %*

回答问题(openurl.bat):

@ECHO OFF
SETLOCAL EnableDelayedExpansion

SET URL=
SET /A BASECONCATENATED=0
FOR %%A IN (%*) DO (
    SET PARAM=%%A
    SET PARAM=!PARAM:"=!

    IF !BASECONCATENATED! EQU 0 (
        SET "URL=!URL!!PARAM!^?"
        SET /A BASECONCATENATED=1
    ) ELSE (
        SET "URL=!URL!!PARAM!^&"
    ) 
)

SET URL=!URL:~0,-1!

CALL "%SYSTEMDRIVE%\Program Files\Internet Explorer\iexplore.exe" "!URL!"

REM EXAMPLE cmd.exe "openurl.bat" http://www.example.com/addPerson.php "firstName=Juan" "lastName=Cerezo" "hobby1=Coding" "hobby2=Learning" "hobby3=Play Videogames"

答案 9 :(得分:0)

您可以使用shift命令,该命令shift将参数退后1步,例如%9将存储在%8中,而%8将被存储存储在%7等中,因此如果发生这种情况,则在第9 个参数中有一个空间用于第10 个参数,如果可以的话,下面是一个示例:

@echo off
set arg1=%~1
set arg2=%~2
set arg3=%~3
set arg4=%~4
set arg5=%~5
set arg6=%~6
set arg7=%~7
set arg8=%~8
set arg9=%~9
shift
set arg10=%~9
shift
set arg11=%~9
shift
set arg12=%~9

,而不是使用%~1,而使用%arg1%等,并使用第10 ,11 th ,12 th < / sup>参数,您将使用%arg10%%arg11%%arg12%

答案 10 :(得分:0)

在参数示例中使用*进行处理:

@ECHO OFF
SETLOCAL DISABLEDELAYEDEXPANSION

CALL testLIMIT.bat 3 4 2 1 2 3 4 5 3 2 1 2 3 4 5 6 5 4 3 2 1 2 3 4 5 6 7 6 5 4 3 2 1 A Star * is Born twice * now

ECHO HOME
Pause
exit
@ECHO OFF
SETLOCAL EnableDelayedExpansion

REM :: Used to define the Array Index values and Range
set _I=0

REM :: The Core piece in recieving Large numbers of Parameters.
REM :: Processes all Parameters. Tested to over 2500 Parameters.

Set StarTest=0
FOR %%a in (%*) DO (
    IF EXIST "%%~a" Call :StarTest
    IF NOT EXIST "%%~a" (
    CALL Set /a _I+=1
    CALL Set "arg[!_I!]=%%a"
    CALL Set StarTest=0
    )
)


REM :: Loops through the Array to display Parameter Values.

FOR /L %%a in (1,1,!_I!) DO (
ECHO !arg[%%a]!
)

echo %_I% Arguments received.
Pause
GOTO :EOF

:StarTest
IF %StarTest% GTR 0 GOTO :EOF
Set /a StarTest+=1
Set /a _I+=1
Set "arg[!_I!]=*"
GOTO :EOF

使用Shift处理参数完全不需要,更不用说凌乱了。

以下方法类似于Marcels Answer,将处理大量参数,而无需知道将接收多少个参数。

它使用带有*通配符的基本For循环来处理所有标记并将它们分配给数组,还为文件接收到的启用处理量的参数赋值。


@ECHO OFF
SETLOCAL EnableDelayedExpansion

REM :: Used to define the Array Index values and Range
set _I=0

REM :: The Core piece in recieving Large numbers of Parameters.
REM :: Processes all Parameters. Tested to over 2500 Parameters.

FOR %%a in (%*) DO (
Set /a _I+=1
Set "arg[!_I!]=%%a"
)

REM :: Loops through the Array to display Parameter Values. Modify as needed to Process Parameters.

FOR /L %%a in (1,1,!_I!) DO (
ECHO !arg[%%a]!
)

echo %_I% Arguments received.
Pause
GOTO :EOF