如何将额外的额外参数传递给批处理文件?

时间:2012-09-07 11:04:10

标签: batch-file command-line-arguments

我想使用传递给批处理文件的前2个参数,然后将其他所有内容附加到批处理文件中执行的命令。

有一种简单的方法吗?

// batch file
command -Duser=%1 -Dpwd=%2 {? how to pass all remaining arguments on the command line}

批处理将像这样执行

batch.bat USR PWD -Dargument1=1 -Dargument2=2

实际上,我希望执行以下内容

command -Duser=USR -Dpwd=PWD -Dargument1=1 -Dargument2=2

3 个答案:

答案 0 :(得分:3)

for命令可以为您提供所需内容:

for /f "tokens=1,2*" %%a in ("%*") do echo command -Duser=%%a -Dpwd=%%b %%c

来自forfor /?)的帮助:


FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k 将解析myfile.txt中的每一行,忽略以。开头的行 一个分号,将第2和第3个标记从每一行传递给for 正文,用逗号和/或空格分隔的标记。 注意到 body语句引用%i来获取第二个标记,%j来获取 第三个令牌,%k在第三个令牌后获得所有剩余的令牌。 For 包含空格的文件名,您需要引用文件名 双引号。为了以这种方式使用双引号,你也是 需要使用usebackq选项,否则双引号将是 解释为定义要解析的文字字符串。


所以在我的解决方案中,%%a具有传递给脚本的第一个参数的值,%%b第二个参数的值,以及%%c剩余的参数。

当我从命令提示符运行batch.bat USR PWD -Dargument1=1 -Dargument2=2时,我得到:

command -Duser=USR -Dpwd=PWD -Dargument1=1 -Dargument2=2

删除echo之后的do以使用参数调用命令。

答案 1 :(得分:2)

Patrick Cuff的解决方案通常有效,但如果前两个参数中的任何一个包含引号空格或特殊字符,它将失败。如果参数用空格以外的其他内容分隔,它也将失败。 FOR / F分隔符可以扩展为包含, ;=,但如果参数包含任何引用的分隔符,它将失败。

以下改进支持引用的特殊字符,如&|,但参数分隔符仍然存在问题。

@echo off
setlocal enableDelayedExpansion
set args=%*
for /f "tokens=1,2*" %%a in ("!args!") do (
  endlocal
  echo arg1=%%a  arg2=%%b  remainder=%%c
)

编辑 以下是使用USEBACKQ进行更简单的修改

for /f "usebackq tokens=1,2*" %%a in ('%*') do echo arg1=%%a  arg2=%%b  remainder=%%c

结束编辑

不幸的是,一个真正通用的解决方案需要一个GOTO循环来解析3上的每个参数。只要所有报价均衡并且引用所有特殊字符,下面的解决方案就应该有效。

@echo off
setlocal
set "args="
:parseArgs
set args=%args% %3
shift /3
if "%~3" neq "" goto :parseArgs
if (%3) equ ("") goto :parseArgs
echo arg1=%1  arg2=%2  remainder=%args%

要消除所有限制,需要采取严厉措施 - 请参阅How to receive even the strangest command line parameters?

答案 2 :(得分:1)

这可能就是你想要的

C:>help shift
Changes the position of replaceable parameters in a batch file.

SHIFT [/n]

If Command Extensions are enabled the SHIFT command supports
the /n switch which tells the command to start shifting at the
nth argument, where n may be between zero and eight.  For example:

    SHIFT /2

would shift %3 to %2, %4 to %3, etc. and leave %0 and %1 unaffected.