5

我想使用传递给批处理文件的前 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
4

3 回答 3

3

for命令应该给你你想要的:

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

来自for( for /?) 的帮助:


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


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

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

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

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

于 2012-09-07T13:32:38.777 回答
2

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

以下改进支持带引号的特殊字符,如&and |,但参数分隔符仍然是个问题。

@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

结束编辑

不幸的是,一个真正通用的解决方案需要一个从 3 开始解析每个参数的 GOTO 循环。只要所有引号都是平衡的并且所有特殊字符都被引用,下面的解决方案应该可以工作。

@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%

要消除所有限制需要采取严厉措施 - 请参阅如何接收最奇怪的命令行参数?

于 2012-09-07T15:40:50.727 回答
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.
于 2012-09-07T12:26:58.580 回答